我有一个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)
方法query
和prepare
之间有很大的差异:
-
query
方法将直接执行您输入的sql代码 -
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...');