दिलचस्प पोस्ट
JQuery इनपुट का उपयोग करके फ़ाइल इनपुट से पूर्ण पथ एक्लिप्से में एक एकल यूजिट परीक्षण चला रहा है जावा स्पेल चेकर लाइब्रेरी की खोज JSF में एक लॉगिन फ़िल्टर कैसे कार्यान्वित करें? Percents चौड़ाई के साथ उत्तरदायी सीएसएस त्रिकोण जीएमटी टाइमज़ोन से आईएसटी टाइमज़ोन और एंड्रॉइड में उल्टा करने के लिए दिनांक का विश्लेषण कैसे करें .frm फ़ाइलों से mysql डेटाबेस पुनर्स्थापित करें Firebase में एक सरणी के लिए अतुल्यकालिक पहुंच बाहरी मॉड्यूल 'कोणीय 2 / कोणीय 2' – अंगुलर 2 डब्ल्यू / टाइपस्क्रिप्ट नहीं मिल सकता है क्यों reinterpret_cast नहीं करता है नकल के लिए copy_n समान आकार के प्रकार के बीच में डाले? जावास्क्रिप्ट में MM / dd / yyyy को प्रारूप दिनांक पूर्णांक का प्रकार डिफ़ॉल्ट रूप से int नहीं? Cronjob या MySQL घटना? फॉर्म सबमिट बटन केवल पुनः लोड होने के बाद ही कार्य करता है जेएक्स-आरएस पोस्ट कई ऑब्जेक्ट्स

चेतावनी: 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; } } 

Solutions Collecting From Web of "चेतावनी: 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());