提问者:小点点

在php中使用concat、foreach和explode显示问题时出现的问题


我在MySQL中有一个表。此表的名称为questiontbl。问题存储在这个表中。向用户随机显示一个问题。这个问题不应重复。因此用户ID存储在名为uid的列中。我有一些问题:

第一,问题显示多次而不是一次。

第二,uid字段更新不能正常工作。例如,如果用户ID是40,并且必须添加到字段中一次,则会添加三次。

请审查我的代码,并帮助我解决它的问题。

我的桌子:

注意:用户ID不应重复存储在uid列中。

我的代码:

<?php
$uid2=$_SESSION['id'];
$get1 = "SELECT * FROM questiontbl ORDER BY RAND() LIMIT 1";
$get2=mysqli_query($conn,$get1);
$get3=mysqli_fetch_assoc($get2);
$questionid=$get3['id'];
$now=$get3['uid'];
$now2=explode(',',$now);
foreach ($now2 as $data) 
{
    if (strpos($data,$uid2) !== FALSE )
    {
        header("Location: startnew.php");
    }
    else
    {                               
        $final_show=$get3['questiontitle'];
        echo $final_show;                               
        $update_idq = "UPDATE questiontbl SET uid=concat(uid,'$uid2,') WHERE id='$questionid' LIMIT1";
        mysqli_query($conn, $update_idq);
    }           
}
?>

共1个答案

匿名用户

您会得到重复,因为您正在迭代UID列中的所有值,以查看是否与会话ID值匹配,每次值不匹配时,您都在更新表。相反,在explordeing值之后,使用in_array查看会话id值是否存在于uid列中:

$uid2=$_SESSION['id'];
$get1 = "SELECT * FROM questiontbl ORDER BY RAND() LIMIT 1";
$get2=mysqli_query($conn,$get1);
$get3=mysqli_fetch_assoc($get2);
$questionid=$get3['id'];
$now=$get3['uid'];
$now2=explode(',',$now);
if (in_array($uid2, $now2)) {
    header("Location: startnew.php");
}
else {                               
    $final_show=$get3['questiontitle'];
    echo $final_show;                               
    $update_idq = "UPDATE questiontbl SET uid=concat(uid,",$uid2") WHERE id='$questionid' LIMIT 1";
    mysqli_query($conn, $update_idq);
}   

还请注意,变量替换只发生在双引号字符串中(您需要在id值前加上逗号),因此需要更改

SET uid=concat(uid,'$uid2,')

SET uid=concat(uid,",$uid2")

最后,您有一个输入错误,limit1应该是limit1,尽管该查询应该不需要它。