如何遍历mysql结果集

Posted

技术标签:

【中文标题】如何遍历mysql结果集【英文标题】:How to loop through a mysql result set 【发布时间】:2009-11-18 15:23:16 【问题描述】:

循环遍历 mysql 结果集有哪些不同的方法?我是 php 和 MySQL 的新手,所以我正在寻找简单的方法来循环并解释所提供的代码是如何工作的。

【问题讨论】:

【参考方案1】:

我想到的第一个例子:

    <?php

    $link = mysql_connect(/*arguments here*/);

    $query = sprintf("select * from table");

    $result = mysql_query($query, $link);

    if ($result) 
      while($row = mysql_fetch_array($result)) 
        // do something with the $row
      

    
    else 
      echo mysql_error();
    
?>

【讨论】:

鉴于 mysql_ 扩展在 PHP 7 中被完全删除,有人应该编辑此代码以使用 mysqli_ 函数 每隔一段时间,我都会无缘无故地看到带有 sprintf() 内部查询的 SO 问题。像这样的旧帖子教研究人员做有趣/次优的事情。【参考方案2】:

这是一个完整的例子:

http://php.net/manual/en/mysqli-result.fetch-array.php

    连接 选择数据库 查询 循环结果并获取数组以获取行

【讨论】:

需要注意的一点:mysql_query 可以返回 FALSE,这将导致 php.net 示例中的 while 循环失败。所以,首先做一个if(就像加布里埃尔索萨的回答一样)。除此之外,php.net页面上的示例代码很好。 这个例子在php7中不再有效。这里有一些 mysqli 的例子:php.net/mysqli-stmt.fetch【参考方案3】:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset('utf8mb4');

$sql = "SELECT * FROM table";
$result = $conn->query($sql)->fetch_all(MYSQLI_ASSOC);

foreach ($result as $row):
?>
//Loop Content... Example:-

<li><?= $row['name']; ?></li>

<?php
endforeach;
?>

【讨论】:

如果脚本正在处理同一“层”中的结果集,则不应使用 fetch_all()。事实上,一个 mysqli 结果集对象可以直接输入到 foreach() 中,并被视为关联数组的索引数组,因此实际上不需要获取函数调用。此答案缺少教育解释。【参考方案4】:

如果您使用的是 MySQL 4.1.3 或更高版本,it is strongly recommended 您使用 mysqli 扩展而不是[未进一步开发的 mysql 扩展,不支持 MySQL 4.1+ 的特性,没有prepared 和multiple statements,没有面向对象的接口,...]

请参阅mysqli-stmt.fetch 了解循环 mysqli 结果集的过程和面向对象的方法。

【讨论】:

我熟悉mysqli扩展并且知道使用它,但是直到您解释才知道为什么首选它,谢谢!【参考方案5】:

在现代 php 中,您不需要调用任何函数来获取结果集的数据。结果集对象是立即可迭代的,foreach() 将允许您遍历数据,就好像它是关联数组的索引数组一样。 (Since PHP5.4.0, circa March 1, 2012 - "MySQLi: Added iterator support in MySQLi. mysqli_result implements Traversable.")

例子:

foreach ($conn->query("SELECT one, two, three FROM my_table") as $index => $row) 
    echo "<div>$index: $row['one'], $row['two'], $row['three']</div>";

【讨论】:

【参考方案6】:

我建议创建一个数据库函数,作为数据库获取的包装器。使切换数据库函数调用变得更容易,甚至可以更轻松地切换数据库本身的类型(例如 mysql->postgresql 或 mysql->couchdb 或使用 PDO 对象或其他东西)。

您创建的某个函数接受查询并返回一个完全关联的数组,然后您将数据库连接代码粘贴在其中。

以后也可以使用PDO 进行检查,因为它为您抽象出特定于数据库的功能,使用 mysql、postgresql 等。

【讨论】:

以上是关于如何遍历mysql结果集的主要内容,如果未能解决你的问题,请参考以下文章

mysql存储过程之循环遍历查询结果集

使用 vba 在 MS-Access 前端中来自 MySQL 存储过程的多个结果集?

MySQL 存储过程,获取使用游标查询的结果集

mysql全表遍历为啥耗时

MySQL通过游标来实现通过查询结果集循环

mysql查询优化