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

problem in displaying a question with concat, foreach and explode in php

我在 mysql 中有一个 table。这个table的名字是questiontbl。问题存储在这个 table 中。随机向用户显示一个问题。这个问题不应该重复。所以用户 ID 存储在名为 uid 的列中。我有一些问题:

首先,问题会显示多次而不是一次。

其次,uid字段更新不能正常工作。例如用户ID为40,必须在字段中添加一次,则添加三次。

请检查我的代码并帮助我解决问题。

我的table:

id questiontitle uid
5 questionA 19,40,15,17,
6 questionB 19,

注意:uid列中用户ID不要重复存放。

我的代码:

<?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);
    }           
}
?>

您正在重复 uid 列中的所有值以查看您是否与会话 id 值匹配,但每次这些值都不匹配匹配您正在更新 table。相反,在 explodeing 值之后,使用 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 应该是 LIMIT 1 尽管对于那个查询来说它应该是不必要的。