Неопределенная переменная в PHP и MySQL

Я делаю веб-приложение с MySQL и PHP (ООП), которое имеет CRUD с несколькими таблицами, и я пытаюсь повторить переменную, но оно возвращает эту ошибку: Предупреждение: неопределенная переменная $id_customer

Может кто-нибудь помочь в том, что я делаю неправильно? Спасибо

if (isset($_GET["id_customer"]) && !empty(trim($_GET["id_customer"]))) {
    require_once "../connectDB.php";

    $sql = "SELECT * FROM Customers 
            INNER JOIN Orders
            ON Customers.id_customer = Orders.id_customer
            WHERE Customers.id_customer = ?";

    if ($stmt = $mysqli->prepare($sql)) {
        // Bind variables to the prepared statement as parameters
        $stmt->bind_param("i", $param_id);

        // Set parameters
        $param_id = trim($_GET["id_customer"]);

        // Attempt to execute the prepared statement
        if ($stmt->execute()) {
            $result = $stmt->get_result();

            if ($result->num_rows == 1) {
                /* Fetch result row as an associative array. Since the result set
                contains only one row, we don't need to use while loop */
                $row = $result->fetch_array(MYSQLI_ASSOC);

                // Retrieve individual field value
                $id_customer = $row["id_customer"];
                $fn_customer = $row["fn_customer"];
                $ln_customer = $row["ln_customer"];
                $email_customer = $row["email_customer"];
                $id_order = $row["id_order"];
                $order_dt = $row["order_dt"];
                $order_total = $row["order_total"];
                /* ?>
                // <p><?php echo $id_customer; ?></p>
                / <?php */
            }
        }
    }
    // Close statement
    $stmt->close();
        
    // Close connection
    $mysqli->close();

}


?>

<p><?php echo $id_customer; ?></p>

Я попытался объединить эхо с получением значений полей и из первого оператора, как сейчас. Ничего из этого не сработало.

Если блок кода, в котором определена переменная, не выполняется, переменная будет неопределенной, либо определите переменную в верхней части области видимости и инициализируйте ее значением null, либо просто повторите переменную внутри области if ($result->num_rows == 1), подробнее о области видимости переменных

tttony 17.12.2022 17:15

Просто, в последний раз, когда вы эхо $id_customer находились за пределами блока, в котором вы определяете эту переменную. Таким образом, в случаях, когда строка $id_customer = ... не выполняется, переменная будет неопределенной. Вам нужно будет отладить свой код, чтобы выяснить точные обстоятельства — проверьте, в каком из слоев блоков if находится эта строка, чтобы увидеть, в какой блок код не входит, и какие значения переменных в условиях вызвали это. случаться

ADyson 17.12.2022 17:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
1
2
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашем коде есть несколько проблем: во-первых, вы, кажется, связываете (bind_param) переменную ($param_id), которая еще не определена, что должно привести к ошибке, но в конечном итоге вернет нулевые строки из вашего SQL-запроса.

Во-вторых, в предоставленном коде переменная $id_customer будет определена только при определенных обстоятельствах. Есть 4 утверждения if, которые должны быть истинными, прежде чем будет объявлено $id_customer. Если какое-либо из этих 4 утверждений окажется ложным, ему не будет присвоено значение. Поэтому, когда вы пытаетесь echo добавить его в конец скрипта, он не будет определен. Отсюда и сообщение об ошибке.

Трудно дать вам ответ, не понимая, чего именно хочет добиться ваш сценарий. Но вкратце, $id_customer будет иметь значение только внутри оператора ifif ($result->num_rows == 1) { /** ... **/ }.

Следующее даст вам желаемый результат:

