Вопрос или проблема
Мои данные MYSQL не отображаются. Показано только else выражение.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Документ</title>
</head>
<body>
<?php
include 'includes/database.php';
$sql = "select * from post";
$result = $mysqli->query(query: $sql);
while ($row = $result->fetch_assoc()) {
if ($row['id'] == $_GET['id']) {
?>
<div class="blog-post-card">
<div>
<div>
<p class="blog-post-title"><?php echo $row['title']; ?></p>
<p class="blog-post-date"><?php echo $row['created_at']; ?></p>
<p class="blog-post-excerpt"><?php echo $row['short_text']; ?></p>
<?php echo '<a href="/../view-posts.php?id=' . $row['post_id'] . '" class="blog-post-link">Читать далее</a>'; ?>
</div>
</div>
</div>
<?php
} else {
echo ("записи не найдены");
}
}
$mysqli->close();
?>
</body>
</html>
Я проверил код в отдельном файле в той же папке, и он работает. В моей базе данных есть один пост, и он отображается корректно в другом файле. Я не знаю, почему данные не отображаются. Дайте знать, если мне нужно включить какие-либо другие файлы.
Ответ или решение
Ваша проблема с отображением данных в MySQL может быть связана с несколькими ошибками в вашем коде. Давайте рассмотрим шаги решения и предложим исправления.
-
Ошибка в запросе: Убедитесь, что ваш SQL-запрос возвращает данные. У вас есть ошибка в синтаксисе запроса
query: $sql
, который нужно исправить на просто$sql
. -
Проверка переменной
$_GET['id']
: Вам необходимо убедиться, что переменная$_GET['id']
действительно передаётся и имеет значение, которое существует в вашей базе данных. Добавьте отладочный код, чтобы проверить, что именно передается. -
Структура циклов: Ваша текущая логика с проверкой условий внутри цикла
while
может привести к тому, что сообщение "no entries found" будет выводиться слишком много раз, если данные не соответствуют. Лучше будет выполнить проверку после завершения цикла. -
Вывод данных: Вам также может понадобиться обрабатывать случаи, когда данные отсутствуют, сразу после выполнения запроса.
Вот исправленный вариант вашего кода:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<?php
include 'includes/database.php';
// Убедитесь, что id передается через GET
if (isset($_GET['id'])) {
$id = intval($_GET['id']); // Приведение к целому числу для безопасности
$sql = "SELECT * FROM post WHERE id = $id";
$result = $mysqli->query($sql);
// Проверка, вернул ли запрос результаты
if ($result->num_rows > 0) {
// Вывод данных
while ($row = $result->fetch_assoc()) {
?>
<div class="blog-post-card">
<div>
<div>
<p class="blog-post-title"><?php echo htmlspecialchars($row['title']); ?></p>
<p class="blog-post-date"><?php echo htmlspecialchars($row['created_at']); ?></p>
<p class="blog-post-excerpt"><?php echo htmlspecialchars($row['short_text']); ?></p>
<?php echo '<a href="/../view-posts.php?id=' . htmlspecialchars($row['post_id']) . '" class="blog-post-link">Fortsätt läs</a>'; ?>
</div>
</div>
</div>
<?php
}
} else {
echo "Запись не найдена.";
}
} else {
echo "ID не передан.";
}
$mysqli->close();
?>
</body>
</html>
Важные моменты:
- SQL-Injection: Вы должны всегда обрабатывать и валидировать входящие данные из
$_GET
. Я использовалintval()
для ограничений. - htmlspecialchars: Чтобы предотвратить XSS (межсайтовый скриптинг), используйте
htmlspecialchars()
при выводе данных, полученных от пользователя или базы данных. - Отладка: Если у вас еще будут возникать проблемы, попробуйте добавлять временные echo-выражения, чтобы понять, где происходит сбой.
Следуя этим советам и исправлениям, вы должны быть в состоянии заставить свой код корректно отображать данные из MySQL.