需要帮助php pdo准备sql

时间:2017-04-12 07:07:11

标签: php mysql pdo sql-like

我正在开发一个PDO功能,允许您根据工具的序列号或文章ID执行搜索。但是我希望能够同时使用" - "例如,在我的搜索栏459999-1中写入id_art和num_serie之间。

我试图放一个" - "但没有结果

public static function findAllByIdArt($id){

    $id='%'.$id.'%';
    $c=base::getConnection();
    $query=$c->prepare("select * from outillage where (id_art like :num_serie) or (num_serie like :num_serie) or (num_serie and id_art like :num_serie '-' :id_art)");
    $query->bindParam(':num_serie',$id,PDO::PARAM_INT);
    $query->bindParam(':id_art',$id,PDO::PARAM_INT);
    $dbres=$query->execute();
    $d=$query->fetchAll();
    $tab=array();
    foreach ($d as $key => $value) {
        $a=new Outillage();
        $a->id=$value['id'];
        $a->num_serie=$value['num_serie'];
        $a->id_art=$value['id_art'];
        $a->article=$value['article'];
        $a->id_doc=$value['id_doc'];
        $a->document=$value['document'];
        $a->ilot=$value['ilot'];
        $a->emplacement=$value['emplacement'];
        $a->liste_tubes=$value['liste_tubes'];
        $a->image=$value['image'];
        $a->image2=$value['image2'];
        $a->image3=$value['image3'];
        $a->image4=$value['image4'];
        $a->image5=$value['image5'];
        $a->nb_utilisation=$value['nb_utilisation'];
        $a->conforme=$value['conforme'];
        $a->dateNonConfo=$value['dateNonConfo'];
        $tab[]=$a;
    }
    return $tab;
}

2 个答案:

答案 0 :(得分:0)

声明的最后部分必须如下:

(num_serie like :num_serie '-' :id_art and id_art like :num_serie '-' :id_art)"

列必须后跟值。你不能使用column1 and column2 like value

答案 1 :(得分:0)

有两点需要注意:

  1. 查询无法执行num_serie and id_art,您需要明确说明列应该查找的值,而不是一系列列。所以它应该是num_serie LIKE 'a' AND id_art LIKE 'a',例如。
  2. 可以使用CONCAT()函数来结束破折号。这是最好的方法,因为您在查询中使用占位符(正如您应该做的那样!)
  3. 如果我正确理解了您的问题,那么此查询就是这样做的。

    SELECT * 
    FROM outillage 
    WHERE (id_art LIKE :num_serie) 
       OR (num_serie LIKE :num_serie) 
       OR (CONCAT(num_serie, '-', id_art) LIKE CONCAT(:num_serie, '-', :id_art))
    

    此外,在没有任何通配符的情况下执行LIKE,您也可以使用等号[{1}}而不是=运算符来正常比较字符串。