Организация выбора контента по идентификатору в PHP

Раздел: Веб-разработка -> Управление контентом

Основные подходы к выводу контента по ID

Эффективное решение: получение контента из базы данных через PDO с параметризованным запросом

Этот подход обеспечивает безопасность и гибкость. Контент хранится в таблице БД, например, content с полями id, title, body. URL строится как index.php?content_id=9. Код читает параметр и выполняет запрос.

// index.php
$id = filter_input(INPUT_GET, 'content_id', FILTER_VALIDATE_INT);
if ($id === false || $id === null) {
    die('Неверный идентификатор');
}

try {
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
    $stmt = $pdo->prepare('SELECT * FROM content WHERE id = :id');
    $stmt->execute([':id' => $id]);
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($row) {
        echo '

' . htmlspecialchars($row['title']) . '

'; echo '
' . $row['body'] . '
'; } else { echo 'Контент не найден.'; } } catch (PDOException $e) { echo 'Ошибка базы данных: ' . $e->getMessage(); }

Null php contents (проверка на null в php (контент))

Проблема и её решение:

Использование неподготовленного запроса ("SELECT * FROM content WHERE id = $id") приводит к SQL-инъекциям. Решение - применение подготовленных выражений (prepared statements) как в примере выше. Также важно фильтровать входные данные: filter_input с FILTER_VALIDATE_INT гарантирует, что в $id попадёт только целое число или false.

Вариант 1: Как вывести контент из файловой системы по номеру ID?

Контент хранится в файлах, например content/9.html. Скрипт определяет путь и подключает файл.

$id = filter_input(INPUT_GET, 'content_id', FILTER_VALIDATE_INT);
if ($id === null || $id === false) {
    exit('Некорректный ID');
}
$file = __DIR__ . '/content/' . $id . '.html';
if (file_exists($file)) {
    readfile($file);
} else {
    echo 'Файл не найден';
}

Index php content id 9 (вывод контента по id в php)

Ошибки и решения:

Уязвимость path traversal: злоумышленник может передать content_id=../config. Фильтрация через FILTER_VALIDATE_INT предотвращает это, так как допускаются только числа. Если ID может быть строкой, используйте белый список или проверку через preg_match('/^[a-z0-9]+$/', $id).

Вариант 2: Как определить какой текст показать для каждого ID без базы данных?

Используется конструкция match или switch для статического набора ID.

$id = filter_input(INPUT_GET, 'content_id', FILTER_VALIDATE_INT);

$content = match ($id) {
    1 => 'Текст для ID 1',
    2 => 'Текст для ID 2',
    9 => 'Текст для ID 9',
    default => 'Страница не найдена'
};
echo $content;

Index php categories (категории контента)

Проблема:

При большом количестве ID код становится громоздким. Решение - хранить массив в отдельном файле или использовать базу данных.

Вариант 3: Как получить контент по ID из внешнего API?

Используется file_get_contents или cURL для получения данных в JSON и их парсинга.

$id = filter_input(INPUT_GET, 'content_id', FILTER_VALIDATE_INT);
if ($id === null) {
    exit('Нет ID');
}
$url = "https://api.example.com/content/$id";
$json = file_get_contents($url);
if ($json === false) {
    exit('Ошибка запроса');
}
$data = json_decode($json, true);
if ($data) {
    echo '

' . htmlspecialchars($data['title']) . '

'; echo '

' . htmlspecialchars($data['body']) . '

'; } else { echo 'Контент не найден'; }

Типичные ошибки:

Необработанные исключения при недоступности API (используйте try-catch). Также проверяйте HTTP-код ответа через $http_response_header или cURL.

- Content pages php page (страница контента на php)

Расширенные примеры вывода контента по ID

Пример 1: Полноценный класс для работы с БД

Пример
class ContentManager {
    private PDO $pdo;

    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }

    public function getById(int $id): ?array {
        $stmt = $this->pdo->prepare('SELECT id, title, body FROM content WHERE id = :id');
        $stmt->execute([':id' => $id]);
        return $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
    }
}

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$manager = new ContentManager($pdo);
$id = (int) ($_GET['content_id'] ?? 0);
$content = $manager->getById($id);

if ($content) {
    echo '

' . htmlspecialchars($content['title']) . '

'; echo '
' . $content['body'] . '
'; } else { header('HTTP/1.0 404 Not Found'); echo '404 - контент не найден'; }
Результат: страница с заголовком и телом контента, либо 404 при отсутствии.

Пример 2: Извлечение ID из ЧПУ через .htaccess

Пример
# .htaccess
RewriteEngine On
RewriteRule ^content/([0-9]+)$ index.php?content_id=$1 [L,QSA]
Пример
// index.php
$id = filter_input(INPUT_GET, 'content_id', FILTER_VALIDATE_INT);
if ($id) {
    // далее как в базовом решении
}
URL вида /content/9 обрабатывается как index.php?content_id=9.

Пример 3: Вывод в формате JSON для AJAX

Пример
header('Content-Type: application/json; charset=utf-8');
$id = filter_input(INPUT_GET, 'content_id', FILTER_VALIDATE_INT);
if (!$id) {
    echo json_encode(['error' => 'Invalid ID']);
    exit;
}
$pdo = new PDO('mysql:host=...;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT id, title, body FROM content WHERE id = ?');
$stmt->execute([$id]);
$content = $stmt->fetch(PDO::FETCH_ASSOC);
echo json_encode($content ?: ['error' => 'Not found']);
{"id":9,"title":"Заголовок","body":"

Текст

"}

Пример 4: Обработка множественных ID через массив

Пример
// index.php?ids[]=1&ids[]=9&ids[]=12
$ids = filter_input(INPUT_GET, 'ids', FILTER_VALIDATE_INT, FILTER_REQUIRE_ARRAY);
if (empty($ids)) {
    exit('Нет ID');
}
$placeholders = implode(',', array_fill(0, count($ids), '?'));
$stmt = $pdo->prepare("SELECT id, title FROM content WHERE id IN ($placeholders)");
$stmt->execute($ids);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $row) {
    echo '

' . htmlspecialchars($row['title']) . '

'; }
Выводятся заголовки для нескольких ID.

Вывод контента по ID в PHP - comments

En
Index php content id 9 (php)