0

我有一个 mysql 查询,我想这样总结:$sql = $dbh->prepare("SELECT * FROM log");然后,我像这样执行它:$sql->execute();,现在我的问题是为什么我不能将它用于:foreach($dbh->query($sql) as $row)循环?当我试图让它进入 foreach 循环时,登录表单不再从数据库中读取。如果我删除 dbh->prepare 语句,它工作得很好,但我想阻止它的 SQL 注入。谢谢。

4

2 回答 2

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. 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 回答
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 回答