दिलचस्प पोस्ट
डबल बनाम बिगडिस्किम? SimpleDateFormat का उपयोग करते हुए कई प्रारूपों में तारीखों को कैसे विश्लेषित करें SQL सर्वर में लॉगिन के रूप में सक्रिय निर्देशिका उपयोगकर्ता समूह कैसे जोड़ें परीक्षण किए गए प्रोजेक्ट के लिब्स डायरेक्टरी में जार होने पर "एंटी टेस्ट-प्रोजेक्ट बनाएं" का उपयोग करके एंड्रॉइड टेस्ट प्रोजेक्ट का निर्माण और चला सकते हैं Schema.org शाखा का उपयोग करें itemref से गंभीर त्रुटि: वैकल्पिक मानों को खोलते हुए अनपेक्षित रूप से शून्य पाया गया स्टोर खोलने के लिए इस्तेमाल किया जाने वाला मॉडल स्टोर बनाने के लिए इस्तेमाल किए जाने वाले किसी के साथ असंगत है मेमोरी लीक सी # रेल में उपडोमेन के बीच सत्र (कुकीज़) साझा करें? GET अनुरोधों के साथ WCF वेब सेवा का काम करना डीजांगो और पायथन का उपयोग करते हुए JSON प्रतिक्रिया बनाना एंड्रॉइड: ध्वनि स्तर खोजें बाइट्स में ऑब्जेक्ट इंस्टेंस का आकार सी # में खोजें टूलबार एंड्रॉइड में SearchView का उपयोग कैसे करें आप एंड्रॉइड में इंटरनेट कनेक्शन की जांच कैसे करते हैं?

चेतावनी: PDOStatement :: execute (): SQLSTATE : अमान्य पैरामीटर संख्या: बाउंड चर की संख्या में टोकन की संख्या से मेल नहीं खाती

मैं PHP पीडीओ के साथ काम कर रहा हूं और मेरे पास निम्न समस्या है:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/site/classes/enterprise.php on line 63 

यहां मेरा कोड है:

  public function getCompaniesByCity(City $city, $options = null) { $database = Connection::getConnection(); if(empty($options)) { $statement = $database->prepare("SELECT * FROM `empresas` WHERE `empresas`.`cidades_codigo` = ?"); $statement->bindValue(1, $city->getId()); } else { $sql = "SELECT * FROM `empresas` INNER JOIN `prods_empresas` ON `prods_empresas`.`empresas_codigo` = `empresas`.`codigo` WHERE "; foreach($options as $option) { $sql .= '`prods_empresas`.`produtos_codigo` = ? OR '; } $sql = substr($sql, 0, -4); $sql .= ' AND `empresas`.`cidades_codigo` = ?'; $statement = $database->prepare($sql); echo $sql; foreach($options as $i => $option) { $statement->bindValue($i + 1, $option->getId()); } $statement->bindValue(count($options), $city->getId()); } $statement->execute(); $objects = $statement->fetchAll(PDO::FETCH_OBJ); $companies = array(); if(!empty($objects)) { foreach($objects as $object) { $data = array( 'id' => $object->codigo, 'name' => $object->nome, 'link' => $object->link, 'email' => $object->email, 'details' => $object->detalhes, 'logo' => $object->logo ); $enterprise = new Enterprise($data); array_push($companies, $enterprise); } return $companies; } } 

वेब के समाधान से एकत्रित समाधान "चेतावनी: PDOStatement :: execute (): SQLSTATE : अमान्य पैरामीटर संख्या: बाउंड चर की संख्या में टोकन की संख्या से मेल नहीं खाती"

