यह आपकी प्राथमिक समस्या है:
if ($stmt->fetchColumn()>=1) {
$result = $stmt->fetchAll();
}
else{
$result = 'nope';
}
कॉल करने के लिए fetchColumn() अपनी पहली पंक्ति से पहले परिणाम सेट को आगे बढ़ाता है। फिर जब आप fetchAll () को कॉल करते हैं, तो यह केवल शेष . प्राप्त करता है पंक्तियाँ। यह वापस नहीं जा सकता है और पहली पंक्ति प्राप्त कर सकता है, जो खो गया है। इसलिए यदि आपके क्वेरी परिणाम में केवल एक पंक्ति थी, तो आप इसे कभी नहीं देख पाएंगे।
इसके बजाय, मैं इस कोड का सुझाव दूंगा:
$result = $stmt->fetchAll();
if (empty($result)) {
$result = "nope";
}
अन्य टिप्स:
पैरामीटर प्लेसहोल्डर को उद्धरणों के अंदर कभी न रखें। यदि आप करते हैं, तो वे अब पैरामीटर प्लेसहोल्डर नहीं हैं, वे केवल ":befDate" जैसे शाब्दिक तार हैं। ये मान्य दिनांक अक्षर नहीं हैं।
एक व्यंजक में पैरामीटर जैसे BETWEEN :befDate AND :aftDate
BETWEEN 2016-07-17 AND 2016-07-25
का उत्पादन न करें एक प्रश्न के रूप में। पैरामीटर्स कभी भी इस तरह के एक्सप्रेशन नहीं बनते हैं, वे हमेशा प्रति पैरामीटर एक स्केलर वैल्यू (जैसे उद्धृत दिनांक शाब्दिक) बन जाते हैं।
मैंने आपके कोड की कोशिश की। सबसे पहले मैंने MySQL सामान्य क्वेरी लॉग को सक्षम किया:
mysql> SET GLOBAL general_log = ON;
अब मैं देख सकता हूं कि MySQL क्या सोचता है कि पीडीओ द्वारा सबमिट की गई क्वेरी है। मैंने PHP स्क्रिप्ट चलाई, और अपना सामान्य क्वेरी लॉग पढ़ा (/var/lib/mysql/localhost.log मेरी वर्चुअल मशीन पर):
160716 19:26:16 8 Connect [email protected] on test
8 Query SELECT * FROM `flights` WHERE `date` BETWEEN NULL AND NULL
AND `from` = NULL
AND `to` = NULL
AND `weight` >= NULL
8 Quit
आह, मैं पैरामीटर से बंधे चर के लिए मान सेट करना भूल गया। यदि इनमें से किसी भी चर में आपका कोई मूल्य नहीं था, तो यह समझाएगा कि आपका परिणाम खाली क्यों है, क्योंकि NULL से कोई भी तुलना सत्य नहीं है। इसलिए मैंने पहले वैरिएबल में नमूना मान सेट करने के लिए PHP को संपादित किया।
$befDate = '2016-07-21';
$aftDate = '2016-07-28';
$from = 1;
$to = 2;
$weight = 10;
मैंने फिर से क्वेरी चलाई, और लॉग में मुझे निम्नलिखित दिखाई दे रहे हैं:
160716 19:33:17 13 Query SELECT * FROM `flights` WHERE `date` BETWEEN '2016-07-21' AND '2016-07-28'
AND `from` = 1
AND `to` = 2
AND `weight` >= 10
यह साबित करता है कि पीडीओ एक पैरामीटरयुक्त मान के आसपास उद्धरण डालता है (यदि यह एक स्ट्रिंग या दिनांक है)।