PDO ->prepare on mysql query won't work


PDO ->prepare on mysql query won't work

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

您正在使用准备好的语句$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->execute();

当你执行准备好的语句时,它会生成实际的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)

方法queryprepare之间有很大的差异:

  1. query方法将直接执行您输入的sql代码
  2. prepare将"准备";SQL代码。此过程将sql代码中的所有参数替换为一些实际值(即SELECT * FROM users WHERE user_id=:user_id将变为SELECT * FROM users WHERE user_id=1)。因此,当你使用准备好的语句时,你需要执行execute以便将代码发送到mysql。

您需要首先获取结果(在执行语句之后):

$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...');