0

次のようにまとめたい mysql クエリがあります:$sql = $dbh->prepare("SELECT * FROM log");次に、次のように実行し$sql->execute();ます: foreach($dbh->query($sql) as $row)。foreach ループに実行しようとすると、ログイン フォームがデータベースから読み込まれなくなります。dbh->prepare ステートメントを削除すると問題なく動作しますが、SQL インジェクションをブロックしたかったのです。ありがとう。

4

2 に答える 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

  1. queryメソッドは、入力した SQL コードを直接実行します
  2. prepareSQLコードを「準備」します。このプロセスは、SQL コード内のすべてのパラメーターを実際の値に置き換えます (つまりSELECT * FROM users WHERE user_id=:user_id、 になりSELECT * FROM users WHERE user_id=1ます)。executeしたがって、準備済みステートメントを使用する場合は、コードが mysql に送信されるようにする必要があります。
于 2013-06-18T21:04:01.373 に答える