我有一个mysql查询,我想像这样总结:$sql = $dbh->prepare("SELECT * FROM log");
然后,我执行它:$sql->execute();
,现在我的问题是为什么我不能使用它进入:foreach($dbh->query($sql) as $row)
循环?当我试图让它运行到foreach循环时,loggin表单不再从db读取。如果我删除了dbh-> prepare语句,它的工作正常,但我想阻止SQL注入。感谢。
答案 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)
方法query
和prepare
:
query
方法将直接执行您输入的SQL代码prepare
将“准备”您的sql代码。此过程用一些实际值替换sql代码中的所有参数(即SELECT * FROM users WHERE user_id=:user_id
将变为SELECT * FROM users WHERE user_id=1
)。因此,当您使用预准备语句时,您需要执行execute
以便将代码发送到mysql。