LIKE deyimi ve özel karakterler ile PDO / PHP Sorunu

5 Cevap php

I've already checked answers to questions like this one (How do I create a PDO parameterized query with a LIKE statement in PHP). I've ended up to this solution:

$sql  = "SELECT count(*) ".
        "FROM mytable ".
        "WHERE num_certif LIKE CONCAT('%',:val,'%')";
$valeur = 'azert';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':val', $val);

Bu çalışır, ama burada benim problem: nasıl '%' karakter ele? (Yani $ valeur = '%'; tüm satırları döndürür)?

5 Cevap

Sen% karakteri kaçmak gerekir,

  $valeur = '\%';

Yerine CONCAT fonksiyonu kullanabilirsiniz ... PostgreSQL kullanıcıları için not

   SELECT count(*)
   FROM mytable
   WHERE num_certif LIKE '%' || :val || '%'

Ben dize karşılaştırma işlevlerini kullanarak bu elde:

WHERE INSTR(LCASE(num_certif),LCASE(:val))>0

Ben performans yaşayacaktır şüpheli.

Bu gibi, çok basit bir şey kullanarak edilmiştir:

    $select_str = "SELECT * FROM table_x WHERE text_field LIKE '%".$value."%'";

    $StHandler = $this->dbHandler->prepare($select_str);
    $StHandler->execute();

Sizin için ne arıyorsanız bağlı olarak sadece bir% kullanabilirsiniz. Eğer bu değer ile başlamak ve daha sonra herhangi bir karakter olmasını istiyorsanız Örneğin, siz '". $ Değer."%' Kullanacak "

Umarım bu yardımcı olur

Kendi kaçışa yapmak zorunda kalmamak için, kaçtı gereken şeyler yani bağlı argümanlar, koruyan pdo verilerin bir parçası olmak zorundadır. Bu sabit kodlanmış sorguda bir şey sizi korumak değildir.

$sql  = "SELECT count(*) ".
    "FROM avs_souscript ".
    "WHERE num_certif =\"\" ".
    "AND date_annul=\"\" ".
    "AND user=:sess_user ".
    "AND user!=\"\" ".
    "AND num_certif LIKE :num_certif_search";
$valeur = 'azert'; //I assume this actually came from some user input
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':num_certif_search', '%'.$valeur.'%');

(Ya da dönüşümlü olarak siz, $valuer = "%{$userInput}%"; atama ya bir yol onları koymak olabilir, onlar sql, bağlı argüman olmalıdır.

Php dışarı sql dan aptal dize concat bu biraz hareketli, aynı zamanda ölçeklenebilir bir uygulama yapmak için iyi bir uygulamadır. Bu veritabanı sunucusu ölçek daha, web sunucu çiftliği büyütmek için çok daha kolaydır.