Ошибка: PDOStatement::execute(): SQLSTATE[HY093]: неверный номер параметра:
Я написал такую функцию:
function tim_kiem($tenchu,$sohieutoba,$sothututhu,$gia_dat){
global $dbh;
$where="1=1";
$tenchu = "%".$tenchu."%";
if($tenchu<>""){
$where=$where." and tenchu like :tenchu";
}
if($sohieutoba<>0){
$where=$where." and (sohieutoba=:sohieutoba)";
}
if($sothututhu<>0){
$where=$where." and (sothututhu=:sothututhu)";
}
if($gia_dat<>""){
$where=$where." and gia_dat=:gia_dat";
}
$sql="SELECT * FROM mybinh WHERE ".$where;
$sth=$dbh->prepare($sql);
$sth->bindValue(':tenchu', $tenchu);
$sth->bindValue(':sohieutoba', $sohieutoba);
$sth->bindValue(':sothututhu', $sothututhu);
$sth->bindValue(':gia_dat', $gia_dat);
$sth->execute();
$row=$sth->fetch(PDO::FETCH_ASSOC);
return $row;
}
Результат в порядке, но он связывает предупреждение
"PDOStatement::bindValue(): SQLSTATE[HY093]: недопустимый номер параметра:: sohieutoba..."
, если я введу оба $sohieutoba
а также $sothututhu
, результат без предупреждения, я не знаю, где я не прав. Любые предложения будут с благодарностью.
1 ответ
Поскольку вы используете условия для создания запроса, вы также должны привязывать значения в зависимости от ваших условий. Теперь вы можете использовать только одно условие if($tenchu<>"")
но свяжите все 4 параметра, что не так.
Самое простое решение - просто повторить ваши заявления:
function tim_kiem($tenchu,$sohieutoba,$sothututhu,$gia_dat){
global $dbh;
$where="1=1";
$tenchu = "%".$tenchu."%";
if($tenchu<>""){
$where=$where." and tenchu like :tenchu";
}
if($sohieutoba<>0){
$where=$where." and (sohieutoba=:sohieutoba)";
}
if($sothututhu<>0){
$where=$where." and (sothututhu=:sothututhu)";
}
if($gia_dat<>""){
$where=$where." and gia_dat=:gia_dat";
}
$sql="SELECT * FROM mybinh WHERE ".$where;
$sth=$dbh->prepare($sql);
if($tenchu<>""){
$sth->bindValue(':tenchu', $tenchu);
}
if($sohieutoba<>0){
$sth->bindValue(':sohieutoba', $sohieutoba);
}
if($sothututhu<>0){
$sth->bindValue(':sothututhu', $sothututhu);
}
if($gia_dat<>""){
$sth->bindValue(':gia_dat', $gia_dat);
}
$sth->execute();
$row=$sth->fetch(PDO::FETCH_ASSOC);
return $row;
}
Однако это не самый элегантный способ. Например, вы можете использовать только одно условие и создать массив, а затем в цикле связать ваши параметры