Ошибка неопределенной переменной при использовании запроса $_GET

У меня есть страница, которая подключается к базе данных MySQL через PHP. На этой странице извлекаются данные для загрузки изображения и связанных с ним деталей. Эта страница работает нормально, когда страница загружается.

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

На других страницах этот модуль доски работает нормально, но на странице, где происходит запрос $_GET, который необходим для идентификации имени пользователя или имени файла изображения (в зависимости от страницы), модуль доски работает некорректно. Когда вы создаете новую доску, она терпит неудачу, и я получаю сообщение об ошибке PHP, говорящее Undefined variable: filename in со ссылкой на строку кода ':filename' => $filename в функции выполнения ниже.

Когда этот модуль доски используется для создания нового имени доски, у меня есть код JavaScript fetch() на странице, который предотвращает аппаратное обновление. Я не уверен, что это вызывает проблему (хотя этот JS также используется на страницах, на которых нет проблем, то есть нет запроса $_GET). На страницах, где этого $_GET запроса нет, все работает как положено.

Примечание: в приведенном ниже коде $connection — это подключение к базе данных из файла db.php.

PHP при загрузке страницы, которая загружает изображение и связанные данные

isset($_GET['filename']) ? $filename = $_GET['filename'] : header("Location: login.php");

$image_stmt = $connection->prepare("SELECT * FROM `lj_imageposts` WHERE `filename` = :filename");

$image_stmt -> execute([
    ':filename' => $filename // variable that returns the error
]); 

$image_row = $image_stmt->fetch();

// if the GET url parameter doesn't exist/changed
if ($image_row == 0) { header ("Location: index.php"); exit; }

$db_userid = htmlspecialchars($image_row['user_id']);
$db_image_id = htmlspecialchars($image_row['image_id']);
$db_image_title = htmlspecialchars($image_row['image_title']);
$db_image_filename = htmlspecialchars($image_row['filename']);
$db_image_ext = htmlspecialchars($image_row['file_extension']);
$db_username = htmlspecialchars($image_row['username']);

?>

---- HTML OUTPUT THAT INCORPORATES THE ABOVE VARIABLES

PHP для модуля плат

if (isset($_POST['submit-board-name'])) {

    $create_board_name = $_POST['create-board-name'];
    
    if (strlen(trim($create_board_name)) < 10) {
        $error[] = "Board name must be at least 10 characters long";
    }

    if (strlen(trim($create_board_name)) > 150) {
        $error[] = "Board name can be at less than 150 characters long";
    }

    if (!isset($error)) {
    
        try {

            $createBoardSQL = "INSERT INTO lj_boards (board_name, user_id) VALUES (:board_name, :user_id )";
        
            $bstmt = $connection->prepare($createBoardSQL);
            $bstmt->execute([
                ':board_name' => $create_board_name,
                ':user_id' => $db_id
            ]);

        } catch(PDOException $e) {
            echo "Error: " . $e->getMessage();
        }

    }
} else {
    // give values an empty string to avoid an error being thrown before form submission if empty
    $create_board_name = "";
}

Первая строка... после перенаправления код продолжается.

Honk der Hase 11.05.2022 23:05

Не используйте тройку вместо if. Если вы пишете нормально, вы можете легко добавить exit; после header(...)

Barmar 11.05.2022 23:13
Стоит ли изучать 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 и хотите разрабатывать...
0
2
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Эта первая строка излишне загадочна, из-за чего ошибку труднее обнаружить (и труднее исправить):

isset($_GET['filename']) ? $filename = $_GET['filename'] : header("Location: login.php");

Это притворяется выражением, но на самом деле это замаскированный оператор if - он состоит только из побочных эффектов. Напишем понятнее:

if ( isset($_GET['filename']) ) {
    $filename = $_GET['filename'];
}
else {
    header("Location: login.php");
}

Теперь мы можем более четко рассмотреть, что делает каждая ветвь:

  • Ветка if устанавливает переменную. Если код принимает эту ветвь, все должно быть в порядке.
  • Ветка else устанавливает заголовок, который будет включен, когда PHP отправляет ответ. Он больше ничего не делает и не устанавливает переменную, так что если вы выберете этот путь, позже у вас возникнут проблемы.

Вероятно, вы хотели, чтобы ветка else установила этот заголовок а затем немедленно остановить обработку. Для этого вам понадобится оператор exit; (также известный как die;

if ( isset($_GET['filename']) ) {
    $filename = $_GET['filename'];
}
else {
    header("Location: login.php");
    exit;
}

Спасибо IMSoP, это действительно решило проблему.

pjk_ok 12.05.2022 01:32

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