PDO - >准备mysql查询将无法正常工作

时间:2013-06-18 20:51:49

标签: php pdo

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

2 个答案:

答案 0 :(得分:1)

您需要先fetch结果(执行语句后):

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

如果您没有要发送的输入参数。

答案 1 :(得分: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();

执行prepared语句时,它会生成实际的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。