2012-04-12 14 views
10

Estoy tratando de encontrar el número de filas que coinciden con un patrón específico. En este ejemplo, todos los que comienzan con "123":¿Cómo usar una cadena PHP en la consulta mySQL LIKE?

Esto está funcionando:

$query = mysql_query("SELECT * FROM table WHERE the_number LIKE '123%'"); 
$count = mysql_num_rows($query); 

El problema es por el estilo puede variar, así que estoy tratando de definirlo en la secuencia de comandos, a continuación, ejecutar el consulta, pero esto NO está funcionando:

$prefix = "123"; 
$query = mysql_query("SELECT * FROM table WHERE the_number LIKE $prefix.'%'"); 
$count = mysql_num_rows($query); 

¿Cómo puedo hacer que esta consulta funcione correctamente en el segundo ejemplo?

EDIT: También he intentado sin el período (también no funciona):

$query = mysql_query("SELECT * FROM table WHERE the_number LIKE $prefix'%'"); 
+0

John, algo que he encontrado me ayuda cuando el uso de variables en las cadenas, es el uso de las llaves. '$ var1 =" foo "; $ var2 = "{$ var1} bar"; echo $ bar2; 'Will output: foo bar y no tiene que preocuparse por la concatenación, etc, etc. Sin embargo, no funciona como puede pensar con comillas simples para cadenas. – Blake

Respuesta

15

Usted tiene el mal de sintaxis; no hay necesidad de colocar un punto dentro de una cadena de comillas dobles. En cambio, debería ser más como

$query = mysql_query("SELECT * FROM table WHERE the_number LIKE '$prefix%'"); 

Usted puede confirmar esto, imprima la cadena para ver que resulta idéntica a la del primer caso.

Por supuesto es no es una buena idea simplemente insertar variables en la cadena de consulta de esta manera debido al peligro de la inyección de SQL. Al menos debe escapar manualmente el contenido de la variable con mysql_real_escape_string, lo que haría que se vea tal como esto:

$sql = sprintf("SELECT * FROM table WHERE the_number LIKE '%s%%'", 
       mysql_real_escape_string($prefix)); 
$query = mysql_query($sql); 

Tenga en cuenta que dentro del primer argumento de sprintf el signo de porcentaje necesita ser duplicado para terminar apareciendo una vez en el resultado.

+0

Fantástico. Muchas gracias! – JROB

+2

Existe peligro de inyección si está utilizando datos ingresados ​​por el usuario. No hay peligro para: '$ var =" rawr "; ... query ("SELECT * FROM table WHERE col = '{$ var}'"; 'Usted está controlando sus propios datos en el servidor. – Blake

+0

@Blake: Obviamente, pero me siento obligado a decirlo de todos modos. forma de adaptarse a contextos distintos de aquel para el que estaba destinado. – Jon

3

hacerlo como

$query = mysql_query("SELECT * FROM table WHERE the_number LIKE '$yourPHPVAR%'"); 

No olvide el % al final

Cuestiones relacionadas