Получение ошибки Неопределенный ключ массива в сценарии входа в php

Я не могу создать сеанс, он всегда выдает эту ошибку. Неопределенный ключ массива «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();
    ?>

Эта ошибка указывает на $row['user_name'] и $row['url_address'], которые взяты из вашего запроса MySQL, а не сеанса. А вы только SELECT user_email, user_password... так что эти поля будут недоступны

brombeer 05.05.2022 13:44

Ваш запрос ВЫБЕРИТЕ user_email, user_password... ... явно не содержит столбцов «user_name» или «url_address», но позже в коде вы пытаетесь прочитать их из результата этого запроса. Так что просто включите их в свой оператор SELECT, и все будет в порядке. PHP не может волшебным образом читать поля, которые вы не запрашивали у базы данных... неясно, почему у вас было такое ожидание, основанное на написанном вами операторе SQL? Или вы просто забыли перепроверить?

ADyson 05.05.2022 13:44

Спасибо, ребята, я явно пропустил эту часть. еще раз спасибо, SELECT * сделал работу

Sameer 05.05.2022 14:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
3
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы получаете 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 * ..., а не только обязательные столбцы? Кроме того, мы обычно не отвечаем на вопросы, вызванные опечаткой, это никому не нужно.

brombeer 05.05.2022 13:55

потому что SELECT * ... дает все столбцы, и он также может использовать user_name и url_address в запросе выбора, а также я позабочусь о том же

Dotsquares 05.05.2022 13:58

Не очень эффективно. Если эта таблица имеет f.e. 68 столбцов, вы получаете 68, но используете только 3 или 4

brombeer 05.05.2022 14:10

я согласен с тобой

Dotsquares 05.05.2022 14:15

@brombeer да, вы правы, но в этом случае у меня есть только 6 столбцов, не считая пароля, который мне нужно показать на сайте после выбора, позже, когда я добавлю больше столбцов, я укажу, какие столбцы выбрать в запросе

Sameer 05.05.2022 14:15

Другие вопросы по теме