2017-09-01 10 views
6

PHP 5.5で開発されたPHPサイトをPHP 7.1と互換性があるかどうかテストしています。MySqlビット列がPHP 7.1(以前のバージョンではありません)で変わった数を返す

問題は、BIT(1)列を持つテーブルで単純な選択を行うと、以前のPHPバージョンを返す0/1ではなく18桁の数値が返されることです。

問題のあるバージョンはPHP 7.1.9です。それ以外のバージョンでは正常に動作しようとしましたが、5.5.12と7.0.23です。すべてのテストはApache 2.4.9およびMySQL 5.6.17を使用してWAMP 2.5で実施されました。

ここには、それを複製するための最小限のコードセットがあります。

テーブルと初期データを作成します。ここでは

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) 

PHP 7.1の 'bit_col'の数字が最初の1〜2回変更されますPHP 7.1を自分のサーバーバージョンに設定してから、同じままにします(7.0または5.5に変更してから7.1に戻るまで) 。彼らはタイムスタンプや何かのようなものです。

ご協力いただければ幸いです。

+0

を適用するソースから最新のPHPをコンパイルします。あなたが* exact *同じコードを実行した場合、PHPのバージョンが異なるだけで、これがどうなるかは考えられません。 PHPは実際には列の型( 'VARCHAR'と' BIT'など)を気にしません。したがって、それはビット自体を返し、単に列の値を取り出します。しかし、そのような価値を悪化させます。あなたはPHP 7.1.9でこのコードを再実行するたびに変更されると言っていますか? – Qirel

+0

@Qirel必ずしもそうではありません。それはPHP7.1でスクリプトを実行した最初の1-2回を変更するようです。私が別のバージョン(例7.0)に変更して7.1に戻った場合、最初の1〜2回再び変更され、それらの数字に固定されたまま固定されます。コードは正確に同じですが、私はPHPのバージョンを変更するだけで、質問に表示される結果が異なります。 –

+0

私は非常に興味をそそられており、そのような問題を引き起こす可能性があるのは本当にわかりません。あなたは同時に2つのバージョンを実行することはありませんか? – Qirel

答えて

3

実際には、8月1日からPHPですでに報告されている問題です。

PHPはBug #75018

いくつかのコメントが示唆されているとして、Windowsプラットフォームでのみのようです。

2

今日、私は同じ問題をarmv7に直面しました。

bug #75018および関連commitによると、私はmysqlnd_wireprotocol.cを修正してPHPを再コンパイルして、今度は期待通りに動作します。

だから、解決策は次のとおりです。(修正を含む)新しいPHPバージョンの

  • 待機
  • は非常に奇妙に聞こえる必要なフィックス
関連する問題