【问题标题】:While Loop only returns one row from 9000+ recordsWhile Loop 仅从 9000 多条记录中返回一行
【发布时间】: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 中没有这样做。

标签: php mysqli datatables


【解决方案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 内部服务器错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多