php mysql 文字エスケープの問題
バックグラウンド処理
$name=addslashes($_POST['name']);//転送時一重引用符
を挿入すると、エスケープ記号とともにデータベースに保存されますか?それともエスケープ記号を削除して保存する必要がありますか?
エスケープ記号を使用してデータベースに保存されている場合は、小さな問題が発生します
名前が繰り返されているかどうかを確認したい場合は、$name を比較する必要があります
まだエスケープ $name=addslashes($_POST['name']);
SELECT count(*) AS num FROM talbe WHERE name = $name
num 表示は 0、つまりつまり、同じものは見つかりません。
print SQL ステートメントは SELECT count(*) AS num FROM talbe WHERE name = 'this/'s a apple'
num 値データベースを開いたところ、name フィールドの値が this/'s a apple であることがわかりました。
$name を再度エスケープすると、値が見つかります。 $name は this/. // レコードを見つけるためのリンゴです
つまり、addslashes 関数を 2 回使用します
この問題にどう対処しますか?二度使うのは面倒ではないでしょうか?
-----解決策---------
さらに、Php.ini で magic_quotes_gpc が有効になっている場合、cookie、post、get はデフォルトでラッシュを追加します。たとえば、ユーザーが li'lei をアップロードすると、$_POST['name'] で取得されるのは li'lei になります。次のように SQL に直接接続するだけです:
select * from table where name='li'lei'、ラッシュは必要ありません。
addslashes を指定すると、異常になります。mysql 解析コマンドにも影響するため、addslashes も転送し、結果は本当に異常になります:
addslashes("li' lei" ); li\'lei を生成し、それを SQL に入力します:
select * from table where name='li\'lei'。データベースに入ると、実際には li'lei がもう 1 つ追加されます。
さらに、実際にユーザーによって送信された値を使用したい場合、通常、デフォルトで有効になっているのは php.ini のみの magic_quotes_gpc (get、post、cookie) であるため、ストリップスラッシュはほとんど使用されません。 li'lei などの場合は、stripslashes($_POST['name']); を実行する必要があります。ここでの名前は自動的に追加された li'lei で、削除後は li'lei になります。
strip が使用されていない場合、ページに出力すると、ユーザーには li'lei が表示されます。