<?php
if (isset($_GET["id_customer"]) && !empty(trim($_GET["id_customer"]))) {
    require_once "../connectDB.php";

    $sql = "SELECT * FROM Customers 
            INNER JOIN Orders
            ON Customers.id_customer = Orders.id_customer
            WHERE Customers.id_customer = ?";

    if ($stmt = $mysqli->prepare($sql)) {

        // Set parameters
        // Define $param_id before use, otherwise you'll be binding an undefined or null variable = no results + error
        $param_id = trim($_GET["id_customer"]);

        // Bind variables to the prepared statement as parameters
        $stmt->bind_param("i", $param_id);

        // Attempt to execute the prepared statement
        if ($stmt->execute()) {
            $result = $stmt->get_result();

            if ($result->num_rows == 1) {
                /* Fetch result row as an associative array. Since the result set
                contains only one row, we don't need to use while loop */
                $row = $result->fetch_array(MYSQLI_ASSOC);

                // Retrieve individual field value
                $id_customer = $row["id_customer"];
                $fn_customer = $row["fn_customer"];
                $ln_customer = $row["ln_customer"];
                $email_customer = $row["email_customer"];
                $id_order = $row["id_order"];
                $order_dt = $row["order_dt"];
                $order_total = $row["order_total"];
                // $id_customer will be defined here
                ?>
                   <p><?php echo $id_customer; ?></p>
                <?php
            }
            // $id_customer MAY NOT be defined here
        }
        // $id_customer MAY NOT be defined here
    }
    // Close statement
    $stmt->close();
        
    // Close connection
    $mysqli->close();
    
    // $id_customer MAY NOT be defined here
}

// $id_customer MAY NOT be defined here

?>

