Показывает только одну строку при выполнении другого запроса внутри запроса - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть список друзей на моем веб-сайте, и я храню имена пользователей в базе данных, а не их полные имена. Так что я бы просто сделал еще один запрос в списке друзей ...

while($r = mysqli_fetch_array($result)) {
    $username = $r['username'];
    // Wanna find the real name
    $sql = "SELECT * FROM users WHERE username = '$username'";
    $result = mysqli_query($con, $sql);
    $row = mysqli_fetch_array($result);
    $fullname = $row['fullname'];
    echo $fullname;
}

Работает нормально, но отображает только одну строку, а не все строки. Когда я просто отображаю имя пользователя, он показывает все строки.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Здесь множество проблем, но все сводится к выполнению так называемого запроса N + 1 . Вы делаете один запрос для извлечения N строк, а затем делаете N больше запросов, по одному для каждой строки, чтобы получить дополнительную информацию.

Вы можете сделать это все за один выстрел с JOIN:

SELECT x, users.username FROM y WHERE (x conditions)
  LEFT JOIN users ON users.username=y.username

Таким образом, вы можете получить все эти данные одновременно. Стоит отметить, что использование username в качестве такого ключа часто очень проблематично, так как вам нужно либо наложить целый ряд каскадных условий запуска для отслеживания ссылочной целостности, либо у вас вообще не будет никакой ссылочной целостности. Попробуйте использовать числовые значения в качестве первичных ключей в вашей базе данных и используйте такие вещи, как username только в качестве меток для людей.

Риск здесь заключается в том, что если кто-то удаляет свою учетную запись, а другой человек создает учетную запись с точно таким же именем, они «наследуют» этих друзей от прежней личности. Это проявилось на больших сайтах и ​​вызвало массу проблем, когда люди фактически получают право собственности на контент, от которого отказались другие.

0 голосов
/ 28 апреля 2018

Вы повторно используете $result, использованный в исходном запросе ...

while($r = mysqli_fetch_array($result)) {
    $username = $r['username'];
    // Wanna find the real name
    $sql = "SELECT * FROM users WHERE username = '$username'";
    $result1 = mysqli_query($con, $sql);
    $row = mysqli_fetch_array($result1);
    $fullname = $row['fullname'];
    echo $fullname;
}

Я только что изменил внутренний запрос, чтобы использовать $result1

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...