次のようにまとめたい mysql クエリがあります:$sql = $dbh->prepare("SELECT * FROM log");
次に、次のように実行し$sql->execute();
ます: foreach($dbh->query($sql) as $row)
。foreach ループに実行しようとすると、ログイン フォームがデータベースから読み込まれなくなります。dbh->prepare ステートメントを削除すると問題なく動作しますが、SQL インジェクションをブロックしたかったのです。ありがとう。
質問する
255 次
2 に答える
1
最初に結果を取得
する必要があります (ステートメントを実行した後)。
$rows = $sql->fetchAll();
foreach($rows as $row){
...
}
query()
文字列のみが必要です (SQL クエリ)。しかし、オブジェクトであるの戻り結果を渡していましprepare()
た PDOStatement
。
prepare()
execute()
ではなく、 と連続して使用されquery()
ます。に渡したい入力パラメーターがある場合は、ステートメントを準備するのが理にかなっていますexecute()
。
要するに:
$stm = $dbh->prepare('SELECT...');
$stm->execute();
次と同等です。
$stm = $dbh->query('SELECT...');
送信する入力パラメータがない場合。
于 2013-06-18T20:55:41.950 に答える
1
準備済みステートメントを使用してい$db->prepare($my_sql_query)
ます。準備済みステートメントを使用する場合、通常、いくつかの変数がクエリにバインドされている場合があります。例えば
$my_query = 'SELECT * FROM users WHERE user_id=:user_id'
$prepared_statement = $db->prepare($my_query);
$prepared_statement->bindValue(':user_id', 123);
値をバインドしたら、クエリを実行する必要があります
$prepared_statement->execude();
準備されたステートメントを実行すると、実際の SQL コードが生成され、mysql で実行されます。そして、実行する結果を取得するには
$record = $prepared_statement->fetch(); //if you want to get only one record from the table
$records = $prepared_statement->fetchAll(); // if you want to get multiple records from the table
foreach($records as $row) {
// your code here...
}
を使用している場合は$db->query()
、次のコードで結果を取得できるはずです。
$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
foreach ($db->query($sql) as $row) {
print $row['name'] . "\t";
print $row['color'] . "\t";
print $row['calories'] . "\n";
}
// outputs
// apple red 150
// banana yellow 250
// kiwi brown 75
// lemon yellow 25
// orange orange 300
// pear green 150
// watermelon pink 90
(php.netから取得)
query
メソッドとの間には大きな違いがありますprepare
。
query
メソッドは、入力した SQL コードを直接実行しますprepare
SQLコードを「準備」します。このプロセスは、SQL コード内のすべてのパラメーターを実際の値に置き換えます (つまりSELECT * FROM users WHERE user_id=:user_id
、 になりSELECT * FROM users WHERE user_id=1
ます)。execute
したがって、準備済みステートメントを使用する場合は、コードが mysql に送信されるようにする必要があります。
于 2013-06-18T21:04:01.373 に答える