2011-09-22 12 views
6

Sto ricevendo dati nel mio database senza alcun problema usando mysql_real_escape_string.In PHP, come posso creare una query di selezione mySQL che contiene sia le virgolette che gli apostrofi?

Quindi, una voce nel database potrebbe essere:

1/4" Steve's lugnuts 

Ecco, questo è perfettamente nel database.
Ora voglio cercare quella cosa esatta. Ma si incasinerà al "o al" (ho provato un certo numero di cose, e incasina sempre da qualche parte)

Ecco cosa ho ora: (user_input proviene da un modulo sul pagina precedente)

$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>"; 

ma il problema è che io non riesco a ottenere nulla, ma gli errori
il campo di ricerca (che si suppone per popolare con quello che già messo in) ha appena:.

1/4\" Steve\ 

Cosa sto facendo g sbagliato?

risposta

5

Il campo di ricerca (che si suppone per popolare con quello che già messo in) ha appena 1/4\" Steve\

ovviamente ce l'ha!
Hai perso la tua fuga. mysql_real_escape_string è solo per SQL! ma stai usando il risultato per l'html. Mentre per l'HTML devi usare un modo completamente diverso di fuggire.

Quindi, lo rendono

$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>"; 

notare, inoltre, che non v'è alcuna utilità nel eco tali grandi blocchi di codice HTML. Proprio vicino tag PHP e poi scrivere 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> 

Sembra maniera più chiara, leggibile e comodo

+0

Questo è esattamente il problema che stavo avendo. Vorrei poter scegliere due risposte, perché anche se questo PERFETTAMENTE ha affrontato il mio particolare problema, la risposta di Tomas T. è stata molto istruttiva, e probabilmente ciò che le persone cercheranno anche quando arriveranno qui. Grazie mille! –

+0

Inoltre ... tutto ciò viene echeggiato in PHP ... Questo è tutto all'interno di un ciclo ricorsivo in PHP comunque - Non penso di poter uscire da PHP senza rovinare quel genere di cose. –

+0

non c'è assolutamente niente da fare. Tutto andrebbe bene anche nel ciclo. –

-1

Stampa il tuo messaggio "SELECT * FROM some_table WHERE some_column LIKE '% $ user_input%'" per vedere cosa sta facendo (ed escaping).

Non una soluzione, ma date un'occhiata a mysqli o pdo (http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php), hanno utilità per le istruzioni preparate.

0

non so se è di sicuro sicuro, ma non dovresti scappare per la query e un'altra volta per l'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)."'>"; 

modificare

, magari, non vuole cambiare (fuga) l'input ($ user_input) ogni volta che si invia ..although se il suo unico 'e "questo è influenzato potrebbe non importa comunque

+0

sì, ma penso che l'OP abbia anche problemi con la query. – roymustang86

+0

Sfortunatamente, questo non funziona affatto. Ottengo Warning: mysql_query() si aspetta che il parametro 2 sia risorsa, stringa data in search_results.php sulla riga 19 e Warning: mysql_fetch_array() si aspetta che il parametro 1 sia risorsa, nullo dato in search_results.php sulla riga 20 Inoltre. ..e forse il più significativo ... L'input che mi hai dato dà la stessa identica cosa che ho, dove la casella di ricerca contiene solo 1/4 "Steve invece di 1/4" di Steve Lugnuts. –

+0

e in seguito hai utilizzato la prima parte che ho scritto come: $ search_row = mysql_query ($ query); seguito dal tuo mentre ...? –

4

Beh, il problema è proprio citando. Il tuo problema è che hai bisogno di quotazioni diverse per MySQL e per HTML, e probabilmente potresti anche avere set magic_quotes_gpc!Quando si cita, si cita sempre di testo per qualche particolare uscita, come:

  1. valore della stringa per la query mysql
  2. like espressione di query mysql
  3. codice html
  4. JSON
  5. mysql espressione regolare
  6. php espressione regolare

Per ogni caso, è necessario un preventivo diverso, poiché ogni utilizzo è presente in un contesto di sintassi differente. Ciò implica anche che il quoting non debba essere eseguito all'ingresso in PHP, ma all'uscita specifica! Il motivo per cui funzionalità come magic_quotes_gpc sono interrotte (assicurano che sia spento !!!).

Quindi, quali metodi utilizzare per citazioni in questi casi particolari? (Sentitevi liberi di correggermi, ci potrebbero essere i metodi più moderni, ma questi stanno lavorando per me)

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode() - solo per utf8! Uso la mia funzione per iso-8859-2
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - in questo caso non è possibile utilizzare preg_quote perché il backslash sarebbe sfuggito due volte!
  6. preg_quote()

EDIT: quanto riguarda la tua domanda iniziale - se si corregge la vostra citazione, è quindi possibile utilizzare naturalmente tutti i caratteri nelle stringhe, comprese le virgolette singole e doppie.

+1

Questa è una * davvero * buona risposta! È il tipo di cosa che rende le persone vogliono usare StackOverflow, penso ---! Sebbene il Col. Shrapnel abbia risposto in modo specifico alla mia domanda, questo era ENORME nella sua portata, e farò spesso riferimento alla tua risposta. Votata per te! –

Problemi correlati