Problema MySQL / PHP con "e"

Ho creato un semplice sistema di notizie con commenti usando PHP e MySQL, e ha funzionato benissimo sul mio server Apache locale, sia sulla mia macchina Fedora 10, sia su quella di Windows 7. Ora ho un problema però, l'ho caricato su un host web e continua a restituire tutti i 'e' come \ 'e \ ".

Credo che questo sia l'host web che automaticamente li aggiunge per ragioni di sicurezza o che MySQL è il collation sbagliato, ma non sono ancora riuscito a risolverlo, testando più collazioni MySQL.

Ecco un esempio di una query:

mysql_query("INSERT INTO news (title, poster, text, time) VALUES ('$newstitle', '1', '$newstext', '$time')") or die(mysql_error()); 

$time is time(); $newstitle e $newstext sono analizzati da $_POST ed entrambi sono gestiti attraverso mysql_real_escape_string() prima di eseguire la query (penso che questo potrebbe essere il problema, ma dal momento che fa parte della sicurezza, non voglio rimuoverlo e dal momento che non ha causato problemi sui miei server locali)

Come nota finale: sui miei server Apache locali avevo latin1_swedish_ci che non funzionava sul server degli host web.

MODIFICARE:

Sembrano così nel database:

 \'\'\'\"\"\" 

Mentre su quelli locali non avevano il backslash extra, quindi deve essere il PHP che lo aggiunge. C'è un modo per risolvere questo problema, tranne l'aggiunta di una function che rimuove i backslash aggiuntivi?

Questi backslashes aggiuntivi sono probabilmente citazioni magiche . Prova a disabilitarli o rimuoverli prima di elaborare i dati.

No, non vuoi eseguire striplashes (). Piuttosto, imposta il tuo server correttamente.

Innanzitutto, distriggers magic_quotes. Ciò significa che tutti i dati che entrano nel tuo script non avranno nulla sfuggito.

Quindi esegui mysql_real_escape_string () sui dati, che aggiungerà le barre solo per la query e archivierà i dati nel database senza le barre.

Quando carichi di nuovo i dati, sarai pronto per andare e non ci saranno barre rovesciate tra virgolette.

Modifica : come accennato più volte di seguito, e nei commenti, il modo corretto per farlo è disabilitare le virgolette magiche. Se avessi letto completamente e compreso la domanda prima di rispondere, allora probabilmente sarebbe stato meglio;)


mysql_real_escape_string() farà ciò che dice e sfuggirà ai caratteri rilevanti all'interno della string. Le virgolette per l'evasione vengono eseguite anteponendole con il carattere di escape (un back-slash in PHP e molte altre lingue). Quando si estraggono i dati dal database , si esegue qualcosa come eseguire stripslashes() (consultare il documento PHP ) sul contenuto, per rimuovere le barre da cose come le virgolette.

Modifica : come ha detto Gumbo, potrebbe anche essere dovuto al fatto che le virgolette siano abilitate sul server. Dovresti disabilitare questi come da sua risposta .

Dai un'occhiata alle tue impostazioni di magic_quotes e confrontale con i tuoi server. Probabilmente i tuoi server di casa hanno disabilitato magic_quotes (come dovrebbero essere, dato che Magic Quotes è deprecato nelle attuali versioni di PHP) e probabilmente il tuo host web li ha abilitati (che è tristemente comune). Puoi usare:

 <?php echo phpinfo(); ?> 

per un rapido confronto.

Se magic_quotes è nuovo per te, potresti voler approfondire la sicurezza di PHP prima di distribuire tutto ciò che ti interessa.

Domande contenenti "magic_quotes"

Il tuo host potrebbe avere le virgolette abilitate.

Guarda magic_quotes_gpc . Puoi distriggersrlo tramite .htaccess e utilizzare mysql_real_escape_string ().

La vera soluzione è usare le istruzioni preparate nelle tue query di inserimento.

Ecco un sito con un esempio di inserimento in alto.

Dichiarazioni preparate in PHP

Il vantaggio è che è una best practice e l'effetto collaterale è che non devi più preoccuparti di ripulire l'input dagli attacchi di SQL injection.