2013-06-24 4 views
15

मुझे यह कष्टप्रद त्रुटि मिल रही है और हालांकि मुझे पता है कि मुझे यह क्यों मिल रहा है, मैं अपने जीवन के लिए इसका समाधान नहीं ढूंढ सकता ।पीडीओ त्रुटि: एसक्यूएलएसटीएटी [एचवाई 000]: सामान्य त्रुटि: 2031

if ($limit) { 
    $sth->bindValue(':page', $page - 1, PDO::PARAM_INT); 
    $sth->bindValue(':entries_per_page', $page * $entries_per_page, PDO::PARAM_INT); 
} 

$sth->execute($criteria); 

क्वेरी में प्लेसहोल्डर्स (:placeholder) शामिल हैं। लेकिन उन LIMIT प्लेसहोल्डर्स को जोड़ने के लिए, मुझे मैन्युअल विधि (bindValue) का उपयोग करने की आवश्यकता है क्योंकि अन्यथा इंजन उन्हें स्ट्रिंग में बदल देगा।

मुझे पैरामीटर त्रुटि की अमान्य संख्या नहीं मिल रही है, इसलिए सभी प्लेसहोल्डर सही ढंग से बाध्य किए गए हैं (मुझे लगता है)।

क्वेरी:

SELECT `articles`.*, `regional_municipalities`.`name` AS `regional_municipality_name`, 
     `_atc_codes`.`code` AS `atc_code`, `_atc_codes`.`name` AS `substance` 
FROM `articles` 
LEFT JOIN `_atc_codes` 
ON (`_atc_codes`.`id` = `articles`.`atc_code`) 
JOIN `regional_municipalities` 
ON (`regional_municipalities`.`id` = `articles`.`regional_municipality`) 
WHERE TRUE AND `articles`.`strength` = :strength 
GROUP BY `articles`.`id` 
ORDER BY `articles`.`id` 
LIMIT :page, :entries_per_page 

सभी प्लेसहोल्डर मूल्यों पिछले दो सीमा, जो मैं मैन्युअल bindValue() साथ बाँध के अलावा, $ मापदंड में रहते हैं।

+1

कोशिश "में LIMIT मापदंडों बाध्यकारी पीडीओ" गूगल में खोज करने के लिए –

+0

1) यह बजाय मानव पठनीय त्रुटि संदेश शामिल करने के लिए सिर्फ गुप्त कोड की, 2) अत: आपका वास्तविक क्वेरी दिखाएँ अच्छा किया गया है जाएगा हम देख सकते हैं कि त्रुटि कहां से उत्पन्न होती है। – deceze

+0

@deceze अगर वहां कोई मानव पठनीय संदेश था, तो मैं चाहता था: ए) शायद इसे अब तक हल किया गया है, बी) यदि नहीं, तो इसे यहां शामिल किया गया। यह पूर्ण त्रुटि संदेश था, मेरा विश्वास करो। – silkfire

उत्तर

17

आप ->bind*और->execute($params) का उपयोग नहीं कर सकते। या तो प्रयोग करें; यदि आप execute() पर पैरामीटर पास करते हैं, तो वे पीडीओ को पहले से ही ->bind* के माध्यम से पैरामीटर को भूल जाएंगे।

3

the manual से:

public bool PDOStatement::execute ([ array $input_parameters ])

Execute the prepared statement. If the prepared statement included parameter markers, you must either:

  • call PDOStatement::bindParam() to bind PHP variables to the parameter markers: bound variables pass their value as input and receive the output value, if any, of their associated parameter markers

  • or pass an array of input-only parameter values

आप एक विधि लेने के लिए की जरूरत है। आप दोनों मिश्रण नहीं कर सकते हैं।

+0

मैं अन्य मूल्यों के लिए 'bindParam' /' bindValue' का उपयोग नहीं कर सकता ... आह। – silkfire

+0

@silkfire कृपया अन्य विचारों के लिए http://stackoverflow.com/questions/10014147/limit-keyword-on-mysql-with-prepared-statement-maybe-still-a-bug/10014200#10014200 देखें। –

+0

'पीडीओ :: ATTR_EMULATE_PREPARES, सत्य)' - क्या ** ** ** अनुरूपित तैयार नहीं होना चाहिए? मुझे लगता है कि यह चारों ओर एक और तरीका है, बहुत भ्रामक। – silkfire

13

यह वही त्रुटि 2031 जारी किया जा सकता है जब एक बाँध में एक ही पैरामीटर नाम के साथ दो मानों, में की तरह:

  • $sth->bindValue(':colour', 'blue');
  • $sth->bindValue(':colour', 'red');

..so, सावधान रहना।

+0

इस उत्तर ने मेरा दिन बचाया! – JWizard

2

यह अपवाद भी प्रतीत होता है अगर आप के बजाय

$stmt = $db->prepare('SELECT * FROM tbl WHERE ID > ?'); 
-1

अपवाद भी (होता है कम से कम MySQL में की एक बयान तैयार करने जैसे

$stmt = $db->query('SELECT * FROM tbl WHERE ID > ?'); 

बजाय प्लेसहोल्डर के साथ एक प्रश्न चलाने का प्रयास/पीडीओ) जब आपका एसक्यूएल एक ऑटोसिंकमेंट फ़ील्ड अपडेट करने का प्रयास करता है।

2

यह बिल्कुल नहीं एक जवाब है, लेकिन इस त्रुटि भी होता है अगर आप प्लेसहोल्डर के रूप में हाइफ़न से एक शब्द भी इस्तेमाल करने की कोशिश, उदाहरण के लिए है:

$sth->bindValue(':page-1', $page1);

तो बेहतर उपयोग करने

$sth->bindValue(':page_1', $page1);

0

ऐसा होता है यदि आपके पास मेल नहीं खाते हैं।उदाहरण के लिए:

$q = $db->prepare("select :a, :b"); 
$q->execute([":a"=>"a"]); 
संबंधित मुद्दे