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 多条记录中返回一行的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 使用 WHILE LOOP 插入