我正在使用PHP和MySQLi并遵循教程类型示例并且有一些基本的行为问题。下面是一个PHP代码示例(嗯,希望我正确格式化,第一篇文章):
<?php
$db = new mysqli('hostLiteral', 'userLiteral', 'passwordLiteral', 'people');
$results = $db->query("SELECT * FROM people")
if($results->num_rows) {
while($row = $results->fetch_object()) {
$records[] = $row;
}
$results->free();
}
?>
很多年前我使用过DBMS,也许这种行为让我无法理解这一点。
我的看法是,当执行'SELECT * FROM people'时,MySQL将扫描整个数据库,获取所有相关数据,并最终“指向”数据库中的最后一条记录。因此,当'while'循环开始时,我会认为它就是它开始的地方,它只能获得最后一条记录或行并完成。
但即使它以某种方式从第一行的数据库顶部开始,它如何知道在数据库中移动,除非'fetch_object()'以某种方式告诉它移动到下一行?
我确定我在这里缺少基本的SQL行为。但是我没有找到一个很好的解释来消除几年前我脑子里的这些概念。
感谢您提供任何理解帮助!
答案 0 :(得分:2)
查询使光标指向结果集的第一个行,而不是最后一行。由于通用用例是向前移动行,所以将光标留在最后一行是没有意义的。
此外,fetch_object
完全符合你的猜测。它获取当前行并将光标前进到下一行。有趣的是,documentation没有明确说明(就像它与fetch_row
一样,但是给出的例子足以说明这就是它的作用:
/* fetch associative array */
while ($obj = mysqli_fetch_object($result)) {
printf ("%s (%s)\n", $obj->Name, $obj->CountryCode);
}