1

私はmysqlとphpが初めてで、準備されたステートメントについて何かを明確にしたかったのです。

私が見たすべての例は、テーブル内の実際のデータのパラメータを追加するだけですが、すべてのフィールドをパラメータ化してステートメントを少なくするのは悪い習慣ですか? 例えば

UPDATE ? SET ?=? WHERE ID=?  

ありがとうございました

4

3 に答える 3

1

優れた deceze's answer は文字通りあなたの質問をカバーしていますが、他に言及すべきことがあります。

主要なフレームワークを見てみると、かなり同じように機能する関数... update() が見つかります。

function update($table, $data, $id) {

そのため、このアプローチは一般的に非常に人気があります。
とはいえ、それは間違いであり、見当違いでもあります。

最初は柔軟性がなく、すぐに使用できなくなります。

  • 従来のid以外のフィールド名が必要になったら、
  • より複雑な条件が必要になったら、
  • JOIN ベースの更新が必要になったら、
  • 一部のデータを処理するためにSQL関数(!)を使用する必要がある場合

これらすべてのケースは、最初は小さくてきちんとした機能を肥大化したモンスターにします。

しかし、対策は簡単です。
本当に必要なのはクエリに追加される可能性のあるすべてのデータ型のプレースホルダーです。それでは、SafeMysqlへようこそ- あなたの夢を叶えるライブラリです:

$db->query("UPDATE ?n SET ?u WHERE id=?i", $table, $data, $id);

それはあなたが望むことを正確に行っていますが、適切な方法で行っています。そして、そのような複雑なクエリでも問題はありません:

$data = array('field'=>$value,'field2'=>$value);
$ids  = array(1,2,4);
$sql  = "UPDATE t SET ts=unix_timestamp(), ip=inet_aton(?s),?u WHERE id IN(?a)";
$db->query($sql, $ip, $data, $ids);

"less [SQL] statements"を作成するのではなく、PHP コードの記述を減らしてクエリを安全にすることを目的としていますが、使い慣れた従来の SQL を維持しながら、単に PHP で記述された SQL ダイアレクトである一部のクエリ ビルダーの新しい言語を学習するなどのトレードオフはありません。

于 2013-04-17T11:27:32.407 に答える
0

はい、明らかに読めないからです。値があっても、キー形式でプレースホルダーを使用する方が良いと私は主張します。例えば

UPDATE mytable SET `name`=:fullname WHERE ID=:id
于 2013-04-17T10:13:22.110 に答える