2011-08-31 19 views
15

Estoy tratando de buscar el campo name en mi base de datos usando LIKE. Si Craft del SQL 'por hand` así:Usando parámetros nombrados con PDO para LIKE

$query = "SELECT * \n" 
     . "FROM `help_article` \n" 
     . "WHERE `name` LIKE '%how%'\n" 
     . ""; 
$sql = $db->prepare($query); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$sql->execute(); 

Entonces le proporcione resultados relevantes para el 'cómo'.
Sin embargo, cuando a su vez en una declaración preparada:

$query = "SELECT * \n" 
     . "FROM `help_article` \n" 
     . "WHERE `name` LIKE '%:term%'\n" 
     . ""; 
$sql->execute(array(":term" => $_GET["search"])); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$sql->execute(); 

Siempre estoy recibiendo cero resultados.

¿Qué estoy haciendo mal? Estoy usando declaraciones preparadas en otros lugares en mi código y funcionan bien.

+0

posible duplicado de [PDO Prepare statement not processing parameters] (http://stackoverflow.com/questions/2434560/pdo-prepare-statement-not-processing-parameters) – outis

Respuesta

27

El límite :placeholders no se debe incluir entre comillas simples. De esa forma no se interpretarán, sino que se tratarán como cadenas sin formato.

Cuando se desea utilizar un patrón como LIKE, a continuación, pasar el % junto con el valor:

$query = "SELECT * 
      FROM `help_article` 
      WHERE `name` LIKE :term "; 

$sql->execute(array(":term" => "%" . $_GET["search"] . "%")); 

Ah, y de hecho lo necesario para limpiar la cadena de entrada aquí en primer lugar (addcslashes). Si el usuario suministra caracteres extraños % dentro del parámetro, se convierten en parte del patrón de coincidencia LIKE. Recuerde que todo el parámetro :term se pasa como valor de cadena, y todos los % s dentro de esa cadena se convierten en marcadores de posición para la cláusula LIKE.

+2

[Escapando en SQL estándar] (http://drupal.org/node/654662) no es tan simple como eso. en PL/SQL y Transact SQL, por ejemplo, debe proporcionar el carácter que se utilizará como carácter de escape. – jswolf19

+0

@ jswolf19: Ni siquiera estaba seguro acerca de cómo escapar en MySQL, y generalmente prefiero quitar cualquier carácter no alfanumérico. (Podría ser suficiente para OP también). – mario

+0

Creo que MySQL establece por defecto '' ', pero OP no especifica una base de datos, y el estándar SQL no especifica un carácter de escape predeterminado. Debes proporcionarle la sintaxis 'a LIKE b ESCAPE c'. – jswolf19

Cuestiones relacionadas