У меня есть страница, которая подключается к базе данных 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 = "";
}
Не используйте тройку вместо if. Если вы пишете нормально, вы можете легко добавить exit; после header(...)






Эта первая строка излишне загадочна, из-за чего ошибку труднее обнаружить (и труднее исправить):
isset($_GET['filename']) ? $filename = $_GET['filename'] : header("Location: login.php");
Это притворяется выражением, но на самом деле это замаскированный оператор if - он состоит только из побочных эффектов. Напишем понятнее:
if ( isset($_GET['filename']) ) {
$filename = $_GET['filename'];
}
else {
header("Location: login.php");
}
Теперь мы можем более четко рассмотреть, что делает каждая ветвь:
Вероятно, вы хотели, чтобы ветка else установила этот заголовок а затем немедленно остановить обработку. Для этого вам понадобится оператор exit; (также известный как die;
if ( isset($_GET['filename']) ) {
$filename = $_GET['filename'];
}
else {
header("Location: login.php");
exit;
}
Спасибо IMSoP, это действительно решило проблему.
Первая строка... после перенаправления код продолжается.