Я делаю веб-приложение с 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>
Я попытался объединить эхо с получением значений полей и из первого оператора, как сейчас. Ничего из этого не сработало.
Просто, в последний раз, когда вы эхо $id_customer находились за пределами блока, в котором вы определяете эту переменную. Таким образом, в случаях, когда строка $id_customer = ... не выполняется, переменная будет неопределенной. Вам нужно будет отладить свой код, чтобы выяснить точные обстоятельства — проверьте, в каком из слоев блоков if находится эта строка, чтобы увидеть, в какой блок код не входит, и какие значения переменных в условиях вызвали это. случаться






В вашем коде есть несколько проблем: во-первых, вы, кажется, связываете (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) {, но это все равно не работает. Я действительно не знаю, что я делаю неправильно, так как в этих двух таблицах есть данные.
В этом случае SQL, вероятно, не возвращает никакого результата. var_dump содержимое $row (var_dump($row);) после вас fetch_array. Это сначала покажет вам, равно ли $result->num_rows 1 И каков результирующий SQL.
Если 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» (забыл упомянуть об этом), но когда я это делаю, ошибок нет, но веб-страница пуста (это означает, что она получает первое значение, которое пусто. Я думать?)
@GabrielAraújo проблема в том, что значение никогда не было правильно определено. Вам нужно закончить свой URL-адрес ?id_customer=123, чтобы правильно получить клиента. Поскольку у вас нет такого параметра, мы обрабатываем случай, когда он не определен. Тот факт, что вы получаете чистую страницу в этом случае, уже означает успех. Теперь вам нужно будет правильно передать параметр и проверить его таким же образом.
как лучше всего передать идентификатор?
@GabrielAraújo, давайте предположим, что ваш URL-адрес http://some/path/somewhere. Вы добавляете к нему знак вопроса и имя параметра = значение параметра, например http://some/path/somewhere?id_customer=123. 123 — это всего лишь пример, замените его своим фактическим значением.
Это сработало, но я не могу сделать это вручную, как я могу сделать это в коде? Что-то не так в $param_id?
@GabrielAraújo да, конкретно вы делаете bind_param до инициализации $param_id. Поменяйте порядок этих двух строк.
Я уже сделал, как мне помог другой пользователь, но он все еще не работает, он не меняет URL-адрес на фактический идентификатор, который я запросил.
@GabrielAraújo ваш URL-адрес запрашивает ваш PHP-код, а не наоборот. $param_id не будет определять URL для вас. Вместо этого он будет хранить значение, полученное из базы данных.
Извините за непонимание, но как я могу запросить ID? я действительно не знаю
@GabrielAraújo сначала пользователь посещает вашу страницу, вводя/вставляя URL-адрес в адресную строку браузера, щелкая ссылку или что-то в этом роде. Затем этот URL-адрес отправляется на ваш сервер (который может быть компьютером в удаленном месте) через Интернет. Этот компьютер получает параметры запроса (в данном случае id_customer), которые изначально должны были быть в запросе. Ваш сервер анализирует запрос на определенном порту (например, порт 80) и обрабатывает запрос (запускает ваш PHP-код для запуска), и когда это завершено, ответ отправляется сервером обратно в браузер.
@GabrielAraújo, поэтому в момент запуска PHP-кода вашего сервера параметр вашего запроса id_customer уже должен присутствовать в URL-адресе.
Я не понимаю, как я могу это сделать, я исследовал, но ничего не приходит, как это сделать.
@GabrielAraújo, что тебя смущает? Можете ли вы преобразовать его в простой вопрос?
Я понимаю, что вы объясняете, я не знаю, как преобразовать это в код, который мне нужен
@GabrielAraújo, чтобы иметь возможность помочь вам в этом, мне нужно понять это более глубоко. Как именно будет работать ваше приложение? Можете ли вы объяснить, как пользователь должен его использовать, какова цель приложения и т. д.?
Это CRUD-приложение, работающее с 3 таблицами: Customers, Orders и OrdersItems. Это файл «Читать клиентов», здесь я хочу присоединиться к клиентам и заказам выбранного клиента, который выбрал пользователь, использующий приложение.
@GabrielAraújo, как вы посещаете свое приложение как пользователь?
это похоже на страницу администратора, я делаю это, чтобы изучить CRUD для школьного проекта. Я использую xampp, поэтому я могу получить к нему доступ через локальный хост.
@GabrielAraújo Вы включили свой компьютер. Вы запустили браузер. Что вы вводите в адресную строку?
я набираю localhost/(папка проекта), затем я нажимаю ссылку на моей странице на домашней странице, которая ведет к localhost/(папка проекта)/Customers.php, там есть все записи клиентов и символ для просмотра каждой записи пользователя , что эта проблема возникла
@GabrielAraújo хорошо/давайте предположим, что ваша (папка проекта) foobar. Вы посетили localhost/foobar. Что именно вы там видите?
Если блок кода, в котором определена переменная, не выполняется, переменная будет неопределенной, либо определите переменную в верхней части области видимости и инициализируйте ее значением
null, либо просто повторите переменную внутри областиif ($result->num_rows == 1), подробнее о области видимости переменных