दिलचस्प पोस्ट
डेटटाइम ऑब्जेक्ट को देखते हुए, मैं स्ट्रिंग फ़ॉर्मेट में आईएसओ 8601 डेट कैसे प्राप्त करूं? कैसे बिल्कुल git submodule काम करता है? एक प्रक्रिया और धागे के बीच अंतर क्या है? जावा बाइटकोड में स्केल के गुण कैसे संकलित किए जाते हैं? मैं एक नई लाइन / कैरिज रिटर्न को एक element.textContent में कैसे सम्मिलित कर सकता / सकती हूं? Python के http.server (या SimpleHTTPServer) का एक तेज़ विकल्प क्या है? एक Rx "RetryAfter" एक्सटेंशन विधि लिखें सीएसएस वर्टिकल-संरेखित करें: मध्य काम नहीं कर रहा है .NET ऐप में सभी अपवाद / क्रैश कैसे लें NotifyDataSetChange कस्टम एडेप्टर से काम नहीं कर रहा है IOS8 में स्विफ्ट का उपयोग करने वाले विशिष्ट व्यू नियंत्रकों के लिए स्टेटस बार रंग बदलना जावा प्रक्रिया के आवासीय स्मृति उपयोग (आरएसएस) बढ़ते हुए मैं फोन नंबर के साथ खोलने वाला डायलर कैसे प्राप्त करूं? सीएसवी न्यू-लाइन वर्ण जो बिना फ़ील्ड फ़ील्ड त्रुटि में देखा गया है सी ++ कन्स प्रयोग स्पष्टीकरण

PHP में गतिशील रूप से mysqli bind_param तर्क बाध्य करने के लिए कैसे?

मैं अपने एसक्यूएल प्रश्नों के लिए तैयार और बाध्य बयानों का इस्तेमाल करना सीख रहा हूं, और मैं अभी तक इसके साथ आया हूं, यह ठीक काम करता है, लेकिन कई मापदंडों के आने पर यह गतिशील नहीं है जब कोई पैरामीटर की आवश्यकता नहीं होती है,

