Создание контента на PHP через метод POST: практические примеры
Основные подходы к созданию нового поста в PHP
Наиболее эффективное и безопасное решение для создания нового поста - использование PDO с подготовленными запросами. Это позволяет защититься от SQL инъекций и легко адаптировать код под разные СУБД.
Пример реализации:
// index.php (форма)
// save.php
$pdo = new PDO('mysql:host=localhost;dbname=blog', 'user', 'pass');
$title = $_POST['title'] ?? '';
$content = $_POST['content'] ?? '';
// валидация
if (empty($title)) { die('Заголовок обязателен'); }
$stmt = $pdo->prepare('INSERT INTO posts (title, content, created_at) VALUES (:title, :content, NOW())');
$stmt->execute([':title' => $title, ':content' => $content]);
echo 'Пост создан';Пояснение: переменные подставляются через плейсхолдеры, что исключает их интерпретацию как SQL кода. Валидация перед запросом предотвращает пустые данные.
Типичные ошибки: неправильное имя плейсхолдера (двоеточие обязательно), отсутствие обработки исключений, забытая фильтрация вывода (XSS при отображении). Решение: использовать try-catch, а для вывода применять htmlspecialchars.
Как добавить пост с помощью устаревших функций mysql_*?
// Устаревший код (PHP < 7)
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('blog');
$title = $_POST['title'];
$query = "INSERT INTO posts (title) VALUES ('$title')";
mysql_query($query);Проблемы: функции удалены в PHP 7, строка $title не экранируется, возможна SQL инъекция. Решение: не использовать, перейти на PDO.
Как сохранить новый пост в текстовый файл?
$data = $_POST['title'] . '|' . $_POST['content'] . PHP_EOL;
file_put_contents('posts.txt', $data, FILE_APPEND);Проблемы: отсутствие структуры, проблемы с многопоточностью (конкурентная запись), сложность поиска. Подходит только для прототипов.
Как очистить данные POST с помощью filter_var?
$title = filter_input(INPUT_POST, 'title', FILTER_SANITIZE_STRING);
$content = filter_input(INPUT_POST, 'content', FILTER_SANITIZE_STRING);Проблемы: санитизация не гарантирует безопасность, например, SQL инъекция все еще возможна при вставке. filter_var может удалять теги, но не защищает от всех атак. Требуется дополнительная валидация.
Как валидировать данные поста с помощью Respect\Validation?
use Respect\Validation\Validator as v;
$title = $_POST['title'];
if (v::stringType()->notEmpty()->length(1, 255)->validate($title)) {
// вставка
} else {
// ошибка
}Проблемы: требуется установка библиотеки, излишне для простых проектов, но удобно для сложных правил.
Как обработать POST запрос в Laravel для создания поста?
// В контроллере
use Illuminate\Http\Request;
public function store(Request $request) {
$request->validate(['title' => 'required|max:255']);
Post::create($request->all());
return redirect()->back()->with('success', 'Пост создан');
}Проблемы: фреймворк имеет высокую сложность для маленьких проектов, но обеспечивает высокую безопасность и скорость разработки.
Расширенные примеры создания постов
Создание поста с загрузкой изображения
// HTML: enctype='multipart/form-data'
// PHP
if (isset($_FILES['image'])) {
$allowed = ['image/jpeg', 'image/png'];
if (in_array($_FILES['image']['type'], $allowed) && $_FILES['image']['size'] < 2*1024*1024) {
$path = 'uploads/' . uniqid() . '.' . pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);
move_uploaded_file($_FILES['image']['tmp_name'], $path);
// сохраняем $path в БД
}
}Изображение загружено, путь сохранен в базе.
AJAX отправка формы (JSON)
// client.js
fetch('api/post', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({title, content}) });
// server.php
$data = json_decode(file_get_contents('php://input'), true);
$title = $data['title'] ?? '';
// ...На сервере получен JSON, обработан и возвращен ответ.
REST API с возвратом JSON
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// ... вставка
echo json_encode(['status' => 'ok', 'id' => $pdo->lastInsertId()]);
}{"status":"ok","id":1}Вставка нескольких постов в транзакции
$pdo->beginTransaction();
foreach ($posts as $post) {
$stmt->execute($post);
}
$pdo->commit();Все посты вставлены атомарно.
Использование CSRF токена
session_start();
if ($_POST['_token'] !== $_SESSION['token']) { die('CSRF detected'); }Защита от межсайтовой подделки запроса.