Создание блога на PHP с динамическим выводом по id

Раздел: PHP -> Веб-приложения

Организация блога на PHP с идентификатором записи

Наиболее эффективное решение базируется на передаче идентификатора записи через параметр GET в URL (например, index.php?id=42). Такой подход прост в реализации, легко индексируется поисковыми системами и не требует сложной маршрутизации. Алгоритм работы включает проверку наличия параметра, фильтрацию, запрос к базе данных через PDO и вывод данных с экранированием для защиты от XSS.

<?php
// index.php
require 'config.php';
if (isset($_GET['id'])) {
    $id = (int) $_GET['id']; // приведение к целому
    $stmt = $pdo->prepare('SELECT * FROM posts WHERE id = ?');
    $stmt->execute([$id]);
    $post = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($post) {
        echo '<h2>' . htmlspecialchars($post['title']) . '</h2>';
        echo '<div>' . nl2br(htmlspecialchars($post['content'])) . '</div>';
    } else {
        http_response_code(404);
        echo 'Запись не найдена.';
    }
} else {
    // вывод списка записей
    $stmt = $pdo->query('SELECT id, title FROM posts ORDER BY created_at DESC');
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo '<a href="?id=' . $row['id'] . '">' . htmlspecialchars($row['title']) . '</a><br>';
    }
}
?>

Index php blog id (блог на php с идентификатором)

Какое решение является наиболее безопасным и производительным для простого блога?

Использование PDO с подготовленными запросами предотвращает SQL-инъекции, приведение к (int) гарантирует числовой тип, а htmlspecialchars – вывод без внедрения скриптов. Производительность достаточна для сайтов с тысячами посещений в день.

Типичная ошибка – отсутствие проверки существования записи. Если запрос вернет пустой результат, скрипт попытается использовать $post как массив, что вызовет предупреждение. Всегда проверяйте результат fetch().

Другая проблема – прямое использование $_GET['id'] в запросе. Это приводит к SQL-инъекциям. Используйте только подготовленные выражения.

Как сделать URL без параметра, используя ЧПУ через .htaccess?

Применение правил перезаписи Apache позволяет превратить post/42 в index.php?id=42 без изменения структуры скрипта. В корневом .htaccess добавляем:

RewriteEngine On
RewriteRule ^post/([0-9]+)$ index.php?id=$1 [L,QSA]

Php mysql js css (php, mysql, javascript и css)

Вариант полезен для SEO и удобства пользователей. Однако требует настройки сервера и может конфликтовать с другими правилами.

Ошибка: не включен модуль mod_rewrite или не разрешено использование .htaccess (требуется AllowOverride All). Проверьте настройки Apache.

Как использовать сегменты PATH_INFO (например, index.php/42) вместо параметра GET?

Некоторые серверы поддерживают $_SERVER['PATH_INFO']. Пример: index.php/42. Извлечение идентификатора:

$path = $_SERVER['PATH_INFO'] ?? '';
$id = ltrim($path, '/');
if (ctype_digit($id)) { /* запрос */ }

Chat index php (создание чата на php)

Этот подход редко используется из-за различной поддержки на серверах и потенциальных проблем с относительными ссылками.

На многих хостах PATH_INFO не заполняется или интерпретируется как часть пути к файлу. Тестируйте на целевой платформе.

Как безопасно передавать id через POST при редактировании записи?

Для форм редактирования лучше использовать POST с подтверждением. Идентификатор передается скрытым полем:

<form action="edit.php" method="post">
    <input type="hidden" name="id" value="<?= $post['id'] ?>">
    <textarea name="content"><?= htmlspecialchars($post['content']) ?></textarea>
    <input type="submit" value="Сохранить">
</form>

В скрипте проверяется источник запроса (токен CSRF) и используется подготовленный запрос.

Ошибка: отсутствие проверки CSRF-токена позволяет злоумышленнику изменять записи от имени администратора. Всегда добавляйте уникальный токен в форму и проверяйте его на сервере.

