While Loop 仅从 9000 多条记录中返回一行

Posted

技术标签:

【中文标题】While Loop 仅从 9000 多条记录中返回一行【英文标题】:While Loop only returns one row from 9000+ records 【发布时间】:2016-04-25 18:12:42 【问题描述】:

我有一个在 php 5.3 中运行良好的脚本。新主机只支持5.5,所以我做了一些修改。到目前为止,我只能返回一行。我已经痛苦了好几个小时了,我就是不明白为什么。

这可能是因为我在 while 循环之后没有使用 array_push() 吗?在我的原始脚本中,我有它,但发现在这个脚本中我得到了一个 500 内部服务器错误,如果我把它拿出来,它就会消失。

<?php
$mysqli = mysqli_connect("localhost", "user", "password", "database");

/* check connection */
if (mysqli_connect_errno()) 
printf("Connect failed: %s\n", mysqli_connect_error());
exit();


$row_array = array();

$query = "SELECT title,year,author,journal,keywords,abstract,url FROM entries";

if ($result = mysqli_query($mysqli, $query)) 

/* fetch object array */
   while ($row = mysqli_fetch_assoc($result)) 
        $row_array['title'] = $row['title'];
        $row_array['year'] = $row['year'];
        $row_array['author'] = $row['author'];
        $row_array['journal'] = $row['journal'];
        $row_array['keywords'] = $row['keywords'];
        $row_array['abstract'] = $row['abstract'];
        $row_array['url'] = $row['url'];

    

    echo '"data":';
    echo json_encode($row_array);
    echo '';

    /* free result set */
    $result->close();


/* close connection */
$mysqli->close();
?>

得到的返回是这样的:

"data":"title":"ERGOT The Genus Claviceps","year":"1999","author":null,"journal":null,"keywords":"LSD","abstract ":null,"url":null

这很好,花花公子,除了大约 9500 行应该回来。

【问题讨论】:

您不是在每次迭代时都不断地覆盖$row_array 中的条目吗? 是的,看起来是这样。这是我第一次弄乱 5.5。我不知道为什么它在 5.3 中没有这样做。 【参考方案1】:

你需要有一个多维数组并且你已经取了一个单维数组。

因此,每次记录出现时,它都会覆盖旧记录。

因此,您只获得最后一条记录。

将您的代码修改为:

$i=0;
$row_array = array();
while ($row = mysqli_fetch_assoc($result)) 
  $row_array[$i]['title'] = $row['title'];
  $row_array[$i]['year'] = $row['year'];
  $row_array[$i]['author'] = $row['author'];
  $row_array[$i]['journal'] = $row['journal'];
  $row_array[$i]['keywords'] = $row['keywords'];
  $row_array[$i]['abstract'] = $row['abstract'];
  $row_array[$i]['url'] = $row['url'];
  ++$i;

【讨论】:

以这种方式返回 500 内部服务器错误【参考方案2】:
$row_array= array();
 while ($row = mysqli_fetch_assoc($result)) 
        $tmp = array();
        $tmp['title'] = $row['title'];
        $tmp['year'] = $row['year'];
        $tmp['author'] = $row['author'];
        $tmp['journal'] = $row['journal'];
        $tmp['keywords'] = $row['keywords'];
        $tmp['abstract'] = $row['abstract'];
        $tmp['url'] = $row['url'];
        $row_array[] = $tmp;
    
echo '"data":';
    echo json_encode($row_array);
    echo '';

【讨论】:

就那样做,你的循环结果就被覆盖了。所以我创建了一个临时数组来存储它,每次都推送到“$row_array”。 这只是一遍又一遍地返回一个非常长的'tmp' JSON 数组。 这样尝试:echo json_encode(array("data" => $row_array)); 这是返回的内容:"data":["tmp","tmp",........ ........等等等等 对不起,我在我的数据库上试了一下,我忘记在 "$row_array[] = $tmp" 行添加一个 "$",现在,我得到了正确的返回: "数据":["title":"aa","year":"aa","author":"a","journal":"a","keywords":"a","abstract": "a","url":"a" 。那你介意再试一次吗?【参考方案3】:

您的 while 循环不断覆盖 $row_array 数组中的相同数组元素。

做你想做的事: 而($row = mysqli_fetch_assoc($result)) $row_array[] = $row;

【讨论】:

【参考方案4】:

您的$row_array 每次都会替换,您会得到最后一个。将您的代码更改为:

$i = 0;
while ($row = mysqli_fetch_assoc($result)) 
    $row_array[$i]['title'] = $row['title'];
    $row_array[$i]['year'] = $row['year'];
    $row_array[$i]['author'] = $row['author'];
    $row_array[$i]['journal'] = $row['journal'];
    $row_array[$i]['keywords'] = $row['keywords'];
    $row_array[$i]['abstract'] = $row['abstract'];
    $row_array[$i]['url'] = $row['url'];
    $i++;


echo '"data":';
    echo json_encode($row_array);
    echo '';

【讨论】:

以这种方式返回 500 内部服务器错误

以上是关于While Loop 仅从 9000 多条记录中返回一行的主要内容,如果未能解决你的问题,请参考以下文章

使用while循环在表中插入多条记录[关闭]

在 PL/SQL 中附加来自每个循环迭代的多条记录

SQL Server 2008 使用 WHILE LOOP 插入

oracle语法记录

VB中 while .....wend 与 DO while.....loop区别

C++中,do while, for loop和while loop之间有啥不同