Пытаюсь отобразить данные на index.php, имя пользователя работает нормально, электронная почта не отображается.
server.php
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$results = mysqli_query($db, $query);
if (mysqli_num_rows($results) == 1) {
$_SESSION['email'] = $email;
$_SESSION['username'] = $username;
$_SESSION['success'] = "You are now logged in";
header('location: index.php');
index.php
<?php
// Echo session variables that were set on previous page
echo "Your email is: " . $_SESSION['email'] . "<br>";
echo "Your username is: " . $_SESSION['username'] . "";
?>






Вы не получаете результатов после запроса данных. Используйте mysqli_fetch_assoc
Примечание, что я применил mysqli_real_escape_string к параметрам условий вашего WHERE для проблем, связанных с внедрением SQL. Хотя это не надежное решение!
Измените на следующее:
$query = "SELECT *
FROM users
WHERE username = '" . mysqli_real_escape_string($db, $username) .
" AND password = '" . mysqli_real_escape_string($db, $password) . "'";
$results = mysqli_query($db, $query);
if (mysqli_num_rows($results) == 1) {
$row = mysqli_fetch_assoc($db, $results);
$_SESSION['email'] = $row['email'];
$_SESSION['username'] = $row['username'];
$_SESSION['success'] = "You are now logged in";
Пожалуйста, прочтите на как предотвратить проблемы, связанные с SQL-инъекцией, с помощью подготовленных операторов.
@Zeke Я уже добавил этот бит (редактировал перед вашим комментарием)
@Zeke опечатка! :-)
Я до сих пор считаю, что mysqli_real_escape_string() даже не стоит упоминать, потому что он ничего не решает. Если вы собираетесь рекомендовать заранее подготовленные утверждения, просто напишите их как таковые. Но по крайней мере вы ответили на вопрос. Я также хотел бы убедиться, что выбрана база данных, поскольку я не вижу mysqli_select_db() (или mysqli::select_db()) где-либо в коде, а запрос SQL также не указывает какую-либо базу данных.
Предупреждение: mysqli_real_escape_string () ожидает ровно 2 параметра, 1 из которых указан в C: \ xampp2 \ htdocs \ server.php в строке 81 Предупреждение: mysqli_real_escape_string () ожидает ровно 2 параметра, 1 из которых указан в C: \ xampp2 \ htdocs \ server.php на строка 82 Предупреждение: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, логическим значением, заданным в C: \ xampp2 \ htdocs \ server.php в строке 84
@PHPNewbie, если вы собираетесь использовать эту функцию, добавьте переменную $db в качестве первого параметра. Как это: mysqli_real_escape_string($db, $username).
@Zeke, спасибо за ваше время, по-прежнему появляется одна ошибка ~> Предупреждение: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, логическим значением, заданным в C: \ xampp2 \ htdocs \ server.php в строке 84, вероятно, в запросе есть ошибка но мои новенькие глаза не видят этого
@PHPNewbie проверьте обновленный ответ. Я так привык использовать объектно-ориентированный стиль; это процедурный стиль; пропустил $db во многих местах. Помимо перехода к подготовленным операторам, вам также следует рассмотреть возможность использования объектно-ориентированного стиля.
@PHPNewbie не надо использует переменную $db для mysqli_num_rows(). Передайте только результат SQL. Это явно указано в полученной вами ошибке.
Вы не получили электронное письмо с результатами, поэтому ваша переменная $ email имеет значение null. Если адрес электронной почты находится в вашей таблице пользователей, вам нужно будет назначить его из результатов.
Вы должны хотя бы показать, как решить эту проблему с помощью кода. И это не только $email, но и $username. Ваш ответ кажется неполным и расплывчатым.
Из вопроса «имя пользователя работает нормально, электронная почта не отображается». Значение имени пользователя, скорее всего, происходит из входного значения формы, поэтому оно не равно нулю. Я включил код в другие ответы, но решил, что это не всегда лучший ответ. Обычно лучше решать проблему самостоятельно, при необходимости с некоторой помощью, но не получать полное решение. По крайней мере, именно так я предпочитаю получать ответы на свои вопросы с определенным направлением, но не с полным решением. Я также понял, что некоторые вопросы могут исходить от студентов, которые хотят сделать за них домашнее задание.
Лучше я найду кодировщика, чтобы закончить свой проект.
@PHP Newbie, ответ на ваш исходный вопрос находится в ответе Мадхура выше, поэтому вам не нужно тратить свои деньги. Думаю, это была шутка.
Я понимаю вашу точку зрения, но имя пользователя работает по разным причинам, а не из-за запроса SQL. Вот в чем разница. Так что, по крайней мере, об этом следует упомянуть. Я имею в виду, что запрос выбирает все, поэтому должна быть причина.
Ой, эй, я случайно проголосовал против вашего ответа около 34 минут назад, пожалуйста, отредактируйте его, чтобы я мог его отменить. Мне плохо, извини.
Это полный код, отображается $ username (проверено на разных пользователях)
if (isset($_POST['login_user'])) {
$username = mysqli_real_escape_string($db, $_POST['username']);
$password = mysqli_real_escape_string($db, $_POST['password']);
if (empty($username)) {
array_push($errors, "Username is required");
}
if (empty($password)) {
array_push($errors, "Password is required");
}
if (count($errors) == 0) {
$password = md5($password);
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$results = mysqli_query($db, $query);
if (mysqli_num_rows($results) == 1) {
$_SESSION['email'] = $email;
$_SESSION['username'] = $username;
$_SESSION['success'] = "You are now logged in";
header('location: index.php');
}else {
array_push($errors, "Wrong username or password combination");
}
}
}
это ваше решение? или вы редактировали вопрос?
mysqli_real_escape_string()не буду решает проблемы внедрения SQL. Для этого вы должны использовать подготовленные заявления.