2016-06-16 17 views
0

予約された文字が含まれているために構文エラーの原因となる文字が含まれているクエリがあり、文字列を正しくエスケープする方法を理解するために戦っています。予約された文字をエスケープするWHERE ... MATCH ... AGAINST ...ステートメント?

SELECT * FROM `products` 
WHERE MATCH (code, description) 
AGAINST (UPPER(+("intel"*) +("cpu"*)) IN BOOLEAN MODE) 

しかし、私はこのクエリを実行すると、私は次のエラーを取得する:

クエリがある

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') +("cpu"*))) IN BOOLEAN MODE)' at line 1

オーケー、それはそのAGAINST示すだろうと、それは)を好きではないので、細かいですしかし、それは(まだ)ではありません。だから私はバックスラッシュでエスケープしようとしましたが、それでも同じエラーがスローされます。

PHPで準備文を使って試してみると、検索文字列+("intel"*) +("cpu"*)がステートメントにバインドされています。だから、それはそれがエスケープする方法はバックスラッシュではない、または何か他のものがないようです。

だから私はmysqlescapestringのためにPHPのドキュメントを見ていたし、私はそれことを見た:「次の文字の前に付加するバックスラッシュ:\のX00、\ nは、\ rを、\、」、 "。と\ X1A"

単一引用符と二重引用符をエスケープする必要があると私はこれを実行しようとしましたが、それはちょうど同じ構文エラーがスローされますが、二重引用符で、すなわち to use near '\"intel\"*\)...

私はそれが最善だろうと理解していることを示す

準備されたステートメントを使用して、これが問題を解決するが、私はここで間違っていることを理解したい、そして私が行ったようにAGAINST節の中でこのような文字列をどのようにエスケープできるかを知りたいここに。

誰かが私がこれで間違っている場所を示唆することができれば、それは非常に高く評価されます。ありがとうございました。

+0

正確にAGAINST()のパラメータになりたいですか? – e4c5

+0

@ e4c5お返事ありがとうございます。私がこの質問を理解するなら、 'INTEL'と' CPU'で始まる言葉を含むもの。前述のように、これは動作しますが、私がPHPで準備している場合にのみ、エスケープしていますが、エスケープされていることとその動作を正確には分かりません。私は準備されたステートメントに次のパラメータを渡します: '+(" intel "*)+(" cpu "*)' –

答えて

1

まあ、私はこれを解決することができました。

ここで私を助けた答えはanother so questionでした。私が気付いたのは、用意されたステートメントに相対オブジェクトが含まれている場合、それは引用符で囲まれているため、実際にはUPPER(?)UPPER("prepared string")になります。つまり、UPPER(+("intel"*) +("cpu"*))は実際にはUPPER('+("intel"*) +("cpu"*)')です。

だから、結果は次のとおりです。構文エラーなしで作業を行い

SELECT * FROM `product` 
WHERE MATCH (code, description) 
AGAINST (UPPER('+("intel"*) +("cpu"*)') IN BOOLEAN MODE) 

メモ:MySQLで文字列をエスケープする場合は、MySQL uses C escape syntax in stringsに注意する価値があります。

関連する問題