sql >> データベース >  >> RDS >> Mysql

PDOプリペアドステートメントとバインディングパラメータを理解する

    あなたは最初のケースが安全ではないということは正しいです。ただし、ステートメントの準備には、変数データを使用している場合や、同じクエリを繰り返し実行している場合にのみ価値があることを理解することが重要です。プレーンステートメントを実行している場合変数なし 、あなたは単にこれを行うことができます:

    $sql = "SELECT * from myTable WHERE this_column IS NOT NULL";
    $result = $conn->query($sql);
    

    そして、最終的にPDOStatement PDO::exec()を使用する場合と同じように、操作するオブジェクト 。

    2番目のケースについても、ほぼ正しいです。何が起こっているのかというと、データベースに渡された変数がエスケープされて引用符で囲まれます(PDOStatement::bindParam()の3番目の引数で特に指定しない限り 、ほとんどの場合に問題のない文字列として送信されます。)したがって、不良データが送信されても​​クエリは「失敗」しません。データベースにIDとして存在しなかった有効な番号を渡した場合とまったく同じように動作します。もちろん、いくつかありますエッジケース 正しく準備されたステートメントがあっても、まだ脆弱な場所です。

    また、作業を楽にするために、次のようなプリペアドステートメントを使用して、暗黙のバインディングを実行できます。

    $sql = "SELECT * FROM myTable WHERE id = :id";
    $stmt = $conn->prepare($sql);
    $stmt->execute([":id"=>$id]);
    

    または、このように、名前のないパラメータを使用する場合:

    $sql = "SELECT * FROM myTable WHERE id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->execute([$id]);
    

    当然、私が答えを入力している間、これのほとんどはコメントで説明されました!




    1. psycopg2を使用してpostgresテーブルにデータをインポートする際の値エラー

    2. SQL Serverでマルチステートメントテーブル値関数(MSTVF)を作成する

    3. 存在しない場合は挿入し、存在しない場合はpostgresqlにIDを返します

    4. REGEX \ bがMYSQLで機能しないことに気付いた人はいますか?