2014-07-17 9 views
0

Im un problème avec ce morceau de code, im en utilisant un formulaire pour passer une valeur à un moteur de recherche, ce que je veux faire est de lire le caractère spécial comme caractère régulier, becuase si type i% sam% il lit cela dans le cadre de la 'requête', pas comme une chaîne régulière (caractère normal)comment traiter les caractères spéciaux comme des caractères normaux pdo

il est possible de

$search = $_GET['query']; 
$query = "SELECT * FROM mobiles WHERE (`name` LIKE :search) or (`type` LIKE :search)"; 
$query_params = array(':search' => mysql_real_escape_string($search)); 

try 
{ 
    $stmt = $db->prepare($query); 
    $result = $stmt->execute($query_params); 
} 
catch(PDOException $ex) 
{ 
    die("Failed to run query: " . $ex->getMessage()); 
} 
+0

« becuase si type i% sam% il lit cela comme une« requête » WAT? – PeeHaa

+2

Aussi: pourquoi essayez-vous d'utiliser 'mysql_real_escape_string' ??? – PeeHaa

+0

Donc, vous voulez être en mesure d'utiliser la recherche générique à partir du formulaire au lieu de sur la requête elle-même? – Prix

Répondre

1

utilisation citation de votre pdo Connection Object

$db->quote($search); //Assuming your connection is $db 

Bien que% soit spécial en cela, il est légal dans une chaîne, donc vous devriez probablement y échapper manuellement.

$search = str_replace("%", "\%", $search), 
+1

Étant donné que ** '$ search' ** est fourni en tant que valeur pour une variable de liaison à une instruction préparée, la valeur de $ search n'est pas incluse dans le texte SQL. Donc l'appel à 'quote 'n'est pas seulement inutile, il va aussi ajouter des guillemets littéraux à la valeur. (Ce n'est pas illégal de le faire, juste très étrange que nous incluions des citations littérales dans la recherche, très étrange pour effectuer une recherche équivalente à 'LIKE '%' 'foo' '%'' plutôt que simplement 'LIKE '% foo % '. (Ceci a été choisi comme réponse par OP, mais c'est une mauvaise réponse parce que la recommandation d'utiliser 'quote' est loin de la base. – spencer7593

1

Quelques points:

  • mysql_real_escape_string n'a pas d'usage que ce soit ici. les paramètres nommés vous évite de penser à ce
  • avec MySQL vous ne pouvez pas utiliser le même espace réservé nommé :search, que ce soit vous faites deux em (:search1, :search2) soit vous définissez ATTRIBUTE_EMULATE_PREPARES=>TRUE lors de la construction AOP
  • Lorsque vous travaillez avec LIKE en PDO, vous devez être sûr de passer % autour de la chaîne que vous soumettez à l'espace réservé: array(':search' => '%' . $search . '%');
Questions connexes