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, когда строка недоступна — соблюдение этих правил позволяет надёжно интегрировать её в рабочие процессы с базами данных.