Php динамический запрос mysql для фильтров
Я пытаюсь реализовать динамический sql-запрос, чтобы пользователи могли гибко использовать один или несколько фильтров для извлечения нужных им данных. Я использую подготовленные операторы, чтобы гарантировать отсутствие SQL-инъекции. Я использую 64-битный сервер WAMP. Я сослался на эту статью для написания моего кода: пример ниже-мой код:
<pre>$myqry="SELECT * FROM students WHERE "; $initflag=0; //controls the first clause without AND and rest with AND $paramtypes=array(); $paramvalues=array(); $params=array(); $ptypes=""; $pvalues=""; //echo "Admission Year " . $_POST['awr_admyear1']; if(!empty($_POST['awr_admyear1'])) { $myqry.= "YEAR(adm_date)=? "; $initflag=1; $ptypes='s'; $pvalues=$_POST['awr_admyear1']; $paramtype[]="s"; $paramvalues[]=$_POST['awr_admyear1']; } if(!empty($_POST['awr_admfrom']) && !empty($_POST['awr_admto'])) { if($initflag==0) { $myqry.= "(YEAR(adm_date) BETWEEN ? AND ?) "; $ptypes.="ss"; $pvalues.=$_POST['awr_admfrom'] . "," . $_POST['awr_admto']; } else { $myqry.= "AND (YEAR(adm_date) BETWEEN ? AND ?) "; $ptypes.="ss"; $pvalues.="," . $_POST['awr_admfrom'] . "," . $_POST['awr_admto']; } $initflag=1; $paramtype[]="s"; $paramtype[]="s"; $paramvalues[]=$_POST['awr_admfrom']; $paramvalues[]=$_POST['awr_admto']; } if(!empty($_POST['awradm_no'])) { if($initflag==0) { $myqry.= "adm_no LIKE ? "; $ptypes.='s'; $pvalues.="%".$_POST['awradm_no']. "%"; } else { $myqry.= "AND adm_no LIKE ? "; $ptypes.='s'; $pvalues.="%".$_POST['awradm_no']. "%"; } $initflag=1; $paramtype[]="s"; $paramvalues[]="%".$_POST['awradm_no']. "%"; } $params = array_merge($paramtype,$paramvalues); <pre>function refValues($arr) { if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+ { $refs = array(); foreach($arr as $key => $value) { $refs[$key] = &$arr[$key]; } return $refs; } return $arr; } if(isset($myqry) && !(empty($myqry))) { if($result1 = $mysqli->prepare($myqry)) { call_user_func_array(array($result1, 'bind_param'), refValues($params)); //$result1->bind_param($paramtype, $paramvalues); if($result1->execute()) { $finrest=$result1->get_result(); while($row= $finrest->fetch_assoc()) {
Я получаю следующую ошибку:
Warning: Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables in ..
Где я ошибаюсь и каково решение?
Что я уже пробовал:
перепробовал много решений от google и stackoverflow тоже,но никаких чудес.