【问题标题】:PHP freezes when using for loop for big array对大数组使用 for 循环时 PHP 冻结
【发布时间】:2015-03-03 17:47:42
【问题描述】:

我在尝试运行此脚本时遇到了一些麻烦:

<?php

$mysqli=new mysqli("localhost","root","mysqlpassword","MarcTextOldBib");
if (mysqli_connect_errno()) {echo "Failed to connect to MySQL: " . mysqli_connect_error();}
$db_abfrage = "SELECT `cid` , `field_data` FROM T1xx" ;
$j=0;
$db_ausgabe = $mysqli->query($db_abfrage);
while($row = $db_ausgabe->fetch_object()){
    $names[$j] = array( "cid"           => $row->cid,
                        "field_data"    => $row->field_data,
                     );
    $j++;
}


$mysqli->close();

echo"
<table border='1'>
<thead><tr>
<th>ID</th> <th>Name</th>
</tr></thead>";

$ID=1;
$size = count($names);

for ( $i = 0; $i <= $size; $i++ ){
    $cid = $names[$i][cid];
    echo "<tr>";

    while( $ID != $names[$i][cid] ) {
        echo "<td>".($ID)."</td>";
        echo "<td></td>";
        echo "</tr>";
        $ID++;
    }

    if( ($ID) == $names[$i][cid] ) {
        echo "<td>" . ($ID) . "</td>";
        echo "<td>" . $names[$i][field_data] . "</td>";
        echo "</tr>";
        $ID++;
    }

}

echo "</table>";

?>

当我将 for 循环设置为仅“50”而不是 count($names) 时,它就像魅力一样。但是当使用 count($names) 时,我的计算机完全冻结了。 count($names) 是 2788。

【问题讨论】:

  • 在 Web 应用程序中返回那么多行显然是低效的
  • 您返回多少数据? field_data 包含什么类型的数据?例如,如果它类似于包含 tinyints 的列,则其他内容可能是错误的。如果是每行包含 2mb 的文本字段,你会感到惊讶吗?
  • 是 while( $ID != $names[$i][cid] ) { 意思是 while( $ID != $names[$i]['cid'] ) { ?这个while循环也可能是无限的,因此会冻结,也许有这种情况发生在50之后的$row?
  • 首先你的代码中有无限循环,所以检查我的答案并一起修复:-)

标签: php mysql arrays for-loop freeze


【解决方案1】:

将“cid”放在引号中。

变化:

$names[$i][cid]

收件人:

$names[$i]['cid']

同样的道理

$names[$i]['fieldData']

【讨论】:

  • 哇,好用!为什么它在没有引号的情况下仍然可以工作,但没有那么快?
  • 只使用不带引号的“cid”,PHP 会尝试查找是否存在名为“cid”的常量。如果不是,它将返回一个空值。在您的情况下,这会导致您的 while 循环永远进行 - 因此冻结。
【解决方案2】:

你的代码很奇怪,我已经尽可能地简化了, 但是我仍然无法理解您尝试使用$ID++ 得到什么。

如果oyu解释我会为你解决剩下的:

<?php

$mysqli=new mysqli("localhost","root","mysqlpassword","MarcTextOldBib");
if (mysqli_connect_errno()) {echo "Failed to connect to MySQL: " . mysqli_connect_error();}
$db_abfrage = "SELECT `cid` , `field_data` FROM T1xx" ;
$db_ausgabe = $mysqli->query($db_abfrage);
$names= array()
while($row = $db_ausgabe->fetch_assoc()){
    $names[] = $row
}


$mysqli->close();

echo"
<table border='1'>
<thead><tr>
<th>ID</th> <th>Name</th>
</tr></thead>";

$ID=1;

foreach ($names as $row ){
    $cid = $row['cid'];
    echo "<tr>";
    echo "<td>" . ($ID) . "</td>";
    echo "<td>" . ($ID != $row['cid'])?'':$row['field_data'] . "</td>";
    echo "</tr>";
    $ID++;


}

echo "</table>";

?>

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    相关资源
    最近更新 更多