Я тестирую свой PHP-сайт, разработанный с помощью PHP 5.5, чтобы узнать, совместим ли он с PHP 7.1, и я нашел очень странную проблему.
Проблема в том, что простой выбор таблицы с столбцом BIT (1) возвращает 18-значное число вместо 0/1, возвращающее предыдущие версии PHP.
Проблемная версия – это PHP 7.1.9, другие версии, которые я пробовал, работают нормально: 5.5.12 и 7.0.23. Все тесты проводились на WAMP 2.5 с Apache 2.4.9 и MySQL 5.6.17.
Вот минимальный набор кода для его репликации.
Создать таблицу и начальные данные:
DROP TABLE IF EXISTS `test_bit`; CREATE TABLE IF NOT EXISTS `test_bit` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `bit_col` BIT(1) NOT NULL DEFAULT FALSE, `varchar_col` VARCHAR(50) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; INSERT INTO test_bit (bit_col, varchar_col) VALUES (1, 'hello'), (0, 'world'), (TRUE, 'how'), (FALSE, 'are'), (NULL, 'you?');
Вот код PHP:
<?php $db = mysqli_connect("127.0.0.1", "root", "", "test_db"); $result = mysqli_query($db, "SELECT * FROM test_bit"); $rs = array(); while ($row = mysqli_fetch_assoc($result)) { $rs[] = $row; } var_dump($rs); mysqli_free_result($result);
Вот результаты в PHP 5.5 и 7.0
array (size=5) 0 => array (size=3) 'id' => string '1' (length=1) 'bit_col' => string '1' (length=1) 'varchar_col' => string 'hello' (length=5) 1 => array (size=3) 'id' => string '2' (length=1) 'bit_col' => string '0' (length=1) 'varchar_col' => string 'world' (length=5) 2 => array (size=3) 'id' => string '3' (length=1) 'bit_col' => string '1' (length=1) 'varchar_col' => string 'how' (length=3) 3 => array (size=3) 'id' => string '4' (length=1) 'bit_col' => string '0' (length=1) 'varchar_col' => string 'are' (length=3) 4 => array (size=3) 'id' => string '5' (length=1) 'bit_col' => string '0' (length=1) 'varchar_col' => string 'you?' (length=4)
И вот результат в PHP 7.1
array (size=5) 0 => array (size=3) 'id' => string '1' (length=1) 'bit_col' => string '326352660489830401' (length=18) 'varchar_col' => string 'hello' (length=5) 1 => array (size=3) 'id' => string '2' (length=1) 'bit_col' => string '326352866648260608' (length=18) 'varchar_col' => string 'world' (length=5) 2 => array (size=3) 'id' => string '3' (length=1) 'bit_col' => string '326353072806690817' (length=18) 'varchar_col' => string 'how' (length=3) 3 => array (size=3) 'id' => string '4' (length=1) 'bit_col' => string '326353278965121024' (length=18) 'varchar_col' => string 'are' (length=3) 4 => array (size=3) 'id' => string '5' (length=1) 'bit_col' => string '326353485123551232' (length=18) 'varchar_col' => string 'you?' (length=4)
Числа в «bit_col» в PHP 7.1 меняют первый или два раза. Я устанавливаю PHP 7.1 в качестве моей версии сервера, а затем остаюсь неизменным (пока я не перейду на 7.0 или 5.5, а затем снова вернусь к 7.1). Они кажутся меткой времени или чем-то вроде этого.
Любая помощь будет очень оценена.
Это уже уже зарегистрированная проблема в PHP с 1 августа.
Ошибка PHP # 75018
Похоже, что это только для платформы Windows, как предложили некоторые комментарии.
Сегодня я столкнулся с тем же вопросом и с armv7.
Согласно ошибке # 75018 и связанной фиксации я исправил mysqlnd_wireprotocol.c, перекомпилировал PHP, и теперь он работает так, как ожидалось.
Таким образом, решение: