Способы получения результатов работы скриптов в 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