何よりもまず:
このアドバイスに従うことがこれまで以上に重要になりました。ext/MySQLは非推奨になり、それを使用するとE_DEPRECATED
が出力されます。 PHP 5.5以降のエラーは、いつかコア言語から完全に削除されます。そうは言っても、以下はすべてのデータベースのすべてのドライバーに適用されます。
この説明の残りの部分では、何らかの理由でMySQLiまたはPDOを使用できないと想定します(のみ ここでの満足のいく理由は、それらが利用できないこと、「それらの使用方法がわからない」は言い訳ではないこと、そしてあなたがext/MySQLを使用することを余儀なくされていることです。新しいドライバーのいずれかを使用できる場合は、プリペアドステートメントを使用できますが、これはいずれも当てはまりません。だから、それを念頭に置いて...
次に、前の回答の何が問題になっているのかを見てみましょう。これは、ユーザー入力のエスケープを中心にしています。 mysql_real_escape_string()
を使用します まったく意味をなさない方法です。これは、単一の文字列リテラルをエスケープするために使用する必要があり、他には何も使用しないでください。数値を効果的にエスケープするために使用することはできません。また、値だけではないSQLの部分をエスケープするために使用することもできません。
次の2つのコードスニペットは、データが何であるか、そして重要なことにそのタイプに応じて、これを行う正しい方法を示しています。
値が文字列(通常はCHAR
)の場合は、次のようになります。 またはVARCHAR
フィールド):
// First create an array of individually escaped values with quotes added
$deds = array();
foreach ($_POST['deductions'] as $ded) {
$deds[] = "'".mysql_real_escape_string($ded)."'";
}
// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);
// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";
しかし、多くの場合、このシナリオでは、値は単純に数値になります。この場合、PHPが正しいデータ型でそれらを表現していることを確認するだけです。これは、文字列に変換されたときに自動的に安全になるためです。クエリで使用:
// First convert the array values to integers
$deds = array();
foreach ($_POST['deductions'] as $ded) {
$deds[] = (int) $ded;
}
// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);
// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";
このコードは明らかにデータが整数型であることを前提としています。(int)
を変更するだけでfloatを簡単に処理できます。 (float)
にキャスト 。
MySQLは値を正しいタイプに変換するため、文字列アプローチを数値にも安全かつ正常に使用できることにも注意してください。ただし、一般的には、クエリ内で正しい型表現を使用してデータを渡す方が適切で効率的です。