ऐसा लगता है कि आप 'या' तुलना की एक लंबी (?) श्रृंखला बनाने की कोशिश कर रहे हैं: if (x=1) or (x=2) or (x=3) etc... आप इसे इसके साथ बदलना आसान पा सकते हैं:

 $cnt = count($options); if ($cnt > 0) { $placeholders = str_repeat(', ?', $cnt - 1); $sql .= 'WHERE '`prods_empresas`.`produtos_codigo` IN (?' . $placeholders . ')'; } 

जो, अगर 5 विकल्प थे, तो आपको देना होगा

  WHERE prods_empresas.produtos_condigo IN (?, ?, ?, ?, ?) 

और फिर इसके साथ बाइंडिंग मान करें:

 $pos = 1; foreach ($options as $option) { $statement->bindValue($pos, $option->getId()); $pos++ } 

आपके पास बाउंड पैरामीटर की मात्रा और SQL में बाइंड की मात्रा के बीच एक बेमेल है। डबल की जांच है कि राशि ? और बाउंड पैरामीटर की मात्रा समान है

इसके अतिरिक्त, HY093 दिखाएगा यदि आपने एक ऐसा पैरामीटर बाइंड करने की कोशिश की है जो मौजूद नहीं है:

 $stmt = "INSERT INTO table VALUES (:some_value)"; $stmt->bindValue(':someValue', $someValue, PDO::PARAM_STR); 

यह देखें :some_value मेल नहीं खाता :someValue ! तय है:

 $stmt = "INSERT INTO table VALUES (:some_value)"; $stmt->bindValue(':some_value', $someValue, PDO::PARAM_STR); 

एसक्यूएल में स्थिति पैरामीटर 1 से शुरू होता है। आप इसे $i+1 को अपने $ विकल्प लूप में स्थानांतरित करने के लिए बाध्य कर रहे हैं।

लेकिन फिर आप cidades_codigo लिए आखिरी पैरामीटर को स्थिति count($options) बाँध सकते हैं, जो $ विकल्प लूप में अंतिम पैरामीटर सेट को ओवरराइट करता है।

आपको स्थिति count($options)+1 लिए अंतिम पैरामीटर को बाध्य करने की आवश्यकता है


bindValue() , आपको bindValue() आवश्यकता नहीं है। execute() करने के execute() पैरामीटर के एक सरणी को पार करना आसान है execute() । यहां बताया गया है कि मैं इस फ़ंक्शन को कैसे लिखूं:

 public function getCompaniesByCity(City $city, $options = null) { $database = Connection::getConnection(); $sql = "SELECT * FROM `empresas` WHERE `empresas`.`cidades_codigo` = ?" $params = array(); $params[] = $city->getId(); if ($options) { $sql .= " AND `prods_empresas`.`produtos_codigo` IN (" . join(",", array_fill(1, count($options), "?") . ")"; foreach ((array)$options as $option) { $params[] = $option->getId(); } } $statement = $database->prepare($sql); echo $sql; $statement->execute($params); . . . 

इसके अलावा, prepare() और prepare() execute() prepare() के बदले मूल्य की जांच सुनिश्चित कर लें, अगर कोई त्रुटि है, तो आपको यह false होगा और आपको इसकी जांच करने और त्रुटि की रिपोर्ट करना होगा। या फिर त्रुटि पर त्रुटि अपवाद फेंकने के लिए PDO सक्षम करें

PDO :: वक्तव्य-> निष्पादित करने के लिए नामित पैरामीटर मानचित्रण सरणी में अतिरिक्त प्रविष्टियां होने के कारण मैं इस समस्या में चल रहा था

 $args=array (":x" => 17 ); $pdo->prepare("insert into foo (x) values (:x)"); $pdo->execute($args); // success $args[':irrelevant']=23; $pdo->execute($args) // throws exception with HY093 

चूंकि आपने $i+1 को पाश में बना दिया है, इसलिए count($options) पिछले $i+1 समान होगा जो एक डुप्लिकेट बाध्यकारी बना देता है।

  foreach($options as $i => $option) { $statement->bindValue($i + 1, $option->getId()); } $statement->bindValue(count($options)+1, $city->getId());