在if语句中使用in_array()在导致“”的循环中返回false;超过了“30秒的最大执行时间”;


Use in_array() in if statement returns false in a loop that results in "Maximum execution time of 30 seconds exceeded"

我正在为一个学校项目开发自己的Twitter风格的社交媒体。我用PHP编写代码,并将用户、帖子和追随者存储在MYSQL表中(我的变量名是瑞典语,因此它们被称为:anvandare、inlagg和foljningar)

所以现在我只想展示我关注的人的帖子。我决定获取我关注的用户的所有用户ID,并将它们存储在一个数组中。

$sqlfoljer="select foljarid, foljdid from foljningar where foljarid =$anvandarID";
$stmt = $conn->prepare($sqlfoljer);
$stmt->execute();
$row = $stmt->fetch();
if (!$row)
{
    echo "You are not following anyone.";
    die();
}
$foljer = array();
while ($row != null)
{
    array_push($foljer, $row['foljdid']);
$row = $stmt->fetch();
}

我在一个查询中获取所有帖子,然后检查写这些帖子的人是否在我关注的人群中

 $sql = "select id, datumskapat, text, bild, anvandarID, namnAnvandare from inlagg order by datumskapat desc";
$stmt = $conn->prepare($sql);
$stmt->execute();
$row = $stmt->fetch();
if (!$row)
{
    exit();
}
while ($row != null)
{
    $anvandarID = $row['anvandarID'];
    $inlaggsid = $row['id'];
    if(in_array($anvandarID, $foljer))
    {
        $sqlgillar = "select count(*) as antalgillar from gillningar where inlaggsid = :inlaggsid";
        $params2 = array(':inlaggsid'=>$row['id']);
        $stmt2 = $conn->prepare($sqlgillar);
        $stmt2->execute($params2);
        $row = $stmt2->fetch();

            if ($bild != null)
            {
                //Lägg tll bild
                echo "<img src='"visabild.php?id=$inlaggsid'" alt='"Bild'" />";
            }
            }
                            $row = $stmt->fetch();
        }
        else
        {
            echo"You dont follow this person";
        }
    }

好吧,问题是这不起作用。当我在浏览器中输入页面时,感觉它冻结了,但它只需要很长的时间,然后我会得到"最长时间"的致命错误。

帖子加载不正确。它只是来自一个人(数组中的第一个personID)的帖子。我为in_array添加了一个else语句,它无限次地重复着"你不要跟着这个人",直到30秒的休息。

有人能发现我做错了什么吗?

你不应该得到所有的帖子,当你关注它们时,请检查它的作者。这需要太长的日志时间。相反,您应该让数据库来做这项工作。您可以帮助您的数据库并在字段anvandarID上添加索引,从而防止对整个表进行seq扫描,并显著提高查询速度和效率。

您应该在查询中添加WHERE anvandarID IN ()条件以进行后期选择:

$in  = str_repeat('?,', count($foljer) - 1) . '?';
$sql = "select id, datumskapat, text, bild, anvandarID, namnAnvandare from inlagg 
    WHERE anvandarID IN ($in) order by datumskapat desc";
$stmt = $conn->prepare($sql);
$stmt->execute($in_array);
$data = $stmt->fetchAll();