Pg field is null: примеры (PHP)

Проверка NULL значений в PostgreSQL с помощью pg_field_is_null
Раздел: Базы данных (PostgreSQL)
pg_field_is_null(PgSql\Result $result, $row = ?, $field = ?): int|false
Описание функции pg_field_is_null

Функция pg_field_is_null в PHP используется для определения, содержит ли значение определенного поля в результате запроса к PostgreSQL значение NULL. Это важно при обработке данных, полученных из базы данных, где необходимо отличать NULL от других значений, включая пустые строки или нули.

Функция используется после выполнения запроса с помощью pg_query или подобных функций, когда нужно проверить отдельные значения в строке результата на NULL.

Аргументы функции
  • $result (ресурс) - обязательный аргумент. Ресурс результата запроса PostgreSQL, возвращаемый функциями pg_query, pg_query_params или pg_execute.
  • $row (int) - обязательный аргумент. Номер строки в результате запроса. Нумерация начинается с 0.
  • $field (string|int) - обязательный аргумент. Может быть строкой (имя поля) или целым числом (номер поля, начиная с 0).

Возвращает 1, если значение поля равно NULL, 0 если не NULL, и -1 в случае ошибки.

Примеры использования

Рассмотрим несколько вариантов вызова функции с разными типами аргументов.

Пример 1: Проверка по номеру поля
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT id, name, value FROM items");
$row = 0;
// Проверяем второе поле (name) в первой строке
$isNull = pg_field_is_null($result, $row, 1);
echo "Результат: ";
var_dump($isNull);
Результат: int(0) // если поле не NULL
Пример 2: Проверка по имени поля
$isNull = pg_field_is_null($result, 2, 'value');
echo "Результат: ";
var_dump($isNull);
Результат: int(1) // если поле содержит NULL
Пример 3: Ошибочный вызов
$isNull = pg_field_is_null($result, 100, 'nonexistent');
echo "Результат: ";
var_dump($isNull);
Результат: int(-1) // ошибка, неверный номер строки или имя поля
Похожие функции в PHP
  • pg_fetch_result - возвращает значение поля, при этом NULL возвращается как NULL. Позволяет получать значения без дополнительной проверки на NULL, но требует последующего сравнения с помощью is_null.
  • pg_fetch_assoc/pg_fetch_row - возвращают всю строку в виде массива. Для проверки на NULL нужно использовать is_null для конкретного элемента массива.
  • is_null - стандартная функция PHP для проверки переменной на NULL. Используется после получения значения из результата запроса.

Функцию pg_field_is_null предпочтительнее использовать, когда нужно проверить значение на NULL без извлечения самого значения, особенно при работе с большими результатами, чтобы избежать лишнего копирования данных.

Аналоги в других языках
Python (psycopg2)

В Python для работы с PostgreSQL часто используется библиотека psycopg2. Значение NULL представлено как None. Проверка выполняется стандартными средствами Python.

import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT id, name FROM items")
row = cur.fetchone()
# Проверка второго поля на None (аналог NULL)
if row[1] is None:
    print("Поле равно NULL")
Поле равно NULL // если значение отсутствует
JavaScript (Node.js, pg библиотека)

В JavaScript с библиотекой 'pg' значения NULL возвращаются как null. Проверка выполняется оператором строгого равенства.

const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT id, name FROM items');
const row = res.rows[0];
// Проверка поля name на null
if (row.name === null) {
    console.log('Поле равно NULL');
}
Поле равно NULL // если значение null
MySQL (PHP)

В PHP для MySQL существует функция mysqli_fetch_field_direct в сочетании с проверкой флага, но обычно значение NULL проверяется после получения строки с помощью is_null.

// Для MySQLi
$result = $mysqli->query("SELECT id, name FROM items");
$row = $result->fetch_assoc();
if (is_null($row['name'])) {
    echo 'Поле равно NULL';
}
Поле равно NULL
Типичные ошибки
Ошибка 1: Передача неверного типа аргумента
$result = pg_query($conn, "SELECT id FROM items");
// Передаем строку вместо числа для номера строки
$isNull = pg_field_is_null($result, 'string', 0);
echo "Результат: ";
var_dump($isNull);
Результат: int(-1) // ошибка
Ошибка 2: Использование несуществующего имени поля
$isNull = pg_field_is_null($result, 0, 'несуществующее_поле');
echo "Результат: ";
var_dump($isNull);
Результат: int(-1) // ошибка
Ошибка 3: Проверка значения после закрытия результата
pg_free_result($result);
$isNull = pg_field_is_null($result, 0, 'id');
// Может вызвать предупреждение и вернуть -1
Warning: pg_field_is_null(): supplied resource is not a valid PostgreSQL result resource
Изменения в версиях PHP

Начиная с PHP 8.0, функция выбрасывает исключение TypeError при передаче аргументов неверного типа, вместо предупреждений. В более ранних версиях (PHP 7.x) функция возвращала -1 и могла генерировать предупреждения.

// В PHP 8.0+
try {
    pg_field_is_null('not_a_result', 0, 0);
} catch (TypeError $e) {
    echo $e->getMessage();
}
pg_field_is_null(): supplied resource is not a valid PostgreSQL result resource
Расширенные примеры
Пример 1: Итерация по всем полям строки с проверкой на NULL
Пример php
$result = pg_query($conn, "SELECT id, name, description FROM items LIMIT 1");
$rowNum = 0;
$fieldCount = pg_num_fields($result);
for ($i = 0; $i < $fieldCount; $i++) {
    $fieldName = pg_field_name($result, $i);
    $isNull = pg_field_is_null($result, $rowNum, $i);
    echo "Поле {$fieldName}: " . ($isNull === 1 ? 'NULL' : 'не NULL') . "\n";
}
Поле id: не NULL
Поле name: NULL
Поле description: не NULL
Пример 2: Сравнение с другими функциями для проверки NULL
Пример php
// Получаем значение поля
$value = pg_fetch_result($result, 0, 'name');
// Проверяем разными способами
$viaFunction = pg_field_is_null($result, 0, 'name');
$viaIsNull = is_null($value);
echo "pg_field_is_null: {$viaFunction}, is_null: " . ($viaIsNull ? 'true' : 'false');
pg_field_is_null: 1, is_null: true
Пример 3: Обработка NULL в условиях
Пример php
$result = pg_query($conn, "SELECT * FROM items");
while ($row = pg_fetch_assoc($result)) {
    // Используем pg_field_is_null для проверки конкретного поля в текущей строке
    $currentRow = pg_result_seek($result, pg_num_rows($result) - 1); // переходим к текущей строке
    $isNull = pg_field_is_null($result, pg_num_rows($result) - 1, 'price');
    if ($isNull === 1) {
        echo "Товар ID: {$row['id']} не имеет цены\n";
    }
}
Товар ID: 5 не имеет цены
Товар ID: 8 не имеет цены

PHP pg_field_is_null function comments

En
Pg field is null Test if a field is SQL NULL