1

テーブル名に対して bindvalue を実行することは可能ですか? 私は基本的にそれを拾っていないようです:テーブルを削除して代わりにテーブル名を追加すると、2番目の2つのバインドは正常に機能しますが、これを同じフォームの複数のテーブルに使用したいです。

フォームのテーブルのフィールドは前のクエリの結果から定義されているため、テーブル名はフォームに $table として値として表示され、正しく表示されるため、$table の値をテーブル バインドにポストする必要があります???

try {
    $sql = 'UPDATE :table SET
                archive = :archive
                WHERE id = :id';
    $s = $pdo->prepare($sql);
    $s->bindvalue('table', $_POST['table']);
    $s->bindvalue('archive', $_POST['archive']);
    $s->bindvalue('id', $_POST['id']);
    $s->execute();
}
4

1 に答える 1

0

準備済みステートメントは よりも「少し」多いためsprintf、変数でテーブルを設定するのは意味がありません。

実際の値が設定される前に、準備されたステートメントが DB に渡されます。そのため、DB はクエリに答える方法を探す場合があります。この準備の後、検索される実際の値が設定されます。execute()が呼び出されると、クエリが回答されます。

したがって、「クエリに回答する方法」(私がそう呼んだ) を準備するために、テーブル名は重要な情報です。そのため、変数として渡すことは意味がありません。それがうまくいかない理由でもあります。

したがって、テーブル名を文字列連結する必要があります。

$sql = 'UPDATE '. $table .' SET
            archive = :archive
            WHERE id = :id';

@zerkms が示唆するように、可能なテーブル名をホワイトリストに登録する必要があります。

于 2013-08-11T06:54:09.930 に答える