4

重複の可能性:
ODBCに渡す前に入力データをエスケープする正しい方法

ODBCクエリのクエリで発生するエラーは次のとおりです。

(pos: 72 '...M = 'Owen O'^Donavon' AND...') - syntax error

そして私がそれを脱出しようとすると:

(pos: 73 '... = 'Owen O\'^Donavon' AND...') - syntax error

^はそれが壊れているところを意味します

私は以下を試しました:

NAM = '".$var."'

そしてこれも:

NAM = '".mysql_escape_string($var)."'

それから私は必死になりました

NAM = \"".$var."\"

ここで、$ varは、'を含む任意の名前です。

クエリ全体が必要な場合:

UPDATE TABLE SET COLUMN1 = 'ERR' WHERE COLUMN_NAM = '".mysql_escape_string($var)."' AND COLUMN7 = 0");

見積もりを適切にエスケープする方法を知っている人はいますか?

4

1 に答える 1

4

MySQL文字列リテラル(一重引用符で区切られている)内に一重引用符を含めるには、2つの一重引用符文字を使用します。例えば

'I don''t like it'

事実上、MySQLがそれを解析すると、2つの一重引用符が表示され、文字列リテラルの「終わり」ではなく、リテラル内の1つの一重引用符として解釈されます。

しかし(あなたが知っているように)そこに一重引用符が1つしかない場合、MySQLパーサーはそれにヒッシーフィットします。この例を考えてみましょう。

'I don't like it' 

MySQLパーサーが認識するのは、長さが5文字の文字列リテラルであり、を含み'I don'ます。次に、MySQLは、そのリテラルの後に、解析する必要のあるトークンがいくつか続くと見なしますt like it。パーサーは、それを文字列リテラルの一部として認識しません。その前の単一引用符は、文字列リテラルの終わりを示しました。

そのため、MySQLパーサーは、t like it本来あるべきものの先頭または末尾を作成できません。これらのトークンに続く一重引用符は、別の文字列リテラルの始まりと見なされます。(つまり、そこに表示される内容について非常に賢く、MySQLが理解できるものをなんとか取得できる可能性があります...そしてそれはおそらくさらに悪いことです。)

(注:この問題はODBCに固有のものではありません。これは、MySQLクエリテキストで文字列リテラルを使用するクライアントに影響します。)


このタイプの問題を回避する1つの方法は、文字列リテラルではなく、クエリテキストでバインド変数を使用することです。(しかし、MySQLで起こっていることは、とにかくエスケープすることです。MySQLサーバーに送信されるのは(いわば舞台裏で)文字列リテラルです。

クエリテキストに文字列リテラルを含める必要がある場合があり、回避策としてバインド変数を使用する必要はありません。したがって、一重引用符で囲まれた文字列リテラル内で一重引用符を「エスケープ」する方法を知っておくとよいでしょう。

于 2012-12-21T23:14:50.917 に答える