Способы получения результатов работы скриптов в PHP

Раздел: PHP программирование -> Обработка результатов запросов

Основные методы получения данных после выполнения запросов

Как корректно извлечь строки из базы данных с помощью PDO?

PDO (PHP Data Objects)

– это универсальный интерфейс для работы с базами данных. Для получения результатов после выполнения SQL-запроса применяются методы fetch(), fetchAll() и fetchColumn(). Пример получения всех строк в виде ассоциативного массива:


$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->query('SELECT id, name FROM users');
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($users);
  

Php get results (получение результатов в php)

Метод query() возвращает объект PDOStatement, у которого вызывается fetchAll() с режимом выборки. Режим PDO::FETCH_ASSOC возвращает только именованные ключи. Для обработки каждой строки по отдельности используется цикл:


while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['name'] . "\n";
}
  

Типичная ошибка:

забыть обработать исключение при подключении. PDO по умолчанию не выбрасывает исключения – их нужно включить: $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);. Без этого ошибка запроса останется незамеченной.

Как получить данные через MySQLi в процедурном стиле?

MySQLi (MySQL Improved) предлагает процедурный и объектно-ориентированный интерфейсы. Пример процедурного подхода:


$conn = mysqli_connect('localhost', 'user', 'pass', 'test');
if (!$conn) { die('Connection error: ' . mysqli_connect_error()); }
$result = mysqli_query($conn, 'SELECT id, name FROM users');
while ($row = mysqli_fetch_assoc($result)) {
    echo $row['name'] . "\n";
}
mysqli_free_result($result);
mysqli_close($conn);
  

Функция mysqli_fetch_assoc() извлекает одну строку в виде ассоциативного массива. Доступны также mysqli_fetch_row() (числовой индекс) и mysqli_fetch_object(). После работы с результатом его необходимо освободить.

Проблема:

при большом количестве запросов в процедурном стиле легко забыть освободить память. Альтернатива – объектный стиль с автоматическим освобождением при уничтожении объекта.

Как получить ответ от внешнего REST API с помощью file_get_contents?

Функция file_get_contents() позволяет читать содержимое URL. Для получения данных по протоколу HTTP используется контекст потока:


$options = [
    'http' => [
        'method' => 'GET',
        'header' => "Accept: application/json\r\n"
    ]
];
$context = stream_context_create($options);
$response = file_get_contents('https://api.example.com/users', false, $context);
if ($response === false) {
    // обработка ошибки
} else {
    $data = json_decode($response, true);
    print_r($data);
}
  

Опция false вторым параметром отключает использование локального include-пути. Третий параметр – контекст, в котором задаются HTTP-заголовки. Результат – строка, которую затем парсят (например, json_decode).

Распространённая ошибка:

не проверять успешность HTTP-запроса. По умолчанию file_get_contents не генерирует ошибку при коде 4xx/5xx – нужно самостоятельно анализировать содержимое или использовать контекст с ignore_errors: 'http' => ['ignore_errors' => true] и затем проверять HTTP-статус через $http_response_header.

Как отправить POST запрос и получить результат с помощью cURL?

cURL – мощная библиотека для работы с HTTP. Пример POST-запроса с передачей JSON:


$ch = curl_init('https://api.example.com/users');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => json_encode(['name' => 'John']),
    CURLOPT_HTTPHEADER => ['Content-Type: application/json']
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode >= 200 && $httpCode < 300) {
    $data = json_decode($response, true);
} else {
    // логирование ошибки
}
  

Настройка CURLOPT_RETURNTRANSFER возвращает ответ в переменную, а не выводит напрямую. После выполнения проверяется HTTP-код ответа. Для отладки можно включить CURLOPT_VERBOSE.

Типичная ошибка:

игнорирование таймаутов. Сервер может не ответить – следует установить CURLOPT_TIMEOUT и CURLOPT_CONNECTTIMEOUT. Также необходимо проверять возвращаемое значение curl_exec() – при ошибке оно равно false.

Как обработать данные из суперглобальных массивов \( \$_GET \) и \( \$_POST \)?

При обработке HTML-форм PHP автоматически заполняет массивы $_GET и $_POST. Доступ к значениям осуществляется по ключам, соответствующим атрибутам name полей формы:


if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';
    // валидация и дальнейшая обработка
}
  

Оператор ?? (null coalescing) присваивает значение по умолчанию, если ключ отсутствует. Для проверки существования ключа можно использовать isset() или filter_input().

Проблема:

