Создание контента на PHP через метод POST: практические примеры

Раздел: Веб-разработка на PHP -> Создание контента

Основные подходы к созданию нового поста в 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'); }
Защита от межсайтовой подделки запроса.

Новый пост в PHP - comments

En
Post php new (php)