'%'
MySQLクエリテキストのリテラルをエスケープする必要はありません。
クエリが「常に失敗する」と言うときmysql_query
、エラーを返すのは関数の呼び出しですか?SQL例外コードを返しますか、それとも期待する結果セット(行)を返さないだけですか?
デバッグのためにquery
、を呼び出した後、文字列の内容をエコーアウトすることをお勧めしますsprintf
。文字列の内容は次のようになると予想されます。
select user from pcloud_session where id = '2Cq%yo4i-ZrizGGQGQ71eJQ0'
そして、そのSQL構造に問題はありません(id
列が文字データ型に存在しpcloud_session
、文字データ型であると仮定します。idが整数型として定義されている場合でも、そのステートメントは通常例外をスローしません。文字列リテラルは次のようになります。 2の整数値として解釈されます。)
'%'リテラルをsprintfのターゲット形式に含めても問題はありません。また、MySQLクエリテキスト内に「%」リテラルを含めても問題はありません。
(もちろん、関数sid
の呼び出しによって入力されると想定していmysql_real_escape_string
ます。)
query
繰り返しになりますが、sprintfの呼び出しに続いて、の内容をエコーアウトすることをお勧めします。mysql_query
また、他のコードがその文字列の内容をいじっていないことを確認することをお勧めします。これは、関数の引数として渡される実際の文字列です。(mysql_real_query
関数を使用している場合は、正しい長さを渡していることを確認してください。)
アップデート
Oxiは次のように述べています。「SQL例外コードを返さず、期待する結果[セット]を返さないだけです。クエリを出力しました。%を含めて出力します。」
@Oxi
ここに、問題を突き止めるのに役立つ可能性のあるたくさんの質問があります。
mysqlコマンドラインクライアントからそのクエリテキストのテストを実行しましたか?それは期待する行を返しますか?
そのid
列は、(少なくとも)24文字の長さのVARCHAR(またはCHAR)として定義されていますか?列の照合で大文字と小文字が区別されないように設定されていますか、それとも大文字と小文字が区別されますか?
show create table pcloud_session ;
(アプリケーションがデータベースの文字セットエンコーディングと一致しない場合、問題の原因となる可能性がありますが、文字セットの変換で問題を引き起こす文字はありません。)
そのid列に対してLIKE述語を使用してクエリをテストしましたか?
SELECT id, user FROM pcloud_session WHERE id LIKE '2Cq\%yo4i-%' ESCAPE '\\'
ORDER BY id LIMIT 10 ;
SELECT id, user FROM pcloud_session WHERE id LIKE '2Cq%'
ORDER BY id LIMIT 10 ;
1行を期待しているときに、行が返されませんか?返される行が多すぎますか、それとも予想とは異なる行を取得していますか?
id
これは、列の奇妙な値です。最初は、値がbase-64エンコーディングで表されているように見えますが、「%」と「-」の文字が含まれているため、標準のエンコーディングではありません。