Я не могу создать сеанс, он всегда выдает эту ошибку. Неопределенный ключ массива «user_name» и «url_address». Я уже начал сеанс в autoload.php.
<?php
require('autoload.php');
if ($_SERVER['REQUEST_METHOD']= = "POST"){
$email=trim($_POST['login_email']);
$sql = "SELECT `user_email`, `user_password` FROM `users` where `user_email` = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s",$email);
$stmt->execute();
$result = $stmt->get_result();
$exist = $result->num_rows;
if ($exist == 0 ){
echo "no user found";
exit();
}else{
$row = $result->fetch_array(MYSQLI_ASSOC);
if (password_verify($_POST['login_password'], $row['user_password'])){
$_SESSION['USERNAME'] = $row['user_name'];
$_SESSION['URL'] = $row['url_address'];
echo $_SESSION['USERNAME'];
echo "valid credentials";
}else{
echo "invalid credentials";
exit();
}
}
$stmt->close();
}
$conn->close();
?>
Ваш запрос ВЫБЕРИТЕ user_email, user_password... ... явно не содержит столбцов «user_name» или «url_address», но позже в коде вы пытаетесь прочитать их из результата этого запроса. Так что просто включите их в свой оператор SELECT, и все будет в порядке. PHP не может волшебным образом читать поля, которые вы не запрашивали у базы данных... неясно, почему у вас было такое ожидание, основанное на написанном вами операторе SQL? Или вы просто забыли перепроверить?
Спасибо, ребята, я явно пропустил эту часть. еще раз спасибо, SELECT * сделал работу
вы получаете user_email
, user_password
из запроса на выборку и пытаетесь получить $row['user_name']; и $row['url_address']; из запроса
используйте этот обновленный код
<?php
require('autoload.php');
if ($_SERVER['REQUEST_METHOD']= = "POST"){
$email=trim($_POST['login_email']);
$sql = "SELECT * FROM `users` where `user_email` = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s",$email);
$stmt->execute();
$result = $stmt->get_result();
$exist = $result->num_rows;
if ($exist == 0 ){
echo "no user found";
exit();
}else{
$row = $result->fetch_array(MYSQLI_ASSOC);
if (password_verify($_POST['login_password'], $row['user_password'])){
$_SESSION['USERNAME'] = $row['user_name'];
$_SESSION['URL'] = $row['url_address'];
echo $_SESSION['USERNAME'];
echo "valid credentials";
}else{
echo "invalid credentials";
exit();
}
}
$stmt->close();
}
$conn->close();
?>
Почему SELECT * ...
, а не только обязательные столбцы? Кроме того, мы обычно не отвечаем на вопросы, вызванные опечаткой, это никому не нужно.
потому что SELECT * ... дает все столбцы, и он также может использовать user_name и url_address в запросе выбора, а также я позабочусь о том же
Не очень эффективно. Если эта таблица имеет f.e. 68 столбцов, вы получаете 68, но используете только 3 или 4
я согласен с тобой
@brombeer да, вы правы, но в этом случае у меня есть только 6 столбцов, не считая пароля, который мне нужно показать на сайте после выбора, позже, когда я добавлю больше столбцов, я укажу, какие столбцы выбрать в запросе
Эта ошибка указывает на
$row['user_name']
и$row['url_address']
, которые взяты из вашего запроса MySQL, а не сеанса. А вы толькоSELECT user_email, user_password
... так что эти поля будут недоступны