Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一次将所有SQL查询提取到一个数组中?_Php_Sql - Fatal编程技术网

Php 一次将所有SQL查询提取到一个数组中?

Php 一次将所有SQL查询提取到一个数组中?,php,sql,Php,Sql,下面的php代码成功地将url字段中的所有行相加 $sql = "SELECT * FROM table WHERE url <> ''"; $result = mysql_query($sql,$con); $sql_num = mysql_num_rows($result); while($sql_row=mysql_fetch_array($result)) { urls[] = $sql_row["url"]; } $sql=“从url为“”的表中选择*”; $

下面的php代码成功地将
url
字段中的所有行相加

$sql = "SELECT * FROM table WHERE url <> ''";
$result = mysql_query($sql,$con);
$sql_num = mysql_num_rows($result);

while($sql_row=mysql_fetch_array($result)) 
{
    urls[] = $sql_row["url"];
}
$sql=“从url为“”的表中选择*”;
$result=mysql\u查询($sql,$con);
$sql\u num=mysql\u num\u行($result);
while($sql\u row=mysql\u fetch\u array($result))
{
url[]=$sql_行[“url”];
}

问题是,如果url列表以百万为单位,则需要花费大量时间(尤其是在localhost中)。因此,我想知道如何不使用循环直接将sql查询结果获取到数组中。有可能吗?

< P>你应该考虑使用MySQL来达到这个目的。
fetch\u all()
方法允许这样做

更新

根据评论,我尝试了两种方法。我尝试在一个循环中使用
mysql\u fetch\u array
,并在生产中的一个大表上使用
mysqli::fetch\u all()
方法
mysqli::fetch_all()
确实比
mysql_fetch_数组
使用的内存更少,运行速度更快


这个表大约有500000行
mysqli::fetch_all()
在2.50秒内完成了在数组中加载数据,并且没有达到脚本中设置的1G内存限制
mysql\u fetch\u array()
在3.45秒后由于内存耗尽而失败。

问题不在于循环,而是将数百万条数据(可能很大)从数据库传输到内存中。不管你用哪种方法,都需要时间。无论如何,总有人需要在某个地方循环


简而言之:减少从数据库获取的数据量。

mysql
已被弃用,您想要的功能可以在
mysqli
PDO
中找到。这是切换到较新的MySQL扩展的完美借口。对于
mysqli
PDO
,方法都是
fetchAll
(注意
mysqli::fetch\u all
需要运行
mysqlnd
驱动程序)。

在mysql中没有选项。尽管您可以使用pdo的fetchall()


PHP不打算在内存中传递数兆字节的数据。它的内存效率不高。你打算用这些数据做什么?您不能在SQL查询本身中执行您需要的任何操作吗?您真的需要所有这些百万行吗?您正在向用户显示这些百万行吗?如果是这样,为什么,我觉得你没有告诉我们这里的一切,比如分页问题或查询中缺少的节点,比如过滤掉一些行的条件。。。。。。而且速度还是很慢的——无论您使用什么样的数据库库,将数百万行吸入PHP数组都会爬行。@MarcB绝对正确。问题是在没有循环的情况下加载数组中的所有行。我不是说这是个奇迹;)@Mathieumbert这个问题与加载一百万行而不花几秒钟读取数据有关…@MathieuDumoulin我完全同意。我相信使用mysqli而不是mysql以及使用
fetch_all()
在性能方面将是有益的。我承认mysqli可能更高效,因为它运行在优化的C代码上,但是将一百万行提取到内存中是疯狂的。