mysql_real_escape_stringは、1種類の引用のみを逃れます
-
28-10-2019 - |
質問
私のサーバーはPHP 5.2.17を実行しており、PHP.iniファイルで魔法の引用を無効にしています。私はいくつかのような文字列の配列を持っています
abcd "efg" hij'k lmnop'q
次のコードを使用してMySQLデータベースに挿入するためにそれらを逃がしています
foreach($array as &$data) {
mysql_real_escape_string($data);
}
その後、SQLを構築しています
$sql='INSERT INTO table VALUES('.
'"'.$array[0].'", '.
'"'.$array[1].'", '.
'"'.$array[2].'")';
クエリを実行しようとするとエラーが発生します。エラーが発生したときに$ SQL変数を出力すると、MySQL_Real_ESCAPE_STRINGが単一の引用符または二重引用符のいずれかを逃れているようです。
私の$ SQL変数が、上記のように二重引用符で列値を持つ単一の引用符を使用して作成された場合、単一の引用は逃げられますが、二重引用符は逃げません。
$ sql変数が二重引用符を使用して作成され、列の値が単一の引用符であるように引用符を切り替えると、二重引用符のみが逃げます。
誰もが何がうまくいかないのかを理解できますか?
**アップデート
Matchuはそれを理解しました。コードを次のように変更しましたが、機能します。
foreach($row as &$data) {
$data = mysql_real_escape_string($data);
}
解決
mysql_real_escape_string
します いいえ 使用しても、文字列オブジェクト自体を変更する &
価値ではなく参照で通過します。代わりに、文字列の脱出されたコピーを返します。関数を実行することはできません。その出力を変数に割り当てる必要があります。
私は今テストできる場所ではありませんが ジョー これはトリックを行うと言います:
$data = mysql_real_escape_string($data);
他のヒント
より良い解決策は、使用することです PDOは声明を作成しました 代わりは:
$stmt = $dbh->prepare("INSERT INTO table VALUES(?, ?, ?)");
$stmt->execute($array);
繰り返される呼び出しはありません mysql_real_escape_string()
, 、繰り返し、(IMO)クリーンコード。
Matchuは正しい、mysql_real_escape_stringは逃げ出した文字列を返します。試す...
foreach($array as &$data) {
$data = mysql_real_escape_string( $data );
}
幸運を。