我试图理解这个SQL语句:
$id = 5;
$stmt = $conn->prepare('SELECT * FROM myTable WHERE id = :id');
$stmt->execute(array('id' => $id));
while($row = $stmt->fetch()) {
print_r($row);
}
有人可以一步一步地向我解释这里到底发生了什么?
据我所知:
$stmt = $conn->prepare('SELECT * FROM myTable WHERE id = :id');
1) $ stmt即将作为iinput进行SQL查询。 SQL查询是从表中选择其id等于5的所有行。
$stmt->execute(array('id' => $id));
2) 我们执行声明。现在$ stmt有这些行吗?
$row = $stmt->fetch()
3) 这对我来说是最令人困惑的一句话。这到底发生了什么?变量“row”逐个获取id = 5的行?这是fetch()的作用吗?如果是的话,它会如何以实际的方式返回结果?它的所有正确答案的数组? EG所有id = 5的行?我不明白这个while循环是如何工作的。第一次运行“row”会有第一行吗?它第二次运行,第二行是否满足我们的creteria(id = 5)等等?是不是每次运行fetch都会返回一个结果?下次我运行fetch,下一个结果,直到没有更多的结果来满足查询?
我觉得我很接近这个。任何可以帮助我完全理解它的东西都将受到高度赞赏!
答案 0 :(得分:4)
我会解释为评论:
$id = 5;
// Create a prepared statement - don't actually execute the statement yet.
// The :id value in the statement will be replaced by a parameter value (safely) when the
// statement is executed
$stmt = $conn->prepare('SELECT * FROM myTable WHERE id = :id');
// Execute the statement against the DB - the $stmt var now contains the result set for the
// executed statement. e.g. it contains *all* the results that the query fetched
$stmt->execute(array('id' => $id));
// Now we loop through the rows in the result set (they are all in memory at this point).
// "fetch" will start from row 1 and return the next result each time you call it again.
// when there are no more rows it returns FALSE and therefore breaks out of the while loop
while($row = $stmt->fetch()) {
print_r($row);
}
只是检查文档,虽然这是以前的工作方式(自从我触及PHP以来已经好几年),看起来stmt->fetch()
实际上将结果放入绑定变量:
http://php.net/manual/en/mysqli-stmt.fetch.php
$row = array();
stmt_bind_assoc($stmt, $row);
// loop through all result rows
while ($stmt->fetch())
{
print_r($row);
}
您最初发布的代码是否真的有效?它似乎没有绑定任何变量,因此$stmt-fetch()
调用返回bool TRUE / FALSE,似乎$row
不会设置为除TRUE / FALSE
答案 1 :(得分:2)
这里它使用PDO执行,
使用预准备语句重复SELECT,通过该语句可以调用重复查询
$stmt = $conn->prepare('SELECT * FROM myTable WHERE id = :id');
它定义了:id
占位符
$stmt->execute(array('id' => $id));
这个地方将值赋给占位符并执行查询
$row = $stmt->fetch()
从select
中获取记录有关更多参考,请访问该链接 http://www.php.net/manual/en/pdo.prepared-statements.php