2016-09-14 8 views
7

में कनवर्ट करने का प्रयास करता है आज मुझे पता चला कि हमारा कोड पीडीओ में बदलाव के साथ पिछड़ा असंगत प्रतीत होता है। PHP < 5.6 में परिणाम PDOStatement से इसके कार्यों के माध्यम से fetch और fetchAll पंक्तियों को वापस कर दिया गया है जिनके मूल्य या तो स्ट्रिंग या शून्य हैं। हमारा कोड इस विशेषता पर निर्भर करता है।PHP: 7 पीडीओ fetch (सभी) प्रकारों को संबंधित प्रकार

कुछ समय पहले हमने PHP 7 पर अपडेट किया था। यह पता चला है कि पीडीओ अब कुछ डेटाटाइप को अन्य संबंधित प्रकारों में परिवर्तित करने का प्रयास करता है। उदाहरण के लिए, FLOAT कॉलम PDOStatement परिणाम सेट में एक फ़्लोट मान बनाता है। और TINYINT कॉलम परिणाम सेट में एक पूर्णांक मान बनाता है। दिलचस्प बात यह है कि BIGINT या एक बड़ा INT UNSIGNED स्ट्रिंग के रूप में दिखाई देता है जब इसे पूर्णांक के रूप में प्रदर्शित नहीं किया जा सकता है और कुछ अन्य प्रकार (जैसे DECIMAL) किसी भी रूप में परिवर्तित नहीं होते हैं। वे तार रहते हैं। मैंने सोचा कि यह आम तौर पर सिद्धांत पर सहमत था कि डेटा प्रकारों को एक MySQL डेटाबेस से PHP डेटा प्रकारों में परिवर्तित करना समस्याग्रस्त है और PHP द्वारा स्वयं नहीं किया जाना चाहिए, लेकिन स्पष्ट रूप से PHP 7 ने अन्यथा निर्णय लिया है।

तो PHP 7 का पीडीओ रूपांतरण नियमों का एक सेट प्रस्तुत करता है जो डेटाबेस से चुने गए मानों को परिवर्तित करने के लिए आंतरिक रूप से उपयोग करता है, लेकिन यह मेरे कोड बेस को खराब करता है और इन रूपांतरण नियमों की असंगतताओं के कारण, मैं अपने परिवर्तन को नहीं बदलेगा उनके अनुरूप करने के लिए कोड आधार। क्या शायद कुछ प्रकार की सेटिंग या ध्वज है जिसे मैं पीडीओ को प्राप्त मूल्यों को बदलने से रोकने के लिए टॉगल कर सकता हूं?

+0

से पहले के रूप में मुझे लगता है कि शपथ ग्रहण कर सकते थे लौट जाएगा है कम से कम संख्या में जहां काफी समय के लिए वास्तविक संख्या में डाला जा रहा है ... !? स्पष्टीकरण के लिए – deceze

+4

@ डिसेज आप हमेशा मेरे [पीडीओ विश्वकोष] (https://phpdelusions.net/pdo#returntypes) को देख सकते हैं :) –

+0

तो उन्होंने संभावित रूप से ध्यान दिए बिना एनडी का उपयोग करना शुरू कर दिया है? : पी –

उत्तर

6

यह PHP7 नहीं है लेकिन अंतर्निहित ड्राइवर mysqlnd कहलाता है।
इसके अलावा, यह रूपांतरण नियमों का एक सेट नहीं है, लेकिन परिवहन प्रोटोकॉल जिस तरह से काम करता है: जब दोनों mysqlnd और देशी प्रीपेटेड बयानों का उपयोग किया जाता है, तो बाइनरी परिवहन प्रोटोकॉल का उपयोग किया जाता है, इसका मतलब है कि डेटा प्रकार के बारे में हमेशा एक जानकारी होती है। इसलिए डेटा को बाइनरी प्रारूप से सही तरीके से एक चर के रूप में अनपॅक किया जाता है - जब PHP के पास उपयुक्त है, अर्थात् INTs और FLOATs (ध्यान दें कि इस प्रकार की प्रकृति के कारण DECIMAL प्रकार स्ट्रिंग को वापस कर दिया गया है)।

मामले में आप इस व्यवहार नहीं करना चाहते हैं, वहाँ इस

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); 

के लिए एक विन्यास विकल्प इस व्यवहार के लिए सिर्फ तार और nulls

संबंधित मुद्दे