спасибо за помощь, я поставил сначала $param_id и изменил эхо внутри оператора if ($result->num_rows == 1) {, но это все равно не работает. Я действительно не знаю, что я делаю неправильно, так как в этих двух таблицах есть данные.

Gabriel Araújo 17.12.2022 17:31

В этом случае SQL, вероятно, не возвращает никакого результата. var_dump содержимое $row (var_dump($row);) после вас fetch_array. Это сначала покажет вам, равно ли $result->num_rows 1 И каков результирующий SQL.

Jordan 17.12.2022 17:37
Ответ принят как подходящий

Если isset($_GET['id_customer']) истинно, И оператор успешно подготовлен И успешно выполнен, вы запускаете запрос и инициализируете $id_customer. Однако, если у вас нет такого параметра, он не будет инициализирован, и вы получите ошибку. Попробуйте инициализировать его несмотря ни на что перед if:

id_customer = '';
if (isset($_GET["id_customer"]) && !empty(trim($_GET["id_customer"]))) {
    require_once "../connectDB.php";

    $sql = "SELECT * FROM Customers 
            INNER JOIN Orders
            ON Customers.id_customer = Orders.id_customer
            WHERE Customers.id_customer = ?";

    if ($stmt = $mysqli->prepare($sql)) {
        // Bind variables to the prepared statement as parameters
        $stmt->bind_param("i", $param_id);

        // Set parameters
        $param_id = trim($_GET["id_customer"]);

        // Attempt to execute the prepared statement
        if ($stmt->execute()) {
            $result = $stmt->get_result();

            if ($result->num_rows == 1) {
                /* Fetch result row as an associative array. Since the result set
                contains only one row, we don't need to use while loop */
                $row = $result->fetch_array(MYSQLI_ASSOC);

                // Retrieve individual field value
                $id_customer = $row["id_customer"];
                $fn_customer = $row["fn_customer"];
                $ln_customer = $row["ln_customer"];
                $email_customer = $row["email_customer"];
                $id_order = $row["id_order"];
                $order_dt = $row["order_dt"];
                $order_total = $row["order_total"];
                /* ?>
                // <p><?php echo $id_customer; ?></p>
                / <?php */
            }
        }
    }
    // Close statement
    $stmt->close();
        
    // Close connection
    $mysqli->close();

}


?>

<p><?php echo $id_customer; ?></p>

Я уже пытался определить переменную вне первого оператора «f» (забыл упомянуть об этом), но когда я это делаю, ошибок нет, но веб-страница пуста (это означает, что она получает первое значение, которое пусто. Я думать?)

Gabriel Araújo 17.12.2022 17:37

@GabrielAraújo проблема в том, что значение никогда не было правильно определено. Вам нужно закончить свой URL-адрес ?id_customer=123, чтобы правильно получить клиента. Поскольку у вас нет такого параметра, мы обрабатываем случай, когда он не определен. Тот факт, что вы получаете чистую страницу в этом случае, уже означает успех. Теперь вам нужно будет правильно передать параметр и проверить его таким же образом.

Lajos Arpad 17.12.2022 17:39

как лучше всего передать идентификатор?

Gabriel Araújo 17.12.2022 17:42

@GabrielAraújo, давайте предположим, что ваш URL-адрес http://some/path/somewhere. Вы добавляете к нему знак вопроса и имя параметра = значение параметра, например http://some/path/somewhere?id_customer=123. 123 — это всего лишь пример, замените его своим фактическим значением.

Lajos Arpad 17.12.2022 17:43

Это сработало, но я не могу сделать это вручную, как я могу сделать это в коде? Что-то не так в $param_id?

Gabriel Araújo 17.12.2022 17:46

@GabrielAraújo да, конкретно вы делаете bind_param до инициализации $param_id. Поменяйте порядок этих двух строк.

Lajos Arpad 17.12.2022 17:51

Я уже сделал, как мне помог другой пользователь, но он все еще не работает, он не меняет URL-адрес на фактический идентификатор, который я запросил.

Gabriel Araújo 17.12.2022 17:52

@GabrielAraújo ваш URL-адрес запрашивает ваш PHP-код, а не наоборот. $param_id не будет определять URL для вас. Вместо этого он будет хранить значение, полученное из базы данных.

Lajos Arpad 17.12.2022 17:56

Извините за непонимание, но как я могу запросить ID? я действительно не знаю

Gabriel Araújo 17.12.2022 18:01

@GabrielAraújo сначала пользователь посещает вашу страницу, вводя/вставляя URL-адрес в адресную строку браузера, щелкая ссылку или что-то в этом роде. Затем этот URL-адрес отправляется на ваш сервер (который может быть компьютером в удаленном месте) через Интернет. Этот компьютер получает параметры запроса (в данном случае id_customer), которые изначально должны были быть в запросе. Ваш сервер анализирует запрос на определенном порту (например, порт 80) и обрабатывает запрос (запускает ваш PHP-код для запуска), и когда это завершено, ответ отправляется сервером обратно в браузер.

Lajos Arpad 17.12.2022 18:03

@GabrielAraújo, поэтому в момент запуска PHP-кода вашего сервера параметр вашего запроса id_customer уже должен присутствовать в URL-адресе.

Lajos Arpad 17.12.2022 18:04

Я не понимаю, как я могу это сделать, я исследовал, но ничего не приходит, как это сделать.

Gabriel Araújo 17.12.2022 18:11

@GabrielAraújo, что тебя смущает? Можете ли вы преобразовать его в простой вопрос?

Lajos Arpad 17.12.2022 18:13

Я понимаю, что вы объясняете, я не знаю, как преобразовать это в код, который мне нужен

Gabriel Araújo 17.12.2022 18:17

@GabrielAraújo, чтобы иметь возможность помочь вам в этом, мне нужно понять это более глубоко. Как именно будет работать ваше приложение? Можете ли вы объяснить, как пользователь должен его использовать, какова цель приложения и т. д.?

Lajos Arpad 17.12.2022 18:18

Это CRUD-приложение, работающее с 3 таблицами: Customers, Orders и OrdersItems. Это файл «Читать клиентов», здесь я хочу присоединиться к клиентам и заказам выбранного клиента, который выбрал пользователь, использующий приложение.

Gabriel Araújo 17.12.2022 18:21

@GabrielAraújo, как вы посещаете свое приложение как пользователь?

Lajos Arpad 17.12.2022 18:23

это похоже на страницу администратора, я делаю это, чтобы изучить CRUD для школьного проекта. Я использую xampp, поэтому я могу получить к нему доступ через локальный хост.

Gabriel Araújo 17.12.2022 18:25

@GabrielAraújo Вы включили свой компьютер. Вы запустили браузер. Что вы вводите в адресную строку?

Lajos Arpad 17.12.2022 18:26

я набираю localhost/(папка проекта), затем я нажимаю ссылку на моей странице на домашней странице, которая ведет к localhost/(папка проекта)/Customers.php, там есть все записи клиентов и символ для просмотра каждой записи пользователя , что эта проблема возникла

Gabriel Araújo 17.12.2022 18:28

@GabrielAraújo хорошо/давайте предположим, что ваша (папка проекта) foobar. Вы посетили localhost/foobar. Что именно вы там видите?

Lajos Arpad 17.12.2022 18:30

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