2011-09-22 15 views
6

Estoy obteniendo datos en mi base de datos sin ningún problema al usar mysql_real_escape_string.En PHP, ¿cómo hago una consulta de selección mySQL que contiene tanto comillas como apóstrofes?

lo tanto una entrada en la base de datos podría ser:

1/4" Steve's lugnuts 

Así que es perfectamente en la base de datos.
Ahora quiero buscar exactamente eso. Pero se estropeará en "o" (he intentado varias cosas, y siempre se estropea en alguna parte).

Esto es lo que tengo ahora: (user_input proviene de un formulario en el página anterior)

$user_input=mysql_real_escape_string($_REQUEST['user_input']); 
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' "); 
while($search = mysql_fetch_array($search_row)) 
      {stuff happens} 

echo "<form action='search_results.php' method='post'>"; 
echo "<input name='user_input' type='text' size='50' value='" . $user_input. "'>"; 
echo "<input type='submit' value='Lookup Parts' />"; 
echo "</form>"; 

pero el problema es que parece que no puede conseguir cualquier cosa menos errores
el campo de búsqueda (que se supone que llenar con lo que ya pusieron en) acaba de:.

1/4\" Steve\ 

¿Qué estoy haciendo? g mal?

Respuesta

5

El campo de búsqueda (que se supone que llenar con lo que ya pusieron en) acaba de 1/4\" Steve\

por supuesto que tiene!
Perdiste tu escape. mysql_real_escape_string es solo para SQL. pero estás usando su resultado para el html. Mientras que para el HTML tienes que usar una forma completamente diferente de escapar.

lo tanto, hacer que

$user_input=mysql_real_escape_string($_REQUEST['user_input']); 
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' "); 
while($search = mysql_fetch_array($search_row)) 
      {stuff happens} 


$user_input =htmlspecialchars($_REQUEST['user_input'],ENT_QUOTES); // here it goes 

echo "<form action='search_results.php' method='post'>"; 
echo "<input name='user_input' type='text' size='50' value='$user_input'>"; 
echo "<input type='submit' value='Lookup Parts' />"; 
echo "</form>"; 

también en cuenta que no hay uso de eco tan grandes trozos de HTML. Sólo el código de cierre PHP y luego escribir HTML puro:

?> 
<form action='search_results.php' method='post'> 
<input name='user_input' type='text' size='50' value='<?=$user_input?>'> 
<input type='submit' value='Lookup Parts' /> 
</form> 

se ve mucho más clara, legible y conveniente

+0

Este es precisamente el problema que estaba teniendo. Me gustaría poder elegir dos respuestas, porque aunque esto PERFECTAMENTE abordo mi problema particular, la respuesta de Tomas T. fue muy informativa, y probablemente también lo que la gente estará buscando cuando lleguen aquí. ¡Gracias una tonelada! –

+0

Además ... al respecto todo se repite PHP ... Todo esto está dentro de un bucle recursivo en PHP de todos modos - No creo que pueda salir de PHP sin meterse en ese tipo de cosas. –

+0

no hay absolutamente nada con lo que meterse. Todo estaría bien en el circuito también. –

-1

Imprima su frase "SELECCIONAR * DE some_table DONDE some_column LIKE '% $ user_input%'" para ver qué está haciendo (y escapando).

No es una solución, pero eche un vistazo a mysqli o pdo (http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php), tienen utilidades para las declaraciones preparadas.

0

no sé si ayuda con seguridad, pero ¿no debería escapar para la consulta y en otro momento para el html?

$query = sprintf("SELECT * FROM some_table WHERE some_column LIKE '%s' ", mysql_real_escape_string($user_input)); 

echo "<input name='user_input' type='text' size='50' value='".htmlentities($user_input)."'>"; 

edición

que tal vez no desea cambiar (escape) a su entrada ($ user_input) cada vez que envíe ..although si su único "y" eso es afectada puede ser que no importa de todos modos

+0

Sí, pero creo que OP también tiene problemas con la consulta. – roymustang86

+0

Desafortunadamente, esto no funciona en absoluto. Me aparece Warning: mysql_query() espera que el parámetro 2 sea resource, string dado en search_results.php en la línea 19 y Advertencia: mysql_fetch_array() espera que el parámetro 1 sea resource, null dado en search_results.php en la línea 20 También. ... y quizás más reveladoramente ... La información que me diste da exactamente lo mismo que tengo, donde el cuadro de búsqueda solo contiene 1/4 "Steve en lugar de 1/4" las tuercas de Steve. –

+0

y usaste la primera parte que escribí después como: $ search_row = mysql_query ($ query); seguido por tu tiempo ...? –

4

Bueno, el problema es adecuada citando. ¡Su problema es que necesita citas diferentes para MySQL y para HTML, y probablemente también podría tener magic_quotes_gpc establecido!Al citar, que siempre hay que indicar texto para alguna salida particular, como:

  1. valor de cadena para MySQL Query
  2. like expresión para consulta MySQL
  3. código html
  4. JSON
  5. MySQL expresión regular
  6. php expresión regular

Para cada caso, necesita citas diferentes, porque cada uso está presente en un contexto de sintaxis diferente. Esto también implica que la cotización no se debe realizar a la entrada en PHP, sino a la salida particular! Que es la razón por la cual las características como magic_quotes_gpc están rotas (asegúrate de que está apagado !!!).

Entonces, ¿qué métodos usaríamos para cotizar en estos casos particulares? (Siéntase libre de corregirme, puede haber métodos más modernos, pero éstos están trabajando para mí)

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode() - sólo para UTF-8! Yo uso mi función para iso-8859-2
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - ¡no se puede usar preg_quote en este caso porque la barra invertida se escaparía dos veces!
  6. preg_quote()

EDIT: En cuanto a su pregunta original - si corrige su cita, a continuación, puede utilizar, por supuesto, todos los caracteres en las cadenas, incluyendo las comillas simples y dobles.

+1

¡Esta es una * realmente * buena respuesta! Es el tipo de cosa que hace que la gente quiera usar StackOverflow, creo ---! Aunque el Coronel Shrapnel respondió mi pregunta específicamente, este fue GRANDE en su alcance, y haré referencia a su respuesta a menudo. ¡Vota por ti! –

Cuestiones relacionadas