エスケープは、クエリパラメータを使用するのと同じようにSQLインジェクションの防御に効果的です。
どちらの方法も、一貫して実行しないと効果が低下します。
どちらの方法も、個々の値を保護する場合にのみ役立ちます。 SQL式で。クエリの他の動的な部分はサポートしていません。たとえば、ユーザー指定の列でORDERBYする場合です。クエリパラメータもエスケープ関数もそれを処理しません。
つまり、基本的には、スタイルと個人的な好みの問題です。
私はこれを考えるのでクエリパラメータを好みます:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);
これよりも明確です:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);
これらすべてのオープンクォート/クローズクォートと.
文字列の連結は、クエリパラメータでprepare()を使用するよりも簡単です。
架空のquery()
についてのコメントを再確認してください パラメータ付きの関数。
まず第一に、それは必要ではありません。 prepare()とexecute()を一緒に使用することは、安全なコードを書くための小さな代償であり、単一の関数でそれを行うことを主張することによって、あなたはただ怠惰に聞こえます。 false
を返す関数の戻り値をチェックしないと思います エラーの場合も?
PHPは暗黙的にvarargsをサポートしているため、その価値については、両方を実行するラッパー関数を簡単に作成できます。
function myquery() {
global $pdo;
$params = func_get_args();
$sql = array_shift($params);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt; // so we can fetch(), etc.
}