【问题标题】:Quickly put all data from an SQL query into an array with PHP使用 PHP 快速将 SQL 查询中的所有数据放入数组中
【发布时间】:2013-02-07 15:26:20
【问题描述】:

我正在使用类似下面的 PHP 代码将查询中的所有数据放入一个数组中:

<?php

$results = array();

$q = odbc_exec("SELECT * FROM table");

while ($row = odbc_fetch_array($q)) {
    $results[] = $row;
}

?>

这很好用,但是当查询包含数千行时会很慢。

我的问题是,PHP 中是否有任何方法可以将所有数据转储到一个数组中,而不必逐个循环遍历每条记录?

注意:数据库使用 MS SQL Server。

【问题讨论】:

  • 当你必须读取大量数据时,总是需要一些时间。你真的需要那张桌子的单行吗?你想做什么?
  • 如果您不再需要依赖数组,您可以在 while 循环中执行操作。
  • 我希望有一个函数可以在不使用 while 循环的情况下将整个查询内容放入一个数组中。

标签: php sql-server arrays


【解决方案1】:

您可以尝试使用 mssql 函数而不是 odbc,但这不太可能产生很大的不同。

按照驱动程序的工作方式,结果集是结果数据本身的迭代器句柄。在某些情况下,直到 php 请求该行,php 才真正获取数据。除非驱动程序中存在 fetch all 可用,否则循环遍历所有行通常是您唯一的选择。

如果您不需要所有列,则可以通过仅指定您实际需要的列来限制正在传输的数据。

【讨论】:

    【解决方案2】:

    odbc_connect 中指定cursor_type 使得odbc 获取更快。

    $conn = odbc_connect($dsn, $user, $pass, SQL_CUR_USE_ODBC)
    

    http://aaronsaray.com/blog/2007/08/02/odbc-for-udb-and-php-how-i-increased-performance-by-400/

    【讨论】:

      【解决方案3】:

      我能够使用 GetAll() 函数通过 ADOdb(PHP 的数据库抽象库)找到一种方法:

      http://adodb.sourceforge.net/

      $results = $DB->GetAll("SELECT * FROM table");

      这会将所有行作为二维数组返回。

      【讨论】:

      • 根据他们的网站...安装 ADOdb C 扩展将使 GetAll() 和 GetArray() 加速 100% (adodb.sourceforge.net/#extension)。如果不使用 C 扩展,它似乎比标准 PHP 代码稍微快一些。
      • 可能即使使用扩展名,您也不​​会注意到太大的差异。不知道。找出是否有任何明显的好处会很有趣 - 我有点怀疑会有。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2014-03-03
      • 2018-09-13
      相关资源
      最近更新 更多