11

私は次のSQLを持っています(実際の問​​題の単純化):

SELECT *
FROM t
WHERE myname LIKE '%{$input}%';

$input をエスケープするにはどうすればよいですか?
quoteInto を使用できません (何かを見逃していない限り)。
として

$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE '%?%'",$input);

くれます

SELECT *
FROM t
WHERE myname LIKE '%'my input'%';

$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?",'%'.$input.'%');

行に何かを教えてくれます:

SELECT *
FROM t
WHERE myname LIKE '\%my input\%';
4

7 に答える 7

16

最後のオプションは、「%」をエスケープすることを経験したことがない私にとってはうまくいきます。したがって、$db->quote('%'.$_GET['query'].'%')出力%queryvalue%

于 2009-04-12T02:28:58.853 に答える
2

SQL レベルで $input の連結を行うことができます。

$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE '%'|| ? ||'%'",$input);

残念ながら、$input にリテラル '%' または '_' 文字を含めることができるようにする場合、これは使用できません。これを回避するには、明示的な LIKE-ESCAPE 文字を指定して、自分でエスケープします。

$inputlike= '%'.preg_replace('[%_=]', '=$0', $input).'%';
$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE ? ESCAPE '='", $inputlike);

(必ずしも「=」である必要はありません。これは、MySQL で指定されていない場合に ESCAPE がデフォルトで「\」になるバグを回避します。)

残念ながら、SQL Server は正規表現のような文字グループを作成するために、'[' 文字も特別なものと見なします。したがって、DB が SQL Server の場合、preg_replace のグループに「[」を含める必要があります。残念ながら、エスケープする必要のない他の DBMS で '[' をエスケープすることは、有効な ANSL SQL ではありません。

于 2009-04-12T00:50:12.303 に答える
1

問題は、LIKE特殊文字をエスケープしたいということです。手動でそれらを置き換えるのは少し汚いですが、解決策がない場合は...

于 2010-01-28T09:10:21.337 に答える
1

それはもっと簡単です:

$table->select()->where("myname LIKE ?", '%'.$input.'%');
于 2011-02-19T08:26:29.470 に答える
1

それは非常に簡単です:

$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?",'%' . $input . '%');

//Will output: SELECT FROM t WHERE myname LIKE '%inputtedvalue%'


$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?",'%' . $input);

//Will output: SELECT FROM t WHERE myname LIKE '%inputtedvalue'


$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?", $input . '%');

//Will output: SELECT FROM t WHERE myname LIKE 'inputtedvalue%'


$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?", $input);

//Will output: SELECT FROM t WHERE myname LIKE 'inputtedvalue'

問題は何ですか?

:)

于 2009-06-25T04:30:09.460 に答える
-1

addcslashes($value, "\000\n\r\'\"\032"); である文字列に対して zf が使用する関数を使用するだけで、zf が使用するのと同じ方法で文字列を置き換えることができます。 (mysql の場合) mysql_real_escape_string を使用します。

いずれにせよ、db quote 関数のいずれも使用しません。

これを行うためのメソッドがdbクラスにあるかどうか疑問に思っていますが、あるべきメソッドはわかりません。

于 2009-04-12T01:41:14.863 に答える