W3docs

fetch_lengths

Функция mysqli_fetch_lengths() в PHP: синтаксис, возвращаемые значения, объектно-ориентированный стиль и типичные ошибки.

В этой статье мы рассмотрим функцию mysqli_fetch_lengths() в PHP. Она возвращает array, содержащий длины каждого столбца в текущей строке результирующего набора MySQLi. Мы разберём её синтаксис, возвращаемые значения, объектно-ориентированный эквивалент, типичные сценарии использования и подводные камни.

Что делает mysqli_fetch_lengths()

Функция mysqli_fetch_lengths() — встроенная функция PHP, которая возвращает длины (в байтах) значений каждого столбца в строке, выбранной последним обращением к fetch из результирующего набора MySQLi. Она не считывает саму строку, а сообщает байтовую длину каждого столбца строки, на которой в данный момент стоит указатель результата.

Это важно, потому что MySQL передаёт клиенту все данные в виде байтов, а возвращаемая длина — это реальный размер данных, а не максимальный размер, определённый для столбца. Например, столбец VARCHAR(255), в котором хранится строка "hello", вернёт длину 5, а не 255. Для многобайтового (UTF-8) текста длина указывается в байтах, что может превышать количество символов.

Синтаксис

mysqli_fetch_lengths(mysqli_result $result): array|false
  • $result — объект результата, возвращённый функциями mysqli_query(), mysqli_store_result() или mysqli_use_result().
  • Возвращает: числовой array длин столбцов для текущей строки, или false, если ни одна строка ещё не была выбрана (или при ошибке).

Когда использовать

Функция mysqli_fetch_lengths() нужна тогда, когда размер возвращаемых данных так же важен, как и сами данные:

  • Работа с двоичными / BLOB-столбцами, где необходимо знать точное количество байт перед обработкой.
  • Защитные проверки — подтверждение того, что столбец действительно вернул данные, а не пустую string.
  • Логирование, отладка или диагностика объёма данных, возвращаемых каждым запросом.

Поскольку функция зависит от указателя строки, вызывать её нужно после fetch (mysqli_fetch_row(), mysqli_fetch_array() или mysqli_fetch_assoc()) и до того, как следующий fetch сдвинет указатель.

Как использовать функцию mysqli_fetch_lengths()

mysqli_fetch_lengths() работает с указателем на текущую строку, поэтому её обычно вызывают внутри цикла fetch, сразу после получения строки:

<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");

if (!$mysqli) {
    die("Connection failed: " . mysqli_connect_error());
}

$query = "SELECT * FROM my_table";
$result = mysqli_query($mysqli, $query);

if ($result) {
    while ($row = mysqli_fetch_row($result)) {
        $lengths = mysqli_fetch_lengths($result);
        if ($lengths !== false) {
            for ($i = 0; $i < count($lengths); $i++) {
                printf("Length of column %d: %d\n", $i, $lengths[$i]);
            }
        }
    }
}

mysqli_close($mysqli);
?>

В этом примере мы подключаемся к базе данных и выполняем запрос. Мы проверяем успешность подключения и выполнения запроса. Внутри цикла while функция mysqli_fetch_row() перемещает указатель строки к следующей строке. Затем мы вызываем mysqli_fetch_lengths(), чтобы получить array длин столбцов этой строки. Функция возвращает false при ошибке, поэтому мы проверяем результат перед тем, как в цикле for выводим длины.

Объектно-ориентированный стиль

Та же операция доступна как метод объекта mysqli_result. Большинство современного кода использует именно этот стиль:

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_errno) {
    die("Connection failed: " . $mysqli->connect_error);
}

$result = $mysqli->query("SELECT id, name FROM my_table");

if ($result) {
    while ($row = $result->fetch_row()) {
        $lengths = $result->lengths; // property, not a method call
        printf("id length: %d, name length: %d\n", $lengths[0], $lengths[1]);
    }
}

$mysqli->close();
?>

Обратите внимание: в ООП-стиле длины доступны через доступное только для чтения свойство $result->lengths, а не через вызов метода.

Типичные ошибки

  • Вызывайте функцию после fetch, а не до него. Если вызвать mysqli_fetch_lengths() до получения какой-либо строки, она вернёт false — указателю строки нечего измерять.
  • Длины указываются в байтах. Для многобайтового текста (например, UTF-8) байтовая длина может превышать количество символов. Используйте mb_strlen(), если нужно количество символов.
  • Функция отражает только текущую строку. Вызов после получения следующей строки вернёт длины уже для той строки, поэтому сохраняйте array, если нужны предыдущие значения.
  • Столбцы со значением NULL возвращают длину 0, как и пустая string — используйте полученное значение, чтобы отличить одно от другого.

Связанные функции

  • mysqli_fetch_row() — получить строку в виде числового array (часто используется совместно с данной функцией).
  • mysqli_fetch_array() и mysqli_fetch_assoc() — получить строку в виде числового/ассоциативного или ассоциативного array.
  • mysqli_fetch_fields() — получить метаданные (имя, тип, максимальную длину) каждого столбца.
  • mysqli_field_count() — получить количество столбцов в последнем запросе.

Заключение

Функция mysqli_fetch_lengths() — удобный инструмент для получения байтового размера каждого столбца в текущей строке результирующего набора MySQLi. Помните, что она работает с последней полученной строкой, возвращает длины в байтах и возвращает false, когда строка недоступна — соблюдение этих правил позволяет надёжно интегрировать её в рабочие процессы с базами данных.

Практика

Практика
Что делает функция mysqli_fetch_lengths в PHP?
Что делает функция mysqli_fetch_lengths в PHP?
Was this page helpful?