W3docs

get_server_version

В этой статье рассматривается функция mysqli_get_server_version() в PHP, которая возвращает номер версии MySQL-сервера в виде целого числа.

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

Введение в функцию mysqli_get_server_version()

Функция mysqli_get_server_version() — это встроенная функция PHP, которая возвращает версию подключённого MySQL-сервера в виде одного целого числа. Она принимает один аргумент — открытое соединение MySQLi — и возвращает число, например 80037.

int mysqli_get_server_version(mysqli $mysql)

Целое число кодируется по следующей формуле:

main_version * 10000 + minor_version * 100 + sub_version

Таким образом, MySQL 8.0.37 преобразуется в 8 * 10000 + 0 * 100 + 37 = 80037, а MySQL 5.7.29 — в 50729. Поскольку значение является обычным целым числом, оно наиболее надёжно для использования в числовых сравнениях — вам не нужно разбирать string вроде "8.0.37-0ubuntu0.22.04.1".

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

Вызовите функцию для действующего соединения MySQLi. Всегда сначала убедитесь, что соединение установлено успешно, иначе вы передадите недопустимый дескриптор:

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

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

$server_version = mysqli_get_server_version($mysqli);

echo "Server version (integer): " . $server_version;

mysqli_close($mysqli);
?>

Здесь мы открываем соединение с помощью mysqli_connect(), проверяем его, затем считываем версию. Для сервера MySQL 8.0.37 вывод будет следующим:

Server version (integer): 80037

Функция также работает в объектно-ориентированном стиле — $mysqli->server_version является эквивалентом процедурного вызова в виде свойства.

Декодирование номера версии

Поскольку результат закодирован, зачастую нужно преобразовать его обратно в читаемую строку MAJOR.MINOR.PATCH. Обратите формулу с помощью целочисленного деления и оператора остатка от деления:

<?php
$version = 80037; // value returned by mysqli_get_server_version()

$major = intdiv($version, 10000);
$minor = intdiv($version % 10000, 100);
$patch = $version % 100;

echo "MySQL {$major}.{$minor}.{$patch}";
?>

Это выведет:

MySQL 8.0.37

Когда использовать (и что использовать вместо)

  • Используйте mysqli_get_server_version(), когда нужно сравнивать версии в коде — например, чтобы включить функцию только на MySQL 8.0 и новее. Числовая проверка вида if ($mysqli->get_server_version() >= 80000) проще и безопаснее, чем разбор строки.
  • Используйте mysqli_get_server_info(), когда нужна полная читаемая версия в виде строки (string) (включая суффиксы дистрибутива) для журналирования или отображения.
  • Используйте mysqli_get_client_version(), когда нужна версия клиентской библиотеки MySQL, с которой скомпилирован PHP, а не версия сервера, с которым он взаимодействует.

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

  • Функция возвращает версию сервера, а не самого PHP. Для получения версии PHP-среды выполнения используйте phpversion() или константу PHP_VERSION.
  • Для работы функции требуется установленное соединение. Если mysqli_connect() завершился ошибкой, перед вызовом этой функции проверьте mysqli_connect_error().
  • Целое число не совпадает со значением строки, возвращаемой mysqli_get_server_info(); не сравнивайте их напрямую.

Заключение

Функция mysqli_get_server_version() обеспечивает надёжный числовой способ проверки версии MySQL-сервера. Знание кодировки main * 10000 + minor * 100 + sub позволяет декодировать её обратно в читаемую строку и писать чистые сравнения версий, обеспечивающие совместимость и стабильность приложений, работающих с базами данных.

Практика

Практика
Что возвращает mysqli_get_server_version() для сервера MySQL 8.0.37?
Что возвращает mysqli_get_server_version() для сервера MySQL 8.0.37?
Was this page helpful?