2010-04-27 21 views
18

En esta consultaMySQL DOP cómo enlazar COMO

select wrd from tablename WHERE wrd LIKE '$partial%' 

estoy tratando de obligar a la variable de '$partial%' con DOP. No estoy seguro de cómo funciona esto con el % al final.

¿Sería

select wrd from tablename WHERE wrd LIKE ':partial%' 

donde :partial está obligado a $partial="somet"

o sería

select wrd from tablename WHERE wrd LIKE ':partial' 

donde :partial está obligado a $partial="somet%"

o sería algo mi ntirely diferente?

+3

La última opción debería funcionar – Cfreak

+1

... menos las cotizaciones – bobince

Respuesta

27

+1 de Karim lo cubre. También se podría decir:

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')" 

para hacer la cadena de unirse al final de MySQL, no es que haya alguna razón en particular en este caso.

Las cosas se ponen un poco más complejo si el parcial wrd que busca en sí puede contener un por ciento o carácter de subrayado (ya que estos tienen un significado especial para el operador LIKE) o una barra invertida (que MySQL utiliza como una capa de escapar en el operador LIKE - incorrectamente, de acuerdo con el estándar ANSI SQL).

Esperemos que no le afecta, pero si usted necesita para obtener ese caso, la derecha, aquí está la solución sucia:

$stmt= $db->prepare("SELECT wrd FROM tablename WHERE wrd LIKE :term ESCAPE '+'"); 
$escaped= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $var); 
$stmt->bindParam(':term', $escaped); 
+2

1 Ahora que leo esto me doy cuenta de que usted es que lo ha cubierto, y no a mí. – karim79

+1

Para escapar o no escapar ... Depende de la intención del personaje. ¿Fue intención ser un comodín o un literal? No esperaría que una declaración preparada decidiera esto por mí. Su trabajo es escapar caracteres en el valor que terminaría la cláusula 'LIKE' e inyectar sql no deseado. – Stoutie

+0

+1 para la solución 'desordenada'. La única vez que no lo usaría es si quería dar a mis usuarios la posibilidad de poner comodines en su propia cadena de búsqueda. –

13
$var = "partial%"; 
$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial"); 
$stmt->bindParam(":partial", $var); 
$stmt->execute(); // or $stmt->execute(array(':partial' => $var)); without 
        // first calling bindParam() 
$rs = $stmt->fetchAll(); 

utilizando parámetros de signo de interrogación: Respuesta

$stmt = $dbh->prepare('select wrd from tablename WHERE wrd LIKE ?'); 
$stmt->execute(array('partial%')); 
$rs = $stmt->fetchAll(); 

http://www.php.net/manual/en/pdo.prepare.php

-4

que ha escrito el Answare (puede haber karim79):

$var ="partial%" 
$stmt =$dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial") 
$stmt->bindParam(":partial",$var) 
$stmt->execute(); //or$stmt->execute(array(':partial'=>$var)); without 
        // first calling bindParam() 
$rs =$stmt->fetchAll(); 

utilizando parámetros de signo de interrogación:

$stmt =$dbh->prepare('select wrd from tablename WHERE wrd LIKE ?'); 
$stmt->execute(array('partial%')); 
$rs =$stmt->fetchAll(); 

Muchas gracias a él. Estaba buscando el código & vi muchos ejemplos, pero no pude resolver mi problema. Esta vez he tenido éxito en hacerlo. Utilicé la sección 'Usar parámetros de marca de pregunta:' del código.

Para otros ayuda, si desea recuperar el valor de una variable que puede cambiar el código para

$stmt->execute(array($variable.'%')); 

en lugar de

$stmt->execute(array('partial%')); 

Debido a que la palabra 'parcial' se especifica en el responde y no puede ser cambiado Muchas gracias.

+0

Esto es principalmente un agradecimiento, no una respuesta. – ScottR

+0

ni siquiera es su pregunta * ¡jajaja! * –

-1

Esta es la forma en que debe hacerlo

bindValue(':partial', '%' . $_GET['partial'] . '%'); 

Gracias,

Qwerty

-1

El código siguiente muestra sólo las primeras palabras clave en la base de datos!

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')" 

prueba este si desea buscar todas las palabras clave de la base de datos

"SELECT wrd FROM tablename WHERE wrd LIKE :partial"; 
$stmt->execute(array(':partial'=>'%'.$YourVarHere.'%')); 
0

Puede utilizar addcslashes antes de la declaración preparada. Probé en mysql.

$value = addcslashes($value, '%'); 
$stmt = $db->prepare('select * from products where description like ?'); 
$stmt->execute(["$value%"]);