तैयार किए गए कथन में कोई पैरामीटर नहीं है क्योंकि आपने सूची तैयार करने से पहले सूची को बयान में प्रक्षेपित किया है।
$array=array("item1","item2","item3","item4");
//This is dynamically filled, this is just an example
$in_list = "'".implode("','",$array)."'";//that's why i use implode
$stmt = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements where type IN ('.$in_list.')');
इस बिंदु पर, आपके द्वारा बनाया गया SQL कथन है:
SELECT libelle,activite,adresse,tel,lat,lng
FROM etablissements where type IN ('item1','Item2','Item3','Item4')
चूंकि कथन में कोई पैरामीटर नहीं है, mysqli_stmt::bind_param
विफल रहता है। कथन में वस्तुओं को प्रक्षेपित करने के बजाय (जो इंजेक्शन के लिए असुरक्षित है), मापदंडों की एक स्ट्रिंग को प्रक्षेपित करें, फिर मूल्यों को बांधें (जिसे अलग रखा जाना चाहिए)।
$array=array("item1","item2","item3","item4");
if (count($in_list) > 0) {
$query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');
$args = $in_list;
array_unshift($args, str_repeat('s', count($in_list)));
call_user_func_array(array($query, 'bind_param'), $args);
$query->execute();
$query->bind_result($libelle,$activite,$adresse,$tel,$lat,$lng);
}
बाइंडिंग के लिए पीडीओ का इंटरफ़ेस अधिक सीधा है।
$array=array("item1","item2","item3","item4");
if (count($in_list) > 0) {
$query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');
foreach ($in_list as $i => $arg) {
// query params are 1-based, so add 1 to the index
// PDO::PARAM_STR is the default type, so no need to pass 3rd arg
$query->bindValue($i+1, $arg);
}
$query->execute();
// no need to bind the result
}
वास्तव में, पीडीओ के साथ यह और भी आसान हो सकता है, क्योंकि PDOStatement::execute
पैरामीटर मानों की सूची ले सकते हैं:
$array=array("item1","item2","item3","item4");
if (count($in_list) > 0) {
$query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');
$query->execute($in_list);
}