【问题标题】:Page loads for a very long time upon submitting page提交页面后页面加载很长时间
【发布时间】:2016-07-23 16:56:27
【问题描述】:

经过几个小时的挫折后,这段代码才开始工作。我知道我正在混合 MySQLI 和 PDO,但这只是为了让一切正常工作 - 我将在发布之前将所有内容转换为 PDO。这是我的 volly 消防部门的调度网页。

由于某种原因,当我单击“提交”时,我会转到第二页运行这些命令,它会在运行命令之前加载大约 2 分钟。

回复如下:

数组(2) { [0]=> 字符串(4) "0004" ["id"]=> 字符串(4) "0004" } 致命错误:第 765 行 /home/rhapidfyre/public_html/sasd/supervisor.php 中允许的内存大小为 67108864 字节已用尽(尝试分配 608 字节)

第 765 行是底部的 HTML 表单代码,用于“supervisor.php”

if($_GET['call'] == "close")
{
    if($_GET['callid'])
    {
        if($_GET['page'] == 'two')
        {
            $callid = $_GET['callid'];
            $closing = $_POST['closing'];
            $query = "SELECT id FROM engaged WHERE callnum = '$callid'";
            $getunits = $link->query($query);
            $unitsrow = $getunits->fetch_array(MYSQLI_BOTH);

            var_dump($unitsrow);

            $doit = $db->prepare("UPDATE incidents SET closing = :closing, closer = :myname, active = 0, archive = 1 WHERE id = :callid");
            $doit->bindParam(':callid',$callid);
            $doit->bindParam(':myname',$myname);
            $doit->bindParam(':closing',$closing);
            $doit->execute();

            $doita = $db->prepare("DELETE FROM engaged WHERE callnum = :callid");
            $doita->bindParam(':callid',$callid);
            $doita->execute();

            for($i = 0;$i < count($unitsrow);$i++) {
                $doitb = $db->prepare("UPDATE logins SET assigned = '0' WHERE id = :unitnum");
                $doitb->bindParam(':unitnum',$unitsrow[$i]);
                $doitb->execute();
            }

            echo '<script type="text/javascript">window.location = "supervisor.php?finished=closecall"</script>';
        }
        else
        {
            $callid = $_GET['callid'];
            $prep = $db->prepare("SELECT * FROM incidents WHERE id = :callid");
            $prep->bindParam(':callid',$callid);
            $prep->execute();
            $prepresult = $prep->fetch();
            ?>
            <form action="supervisor.php?do=func&call=close&callid=<?echo $_GET['callid'];?>&page=two" method="POST">
                <font color="#FF0">You are closing call #: </font><font color="#FFF"><strong><?echo $_GET['callid'];?></font><br />
                <font color="#FF0">Incident Type: </font><font color="#FFF"><strong><?echo $prepresult['type'];?></font><br />
                <font color="#FF0">Incident Loc : </font><font color="#FFF"><strong><?echo $prepresult['location'];?></font><br /><br />
                <font color="#FF0">CLOSING NOTES:</font><br/>
                <textarea rows="6" cols="60" name="closing" /></textarea><br />
                <input type="submit" value="SUBMIT!">
            </form>
            <?
        }
    }
    else
    {
        $callzactive = mysqli_query($link, "SELECT id,priority,type,location FROM incidents WHERE active = 1");
        ?>
        <font color="#FF0"><strong>SELECT CALL NUMBER</strong></font><br />
        <select onChange="window.location.href=this.value">
        <option>SELECT</option><?
        while($callsactive = mysqli_fetch_array($callzactive))
        {
            ?>
            <option value="supervisor.php?do=func&call=close&callid=<?echo $callsactive['id'];?>"><?echo "#".$callsactive['id']." (".$callsactive['priority'].") ".$callsactive['type']." @ ".$callsactive['location'];?></option>
            <?
        }
        ?></select><?
    }
}

【问题讨论】:

  • 为什么假设您的这部分代码会导致这种情况?它说它在那一行的内存不足,但可能内存在你展示给我们的代码上方的任何地方都被填满了。
  • 在添加 for 循环之前,它运行完美,除了它没有运行 for 循环,这意味着它没有更新登录设置为 0。其他一切运行完美。跨度>
  • 我忘了提 - 当只分配一个单元时,代码有效。它更改分配为零,一切正常,没有任何延迟。如果分配了两个或更多单元,则分配的零不会运行并且会延迟。
  • 这不会改变您在问题中显示的与脚本持续时间无关的错误消息,尽管持续时间可能与内存不足的原因有关。
  • 对我来说唯一有意义的是循环不会停止,这让我怀疑“$i

标签: php mysql mysqli pdo


【解决方案1】:

为了测试而尝试删除for循环中的更新查询

for($i = 0;$i < count($unitsrow);$i++) {
    $doitb = $db->prepare("UPDATE logins SET assigned = '0' WHERE id = :unitnum");
                                    $doitb->bindParam(':unitnum',$unitsrow[$i]);
                                    $doitb->execute();
}

通常不是快速解决方案。在 for 循环之前准备语句。就像在另一个问题中的 answer 一样。

【讨论】:

  • 这并不能解决 OP 的问题,并且充其量只能作为评论有用。坚持你可以直接回答的问题,直到你有足够的声誉发表评论。
  • 感谢您的回复。我会调查的。我试过了,但我仍然收到加载错误,这次是从执行行。我稍后会尝试一下。看起来循环一直在运行,我怀疑“count($unitsrow)”部分就是为了这个。
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多