首页 > 解决方案 > PHP foreach 循环数组

问题描述

我有一个脚本,它在排行榜上显示用户信息。它通过“registrations”表获取每个用户的显示信息,如顶部 sql 所示,但是他们的后端信息(用户名、用户 ID、IP 地址等)存储在“users”表中。注册表有一个列“user_id”,我试图将它与用户表链接,该表可以在foreach.

目标是为每个用户显示用户名(存储在“用户”中) - 显示在<td class='center'>" . $userdata['username'] . "</td>. 但是,用户名未显示。

在底部,我试图将记录插入到另一个表中,该表也使用相同的用户名值,但是它作为空字符串插入。请注意INSERT应该只为被点击的用户插入..这甚至可以实现吗?

-另外,我知道这个 PHP 不是最好的,应该使用准备好的语句等,但这不是目前的目标。

<?php
$sql = mysqli_query($DB, "SELECT * FROM registrations LIMIT 5");

foreach ($sql as $row)
{
    $userdata = mysqli_fetch_assoc(mysqli_query($DB, "SELECT * FROM users WHERE id='" . $row['user_id'] . "'"));
    echo "
                    <tr class='gradeX'>
                        <td class='center'>" . $userdata['username'] . "</td>
                        <td class='center'>" . $row['balance'] . "</td>
                        <td class='center'>" . $row['wins'] . " - " . $row['losses'] . "</td>
            <td class='center'><form method='post' action=''><input type='submit' class='btn btn-success' name='invite' value='Request Game'/></form></td>
                        <td class='center'><a href='' class='btn btn-success'>WATCH STREAM</a></td>
                    </tr>";
}

if (isset($_POST['invite']))
{
    $query = "INSERT INTO matches (id,sender,receiver,time,console,rank_sender,rank_receiver,status) values ('0', '" . $_SESSION['username'] . "', '" . $userdata['username'] . "', '" . time() . "', '" . $row['type'] . "', '" . $GETD['rank'] . "', '$rank', 'pending')";
    mysqli_query($DB, $query);
}
?>

谢谢你的帮助 :)

标签: phpmysqlmysqli

解决方案


使用 a JOIN,您可以执行单个查询并获取所需的数据。mysqli::query()我还将它转换为使用准备好的语句 -即使查询中没有变量,也应该在标准方法上使用它。

您的INSERT查询完全没有意义(根据您在问题中的变量判断),因此您应该查看变量并将它们设置为应有的状态(您的问题中的代码将插入最后获取的用户名用户名,这不一定是您期望的值)。

我还idINSERT查询中删除了您,这应该是您matches表中的自动增量。

您需要为该行TODO附加注释中的行分配正确的值。

$stmt = $DB->prepare("SELECT u.username, r.balance, r.wins, r.losses
                      FROM registrations r 
                      JOIN users u 
                        ON u.id=r.user_id
                      LIMIT 5
                      ");
$stmt->bind_result($username, $balance, $wins, $losses);
$stmt->execute();

while ($stmt->fetch()) {
    ?>
    <tr class='gradeX'>
        <td class='center'><?php echo $username; ?></td>
        <td class='center'><?php echo $balance; ?></td>
        <td class='center'><?php echo $wins; ?> - <?php echo $losses; ?></td>
        <td class='center'>
            <form method='post' action=''>
                <input type='submit' class='btn btn-success' name='invite' value='Request Game'/>
            </form>
        </td>
        <td class='center'><a href='' class='btn btn-success'>WATCH STREAM</a></td>
    </tr>
    <?php 
}
$stmt->close();

if (isset($_POST['invite'])) {
    // Assign the variables here. 
    $username_sender = 'somevalue';  // TODO: Define this. 
    $time = time();
    $rank_sender = $GETD['rank'];
    $rank_receiver = $rank;          // TODO: Define this. 
    $console = $type;                // TODO: Define this. 
    $status = 'pending';

    $stmt = $DB->prepare("INSERT INTO matches (sender, receiver, time, console, rank_sender, rank_receiver, status)
                            VALUES (?, ?, ?, ?, ?, ?, ?)");
    $stmt->bind_param("sssssss", $_SESSION['username'], $username_sender, $time, $console, $rank_sender, $rank_receiver, $status);
    $stmt->execute();
    $stmt->close();
}

推荐阅读