PHP цикл foreach - PullRequest
       2

PHP цикл foreach

0 голосов
/ 12 марта 2019

У меня есть скрипт, в котором он отображает информацию о пользователе в таблице лидеров.Он получает информацию об отображении каждого пользователя через таблицу «регистраций», как показано в верхнем sql, однако его внутренняя информация (имя пользователя, идентификатор пользователя, IP-адрес и т. Д.) Хранится в таблице «пользователи».В таблице регистрации есть столбец 'user_id', который я пытаюсь связать с таблицей пользователей, которую можно увидеть после foreach.

Цель состоит в том, чтобы иметь имя пользователя (хранится в «users») для каждого пользователя - отображается на <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);
}
?>

Спасибо за любую помощь:)

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Используя JOIN, вы можете выполнить один запрос и получить нужные данные. Я также преобразовал это в использование подготовленного оператора - который должен использоваться поверх стандартного метода mysqli::query(), даже без переменных в запросе.

Ваш запрос INSERT совершенно не имеет смысла (судя по переменным, которые у вас были в вашем вопросе), поэтому вы должны взглянуть на переменные и установить их так, как они должны быть (ваш код в вопросе будет вставлен имя пользователя last извлеченного имени пользователя, и это не обязательно то значение, которое вы ожидаете, что оно будет).

Я также удалил ваш id из запроса INSERT, вместо этого он должен быть автоматически увеличен в вашей таблице 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();
}
0 голосов
/ 12 марта 2019

Я сделал улучшения для вашего кода.Я мало что изменил для твоего легкого понимания.Я пытаюсь дать вам несколько советов о передаче переменных в запросе на публикацию (например, отправка формы).

Примечание. Полученные значения должны быть обработаны перед использованием в запросе.Вы можете использовать подготовленные заявления для этого после того, как поняли этот ответ.

    <?php
$sql = mysqli_query($DB, "
  SELECT * FROM registrations
  JOIN users on users.id=registrations.user_id
   WHERE users.id='" . $row['user_id'] . "' LIMIT 5");

$result = mysqli_fetch_assoc($sql);

foreach ($result as $row) {
    echo "
<tr class='gradeX'>
    <td class='center'>" . $row['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'/>
        <input type='hidden' name='username' value='". $row['username'] . "' />
        <input type='hidden' name='type' value='". $row['type'] . "' />
        </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'] . "', '" . $_POST['username'] . "', '" . time() . "', '" . $_POST['type'] . "', '" . $GETD['rank'] . "', '$rank', 'pending')";
    mysqli_query($DB, $query);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...