0

値のリスト全体をバインドするのが良い方法かどうか、私はいつも疑問に思っていました。たとえば、次のクエリが必要です。

INSERT INTO messages 
  (thread_id,message,from_id,to_id,to_viewed,notified,from_deleted,to_deleted,created)
  SELECT :threadId,:msg,:fromId,:toId,0,0,0,0,:createdTime FROM messages 
    WHERE thread_id = :threadId AND to_id=:toId LIMIT 1

この場合、これは静的な値であるため、フィールドもバインドする意味がnotifiedありfrom_deletedますto_deleted。新しいメッセージを挿入するときは常に 0 ですか?


質問を変更する必要があります。セキュリティ上の理由から、ユーザーから生成されていないフィールド/値もバインドする理由がないことを知っています。私の場合、 fields をバインドする理由はなくnotifiedfrom_deletedそれらto_deletedは常に 0 であるためです。しかし、私の本当の質問は、他の理由 (キャッシュ) でこれらのフィールドをバインドする必要があるかどうかです。mysql はクエリステートメント全体をキャッシュしますか、それともバインドされたパラメーターのみをキャッシュしますか?

4

1 に答える 1

1

あなたが言うように、外部ソースからの変数のパラメーター (準備されたクエリ) をバインドする必要があるだけです (html 文字、スクリプトも削除する必要があります)。準備されたクエリを実行すると、PDO は引用符を変換して SQL インジェクションを防ぎます。あなた (開発者) は、0 または 1 を検索すること、または静的文字列を検索することさえ安全であることを知っているため、静的変数をクエリに直接入れることができます。あとは、構文的に正しいクエリを作成するだけです。

このクエリを実行して、sequelpro、phpmyadmin、mysql cli、またはその他の SQL ユーティリティ (mysql を実行していると仮定) を使用してテスト行を挿入できます。

INSERT INTO messages 
  (thread_id,message,from_id,to_id,to_viewed,notified,from_deleted,to_deleted,created)
  VALUES (1, 'Blah', 1, 2, 3, 0, 0, 0, '2012-07-21');

PDO の例

try {
    $dbh = new PDO($dsn, $user, $password);
    $sth = $dbh->prepare('SELECT * FROM messages WHERE thread_id = :threadId AND to_id=:toId LIMIT 1');
    $sth->execute(array(':threadId' => $id, ':toId' => $to_id));
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
于 2012-07-21T08:10:59.627 に答える