Организация выбора контента по идентификатору в 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.
Расширенные примеры вывода контента по 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.