данные из внешних источников не должны использоваться без фильтрации. Стандартная практика – применять фильтры filter_input() (например, FILTER_SANITIZE_STRING) для предотвращения XSS-атак и SQL-инъекций.

Расширенные примеры получения и обработки результатов

1. PDO: выборка с использованием подготовленных выражений и разных режимов

Пример

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
]);
$stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE active = ?');
$stmt->execute([1]);

// fetchObject – получение объекта stdClass
while ($user = $stmt->fetch()) {
    echo $user->name . ' (' . $user->email . ")\n";
}

// fetchColumn – получение значения одного столбца из первой строки
$countStmt = $pdo->query('SELECT COUNT(*) FROM users');
$totalUsers = $countStmt->fetchColumn();
echo "Всего пользователей: $totalUsers\n";

// fetchAll с группировкой по столбцу
$stmt = $pdo->query('SELECT category, product FROM catalog ORDER BY category');
$grouped = $stmt->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);
print_r($grouped);
John (john@example.com)
Jane (jane@example.com)
Всего пользователей: 25
Array
(
    [Electronics] => Array
        (
            [0] => Array ( [category] => Electronics, [product] => Laptop )
            [1] => Array ( [category] => Electronics, [product] => Mouse )
        )
    [Books] => Array
        (
            [0] => Array ( [category] => Books, [product] => PHP Manual )
        )
)

2. MySQLi: объектно-ориентированный стиль с подготовленными запросами

Пример

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
if ($mysqli->connect_errno) {
    die('Connect Error: ' . $mysqli->connect_error);
}
$stmt = $mysqli->prepare('SELECT name, created_at FROM users WHERE id > ?');
$stmt->bind_param('i', $minId);
$minId = 10;
$stmt->execute();
$stmt->bind_result($name, $createdAt);
while ($stmt->fetch()) {
    echo "$name (зарегистрирован $createdAt)\n";
}
$stmt->close();
$mysqli->close();
Alice (зарегистрирован 2023-05-12)
Bob (зарегистрирован 2023-06-18)

3. cURL: обработка заголовков и куки, работа с API, требующим аутентификации

Пример

$ch = curl_init('https://api.github.com/repos/php/php-src');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'User-Agent: MyPHPApp/1.0',
        'Accept: application/vnd.github.v3+json'
    ],
    CURLOPT_TIMEOUT => 10,
    CURLOPT_COOKIEFILE => '/tmp/cookies.txt',
    CURLOPT_COOKIEJAR => '/tmp/cookies.txt'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
curl_close($ch);
if ($httpCode === 200) {
    $repoInfo = json_decode($body, true);
    echo "Репозиторий: {$repoInfo['full_name']}\n";
    echo "Звёзд: {$repoInfo['stargazers_count']}\n";
} else {
    echo "Ошибка HTTP $httpCode: $body\n";
}
Репозиторий: php/php-src
Звёзд: 37000

4. file_get_contents с обработкой ошибок и проверкой HTTP-статуса

Пример

$url = 'https://api.example.com/data';
$context = stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => "Accept: application/json\r\n",
        'ignore_errors' => true,
        'timeout' => 5
    ]
]);
$response = @file_get_contents($url, false, $context);
if ($response === false) {
    $error = error_get_last();
    echo "Не удалось выполнить запрос: {$error['message']}\n";
} else {
    // $http_response_header – массив заголовков ответа
    $statusLine = $http_response_header[0];
    preg_match('/\d{3}/', $statusLine, $matches);
    $httpCode = (int)$matches[0];
    if ($httpCode >= 200 && $httpCode < 300) {
        $data = json_decode($response, true);
        if (json_last_error() === JSON_ERROR_NONE) {
            print_r($data);
        } else {
            echo "Ошибка парсинга JSON: " . json_last_error_msg() . "\n";
        }
    } else {
        echo "HTTP код $httpCode: $response\n";
    }
}
Array
(
    [status] => success
    [data] => Array
        (
            [id] => 42
            [title] => Example
        )
)

5. Обработка результатов из формы с фильтрацией и валидацией

Пример

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 120]]);
    $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
    if ($email === false || $age === false || $name === false) {
        echo 'Ошибка валидации входных данных';
    } else {
        echo "Привет, $name! Тебе $age лет. Email: $email";
    }
}
(при отправке формы с корректными данными)
Привет, Иван! Тебе 30 лет. Email: ivan@example.com

Получение результатов в PHP - comments

En
Php get results (php)