2009-02-24 19 views

Respuesta

103

figurado a cabo justo después de que he publicado:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?'); 
$query->execute(array('value%')); 

while ($results = $query->fetch()) 
{ 
    echo $results['column']; 
} 
+7

Esa no es la ley de Murphy;) –

+1

@ Andrew: ¿y si múltiples 'like' se usa? ¿cómo debería ejecutarse la matriz de ejecución en orden? – logan

+0

gracias. tenía un problema similar con csharp + Mysql + ODBC al usar como si no devolviera ninguna fila con "select * from table where column like '%?%';" pero si lo hago me gusta "seleccionar * de la tabla donde la columna me gusta?" y configure la cadena del parámetro así: string frag = $ "% {searchFragment}%"; luego usa frag para el valor del parámetro. Weird – sdjuan

52

Para utilizar igual que con la concordancia parcial% también se puede hacer esto: column like concat('%', :something, '%') (en otras palabras, el uso de signos% explícitamente no desactivados que definitivamente no son entradas del usuario) con el parámetro nombrado :something.

Editar: una sintaxis alternativa que he encontrado es utilizar el operador de concatenación: ||, por lo que va a convertirse simplemente: where column like '%' || :something || '%' etc

@bobince menciones here que:

El difficulty aparece cuando desea permitir un carácter literal % o _ en la cadena de búsqueda , sin tener que actuar como un comodín .

Así que eso es algo más a tener en cuenta al combinar como y la parametrización.

+5

+1 - esto me parece un buen acercamiento ya que toda la concatenación ocurre en la base de datos después de que se haya sustituido el marcador de posición, y significa que se pueden usar marcadores de posición con nombre.Vale la pena mencionar que la sintaxis anterior es para Oracle: en MySQL, la sintaxis es 'LIKE CONCAT ('%',: algo, '%')'. Referencia: http://stackoverflow.com/a/661207/201648 –

+1

Esto no funcionó para mí exactamente, pero me puso en el camino correcto. Tenía que hacer LIKE '%': algo '%' para que funcione. –

+0

, sé que esto no tiene relación con el tema, pero pude aplicar la inyección sql incluso usando esta declaración, ¿por qué? – NGTHM4R3

15
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?'); 
$query->bindValue(1, "%$value%", PDO::PARAM_STR); 
$query->execute(); 

if (!$query->rowCount() == 0) 
{ 
    while ($results = $query->fetch()) 
    { 
     echo $results['column'] . "<br />\n"; 
    }  
} 
else 
{ 
    echo 'Nothing found'; 
} 
+1

¿Hay alguna ventaja de usar esto sobre la respuesta aceptada? ¿El uso de 'bindValue' protege contra ataques de inyección? La respuesta aceptada básicamente niega el valor de usar marcadores de posición '?' Al concatenar la cadena de búsqueda a '%' como en los días de antiguo. – felwithe

+0

¿Cuál es el punto de usar negation antes de $ query-> rowCount() == 0? ¿Tiene esto realmente sentido? –

+0

puede simplemente explian su código – rupesh

7

También puedes probar este. Me enfrento a un problema similar pero obtuve el resultado después de la investigación.

$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search'); 

$stmt= $pdo_connection->prepare($query); 

$stmt->execute(array(':search' => '%'.$search_term.'%')); 

$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

print_r($result); 
+0

Edité su publicación para poner el código en un bloque de código - puede leer más sobre el formato de publicación en http://stackoverflow.com/help/formatting. Algún otro usuario optó por rechazar su respuesta sin dejar un comentario, por lo que no estoy seguro de la causa de la votación negativa. – josliber

+2

Para repetir, no voté su pregunta; alguien más votó negativamente. – josliber

-1

DOP escapa "%" (puede conducir a la inyección SQL): El uso del código anterior dará los resultados deseados cuando se busca para que coincida con cadenas parciales PERO si un usuario escribe el carácter "% "aún obtendrás resultados incluso si no tienes nada almacenado en la base de datos (puede generar inyecciones sql)

He intentado con mucha variación, todo con el mismo resultado que PDO está escapando"% "de liderazgo resultados de búsqueda no deseados/no citados

pensé que valía la pena compartir si alguien ha encontrado una palabra alrededor de ella por favor, comparta

+1

Esto es del Manual: http://us3.php.net/manual/en/pdo.prepared-statements.php Este es otro post donde sobre el tema: http://stackoverflow.com/questions/22030451/php-pdo-like-escaping-the-character-when-combining-with-wildcard Me gustaría saber su opinión sobre este tema. –

+0

Solución posible (sin prueba) Utilice ** CONCAT **, como: $ sql = "SELECCIONAR item_title FROM item WHERE item_title LIKE CONCAT ('%',?, '%')"; Referencia: http://blog.mclaughlinsoftware.com/2010/02/21/php-binding-a-wildcard/ –

+0

PDO no escapa%. Es tu código que lo hace mal. Para la solución que se supone que debes ** leer las respuestas ya proporcionadas aquí ** –

1

Esto funciona:

search `table` where `column` like concat('%', :column, '%') 
Cuestiones relacionadas