2017-09-01 5 views
6

मैं PHP 5.5 के साथ विकसित अपनी PHP साइट का परीक्षण कर रहा हूं यह देखने के लिए कि यह PHP 7.1 के साथ संगत है या नहीं और मुझे एक बहुत ही अजीब समस्या मिली।MySQL बिट कॉलम PHP 7.1 (पिछले संस्करणों में नहीं) में अजीब बड़ी संख्या देता है

समस्या यह है कि बीआईटी (1) कॉलम के साथ एक टेबल पर एक साधारण चयन करने से 0/1 की बजाय 18 अंकों का नंबर मिलता है जो पिछले PHP संस्करणों को वापस करता है।

समस्याग्रस्त संस्करण PHP 7.1.9 है, अन्य संस्करणों में मैंने कोशिश की है कि ठीक है ठीक है 5.5.12 और 7.0.23। सभी परीक्षण अपाचे 2.4.9 और MySQL 5.6.17 के साथ WAMP 2.5 पर आयोजित किए गए थे।

यहां दोहराने के लिए कोड का एक छोटा सा सेट है।

मेज और प्रारंभिक डेटा बनाएं: यहां

<?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); 

यहाँ पीएचपी 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) 

और है:

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 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' में संख्याएं पहले एक या दो बार बदलती हैं, मैंने PHP सर्वर को अपने सर्वर संस्करण के रूप में सेट किया है और फिर वही रहें (जब तक कि मैं 7.0 या 5.5 में बदल जाता हूं और फिर 7.1 पर वापस आ जाता हूं) । वे एक टाइमस्टैम्प या इस तरह के कुछ की तरह लगते हैं।

किसी भी मदद की बहुत सराहना की जाएगी।

+0

कि बहुत अजीब लग रहा है लागू करने के स्रोतों से नवीनतम पीएचपी संकलन। मैं किसी भी कारण से नहीं सोच सकता कि ऐसा क्यों होगा, यदि आप * सटीक * एक ही कोड चलाते हैं, तो बस अलग-अलग PHP संस्करणों के साथ। PHP वास्तव में कॉलम के प्रकार की देखभाल नहीं करता है (उदाहरण के लिए 'VARCHAR' बनाम' बीआईटी'), इसलिए यह नहीं जानता कि यह प्रति बिट थोड़ा सा लौटाता है, यह सिर्फ कॉलम में मान लाता है - लेकिन यह ' इस तरह के मूल्य को उलझाना नहीं है। आपने कहा कि जब भी आप इस कोड को PHP 7.1.9 में फिर से चलाते हैं तो वे बदलते हैं? – Qirel

+0

@Qirel यह बिल्कुल हर समय नहीं है। ऐसा लगता है कि यह PHP7.1 में स्क्रिप्ट चलाने वाले पहले एक या दो बार बदलता है। अगर मैं दूसरे संस्करण (पूर्व 7.0) में बदल जाता हूं और फिर 7.1 पर वापस आ जाता हूं तो यह पहले या दो बार फिर से बदल जाता है और फिर उन संख्याओं में स्थिर रहता है।कोड बिल्कुल वही है, मैं केवल PHP संस्करण बदलता हूं और मुझे प्रश्न में दिखाए गए विभिन्न परिणाम मिलते हैं। –

+0

मैं काफी चिंतित हूं, और मुझे वास्तव में पता नहीं है कि इस तरह के मुद्दे का कारण क्या हो सकता है। आप एक ही समय में दो संस्करणों को चलाने के लिए नहीं होते हैं? – Qirel

उत्तर

3

वास्तव में यह 1 अगस्त से PHP में पहले से ही एक रिपोर्ट की गई समस्या है।

पीएचपी Bug #75018

यह रूप में कुछ टिप्पणियों का सुझाव दिया है विंडोज प्लेटफॉर्म के लिए ही हो रहा है।

2

आज मुझे armv7 पर एक ही समस्या का सामना करना पड़ा।

बग #75018 और संबंधित commit के अनुसार मैंने mysqlnd_wireprotocol.c को ठीक किया है, PHP को फिर से संकलित किया है और अब यह अपेक्षा के अनुसार काम करता है।

तो समाधान है: नई PHP संस्करण (फिक्स) के साथ के लिए

  • इंतजार
  • आवश्यक ठीक
संबंधित मुद्दे