public function get_result($sql,$parameter) { # create a prepared statement $stmt = $this->mysqli->prepare($sql); # bind parameters for markers # but this is not dynamic enough... $stmt->bind_param("s", $parameter); # execute query $stmt->execute(); # these lines of code below return one dimentional array, similar to mysqli::fetch_assoc() $meta = $stmt->result_metadata(); while ($field = $meta->fetch_field()) { $var = $field->name; $$var = null; $parameters[$field->name] = &$$var; } call_user_func_array(array($stmt, 'bind_result'), $parameters); while($stmt->fetch()) { return $parameters; //print_r($parameters); } # close statement $stmt->close(); } 

इस प्रकार मैं ऑब्जेक्ट क्लासेस को कॉल करता हूं,

 $mysqli = new database(DB_HOST,DB_USER,DB_PASS,DB_NAME); $output = new search($mysqli); 

कभी-कभी मुझे किसी भी पैरामीटर में पास करने की आवश्यकता नहीं होती है,

 $sql = " SELECT * FROM root_contacts_cfm "; print_r($output->get_result($sql)); 

कभी-कभी मुझे केवल एक पैरामीटर की आवश्यकता होती है,

 $sql = " SELECT * FROM root_contacts_cfm WHERE root_contacts_cfm.cnt_id = ? ORDER BY cnt_id DESC "; print_r($output->get_result($sql,'1')); 

कभी-कभी मुझे केवल एक ही पैरामीटर की आवश्यकता होती है,

 $sql = " SELECT * FROM root_contacts_cfm WHERE root_contacts_cfm.cnt_id = ? AND root_contacts_cfm.cnt_firstname = ? ORDER BY cnt_id DESC "; print_r($output->get_result($sql,'1','Tk')); 

इसलिए, मेरा मानना ​​है कि यह पंक्ति ऊपर गतिशील कार्यों के लिए पर्याप्त गतिशील नहीं है,

 $stmt->bind_param("s", $parameter); 

गतिशील रूप से एक बाइंड_परम का निर्माण करने के लिए, मुझे यह अन्य पदों पर ऑनलाइन मिला है

 call_user_func_array(array(&$stmt, 'bind_params'), $array_of_params); 

और मैंने php.net से कुछ कोड को संशोधित करने की कोशिश की लेकिन मुझे कहीं नहीं मिल रहा है,

 if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+ { $refs = array(); foreach($arr as $key => $value) $array_of_param[$key] = &$arr[$key]; call_user_func_array(array(&$stmt, 'bind_params'), $array_of_params); } 

क्यूं कर? कोई भी विचार मैं इसे कैसे काम कर सकता हूं?

या शायद बेहतर समाधान हैं?

वेब के समाधान से एकत्रित समाधान "PHP में गतिशील रूप से mysqli bind_param तर्क बाध्य करने के लिए कैसे?"

mysqli के लिए जवाब मिला:

 public function get_result($sql,$types = null,$params = null) { # create a prepared statement $stmt = $this->mysqli->prepare($sql); # bind parameters for markers # but this is not dynamic enough... //$stmt->bind_param("s", $parameter); if($types&&$params) { $bind_names[] = $types; for ($i=0; $i<count($params);$i++) { $bind_name = 'bind' . $i; $$bind_name = $params[$i]; $bind_names[] = &$$bind_name; } $return = call_user_func_array(array($stmt,'bind_param'),$bind_names); } # execute query $stmt->execute(); # these lines of code below return one dimentional array, similar to mysqli::fetch_assoc() $meta = $stmt->result_metadata(); while ($field = $meta->fetch_field()) { $var = $field->name; $$var = null; $parameters[$field->name] = &$$var; } call_user_func_array(array($stmt, 'bind_result'), $parameters); while($stmt->fetch()) { return $parameters; //print_r($parameters); } # the commented lines below will return values but not arrays # bind result variables //$stmt->bind_result($id); # fetch value //$stmt->fetch(); # return the value //return $id; # close statement $stmt->close(); } 

फिर:

 $mysqli = new database(DB_HOST,DB_USER,DB_PASS,DB_NAME); $output = new search($mysqli); $sql = " SELECT * FROM root_contacts_cfm ORDER BY cnt_id DESC "; print_r($output->get_result($sql)); $sql = " SELECT * FROM root_contacts_cfm WHERE root_contacts_cfm.cnt_id = ? ORDER BY cnt_id DESC "; print_r($output->get_result($sql,'s',array('1'))); $sql = " SELECT * FROM root_contacts_cfm WHERE root_contacts_cfm.cnt_id = ? AND root_contacts_cfm.cnt_firstname = ? ORDER BY cnt_id DESC "; print_r($output->get_result($sql, 'ss',array('1','Tk'))); 

मैसकिली इतनी लंगड़ा जब यह करने के लिए आता है। मुझे लगता है कि मुझे पीडीओ में पलायन करना चाहिए!

PHP 5.6 का उपयोग करके आप ऑपरेटर ( ...$var ) को खोलने और get_result का उपयोग करके यह आसान कर सकते हैं () bind_result insted ()

 public function get_result($sql,$types = null,$params = null) { $stmt = $this->mysqli->prepare($sql); $stmt->bind_param($types, ...$params); if(!$stmt->execute()) return false; return $stmt->get_result(); } 

उदाहरण:

 $mysqli = new database(DB_HOST,DB_USER,DB_PASS,DB_NAME); $output = new search($mysqli); $sql = "SELECT * FROM root_contacts_cfm WHERE root_contacts_cfm.cnt_id = ? AND root_contacts_cfm.cnt_firstname = ? ORDER BY cnt_id DESC"; $res = $output->get_result($sql, 'ss',array('1','Tk')); while($row = res->fetch_assoc()){ echo $row['fieldName'] .'<br>'; } 

या शायद बेहतर समाधान हैं ??

यह जवाब वास्तव में आपकी मदद नहीं करता है, लेकिन आप को गंभीरता से पीडीओ पर स्विच करना चाहते हैं mysqli से

इसका मुख्य कारण यह है कि पीडीओ क्या करता है जो आप अंतर्निहित कार्यों के साथ MySQLi में करने की कोशिश कर रहे हैं। मैनुअल परम बाध्यकारी होने के अलावा, निष्पादित विधि इसके बजाय तर्कों की एक सरणी ले सकता है।

पीडीओ का विस्तार करना आसान है, और तैयार-निष्पादन नृत्य करने की बजाय सभी-और-वापसी लाने के लिए सुविधा के तरीकों को जोड़ना बहुत आसान है।

मुझे एक अच्छा mysqli वर्ग मिल गया, यह गतिशील मानकों को संभाल सकता है, और उपयोग में आसान है

https://github.com/ajillion/PHP-MySQLi-Database-Class

आप स्रोत कोड को संदर्भित कर सकते हैं कि यह क्वेरी को कैसे गतिशील बनाता है

https://github.com/ajillion/PHP-MySQLi-Database-Class/blob/master/MysqliDb.php