Подробные примеры реализации блога с идентификатором

Пример 1. Простейший скрипт с PDO и валидацией

Полный код файла index.php с подключением к MySQL, обработкой id и выводом.

Пример
<?php
// config.php – настройки БД
try {
    $pdo = new PDO('mysql:host=localhost;dbname=blog;charset=utf8', 'user', 'pass');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Ошибка соединения');
}

// index.php – основной скрипт
$action = $_GET['action'] ?? 'list';
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;

if ($action === 'view' && $id > 0) {
    $stmt = $pdo->prepare('SELECT * FROM posts WHERE id = ? AND active = 1');
    $stmt->execute([$id]);
    $post = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$post) {
        http_response_code(404);
        echo 'Статья не найдена.';
        exit;
    }
    echo '<h2>' . htmlspecialchars($post['title']) . '</h2>';
    echo '<div>' . nl2br(htmlspecialchars($post['body'])) . '</div>';
    echo '<p>Автор: ' . htmlspecialchars($post['author']) . '</p>';
} else {
    // список записей
    $stmt = $pdo->query('SELECT id, title FROM posts WHERE active=1 ORDER BY created_at DESC LIMIT 10');
    echo '<ul>';
    while ($row = $stmt->fetch()) {
        echo '<li><a href="?action=view&id=' . $row['id'] . '">' . htmlspecialchars($row['title']) . '</a></li>';
    }
    echo '</ul>';
}
?>
Результат: при переходе по ссылке ?action=view&id=1 отображается статья с заголовком, телом и автором. Список содержит первые 10 активных записей.

Пример 2. Маршрутизация через .htaccess с единой точкой входа

Создаётся файл .htaccess и index.php, который обрабатывает все запросы.

Пример
# .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

// index.php
$route = $_GET['route'] ?? '';
if (preg_match('#^post/(\d+)$#', $route, $matches)) {
    $id = (int)$matches[1];
    // далее как в примере 1
} else {
    echo 'Главная страница блога';
}
URL вида /post/5 отображает запись с id=5. Все несуществующие пути ведут на index.php.

Пример 3. Использование подготовленных запросов для разных типов id (integer и string)

Если идентификатор может быть строкой (slug), используйте разные запросы с проверкой регулярного выражения или приведением.

Пример
function findPost($pdo, $id) {
    if (ctype_digit($id)) {
        $stmt = $pdo->prepare('SELECT * FROM posts WHERE id = ?');
    } else {
        $stmt = $pdo->prepare('SELECT * FROM posts WHERE slug = ?');
    }
    $stmt->execute([$id]);
    return $stmt->fetch(PDO::FETCH_ASSOC);
}
// пример вызова
$post = findPost($pdo, $_GET['id'] ?? '');
Функция автоматически определяет тип идентификатора и выполняет нужный запрос.

Пример 4. Обработка исключений и дружественные ошибки

Оберните код в try-catch, чтобы при ошибке БД показывать страницу 500 с сообщением для администратора.

Пример
try {
    // все операции с БД
} catch (PDOException $e) {
    error_log($e->getMessage());
    http_response_code(500);
    echo '<h2>Внутренняя ошибка сервера. Попробуйте позже.</h2>';
    exit;
}
В лог пишется реальная ошибка, пользователь видит общее сообщение.

Пример 5. Интеграция с простым шаблонизатором (include)

Отделите отображение от логики: создайте файлы шаблонов header.php, post.php, footer.php и подключайте их.

Пример
// index.php
include 'templates/header.php';
if (isset($post)) {
    include 'templates/post.php';
} else {
    include 'templates/list.php';
}
include 'templates/footer.php';

// templates/post.php
<h2><?= htmlspecialchars($post['title']) ?></h2>
<div><?= nl2br(htmlspecialchars($post['body'])) ?></div>
Код становится чище, проще менять вёрстку.

Блог на PHP с идентификатором - comments

En
Index php blog id (php)