Member 8057273 Ответов: 1

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 тоже,но никаких чудес.

1 Ответов

Рейтинг:
1

NightWizzard

Как говорится в сообщении об ошибке: добавление большего количества переменных, чем значений для этих переменных - может быть, одно из ваших значений равно NULL? Чтобы проверить это, вы должны распечатать полученную строку запроса в файл или вернуть ее для отображения.