如何在php中正确使用sql语句中的数组元素?

9wbgstp7  于 2023-01-04  发布在  PHP
关注(0)|答案(1)|浏览(219)

我在PHP中有一个for循环,每次运行时,它都会执行一个修改过的SQL语句并返回结果,修改是将数据库中的字段与数组中的元素进行比较,但我得到了错误消息
警告:数组到字符串的转换在...
我只想返回查询的第一行,所以我没有使用while循环。

数组声明:

$sql = "SELECT usersID FROM users";
$result = mysqli_query($conn, $sql) or die("Bad Query: $sql");
$ids = array();

if(mysqli_num_rows($result) > 0){
    while($row = mysqli_fetch_assoc($result)){
        $ids[] = $row;
    }
}

For循环:

$count = mysqli_num_rows($result);

for($i = 0; $i < $count; $i++){
    $sql2 = "SELECT * FROM messages 
            WHERE (messagesFrom LIKE 'echo $messagesFrom' AND messagesTo LIKE '$ids[$i]') 
            OR (messagesFrom LIKE '$ids[$i]' AND messagesTo LIKE '%$messagesFrom%') 
            ORDER BY messagesID DESC";
    $result2 = mysqli_query($conn, $sql2) or die("Bad Query: $sql2");
    $row2 = mysqli_fetch_assoc($result2);
    print($row2);
 
}

我尝试了一个foreach循环,但是错误信息没有变化。我不相信使用内爆()会起作用,因为我不想把整个数组连接在一起,我想比较数组中的每个单独的元素。

r6l8ljro

r6l8ljro1#

$ids[$i]是一个包含表中行的数组。即使只选择一列,mysqli_fetch_assoc()也会返回一个数组。因此,应使用以下命令将列提取到数组中:

$ids[] = $row['usersID'];

然后你应该使用一个带参数的预准备语句,而不是直接将变量替换到SQL中,使用foreachfor更容易。

$stmt = $conn->prepare("
    SELECT * 
    FROM messages 
    WHERE (messagesFrom LIKE CONCAT('%', ?, '%') AND messagesTo = ?)
        OR(messagesFrom = ? AND messagesTo LIKE CONCAT('%', ?, '%'))")
$stmt->bind_param("ssss", $id, $messagesFrom, $id, $messagesFrom);

foreach ($ids as $id) {
    $stmt->execute();
    $result = $stmt->get_result();
    $row2 = $mysqli_fetch_assoc($result);
    var_dump($row2);
}

你不能print一个数组,使用var_dump()来打印$row2

相关问题