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