Domanda sui form di input
Domanda sui form di input postato il 20/10/2016 20:11:19 nel forum programmazione, open source e hosting
Buonasera a tutti,
ho programmato da poco una nuova funzione in land, per la quale ho bisogno che la frase immessa tramite in normale
<input type=Text Name=Messaggio...
resti "nel form" dopo assere stato inviato.
Dato che il form ha due tasti e mi interessa che premuto il primo NON mantenga la frase inviata e il secondo sì, o dato un "id" ai due tasti e poi con un
if ($_POST['Tasto2']) {
$CarDefault = $_POST["Messaggio"];
ho "tendenzialmente" risolto il compito.
Il problema è che questo sistema funziona perfettamente per tutti i caratteri immessi nella stringa del form, MA sostituisce la prima virgoletta " con un \ e "tronca" il resto della frase.
Nota: Il tasto invia la frase anche in database, dove arriva con tanto di "virgolette" e testo successivo, MA non compare più come "valore della casella di input" del form dopo il post/submit.
Qualche idea del perché e su come risolvere?
Grazie a tutti :-)
Pagine → 1
20/10/2016 21:59:49
La prima risposta che mi viene in mente è che la versione di php che hai impostato sulla land sia una di quelle versioni che ha ancora l'impostazione magic_quotes_gpc http://php.net/manual/en/security.magicquotes.what.php ↗ e la abbia attiva. Le varie funzioni magic_quotes, effettuano in automatico un escape, il famoso \\, dei caratteri per le variabili $_GET, $_POST, $_COOKIE
magic_quotes_gpc Affects HTTP Request data (GET, POST, and COOKIE). Cannot be set at runtime, and defaults to on in PHP. See also get_magic_quotes_gpc().
Per questo quando recuperi il valore della frase dal form perchè venga ripresentata nel form ti ritrovi i backslash.
Puoi risolvere il problema, togliendo i backslash DOPO, spero di averlo enfatizzato abbastanza, che l'input è stato inserito nel database $CarDefault viene usato anche per quello, altrimenti puoi farlo in qualsiasi punto dello script.
Per rimuovere i backslash puoi usare la funzione di php che preferishi da un str_replace() ad un stripslashes().
20/10/2016 23:33:49
Hmm, credo che la mia versione di php abbia disattivato il magic_quotes_gpc.
Anche perché il problema non è che mi "stampa" nel form il carattere "escaped" con \, bensì, se questa è la frase:
Ciao test "come va"
Il form riporta solo:
Ciao test
Quindi non mi "elimina" o sostituisce le "" ma cancella tutto quello che viene dopo la prima "
(Infatti se scrivessi: 123456"789, restituisce solamente 12345 (senza backslash o altro).
21/10/2016 00:10:50
Dovresti fare l'escape HTML di tutto ciò che stampi sulla pagina.
Questo include anche i valori che inserisci nei form.
Passa la frase che devi inserire nel form attraverso la funzione
htmlentities($variabile, ENT_QUOTES, 'UTF-8');
In questo modo le virgolette non verranno più considerate come codice HTML e non termineranno più il campo value="" del tag <input>
21/10/2016 00:19:03 e modificato da dyrr il 21/10/2016 00:19:48
ah, ok, in coma io che avevo capito una cosa diversa, ho riletto meglio il messaggio ora e ho capito cosa intendi.
Quando stampi $CarDefaul lo passi per qualcosa tipo htmlentities()?
Perchè se no è normale che ti tronchi il tutto perchè se la frase che stampi è tipo:
Si poteva dire "stanco" della cosa
l'html diventa:
<input type="text" value="Si poteva dire "stanco" della cosa />
e si chiude dopo dire alle prime virgolette dello stanco, perchè non essendo state trasformate nelle loro equivalenti entità html, chiudono l'input
esempio veloce di cosa intendo:
https://jsfiddle.net/Dyrr/m3smzh67/ ↗ https://jsfiddle.net/Dyrr/m3smzh67/
21/10/2016 00:32:41
Rieccomi.
Sì, il problema è sicuramente quello e alla fine ho risolto in un modo... strano:
Ho provato i vari htmlspechial, e il citato "htmlentities". Fatto sta che scrivendo così:
$CarDefault = htmlentities($_POST["Messaggio"])
Funziona... ma se ci metto una lettera accentata (è é ò à ù) non stampa più nulla.
Quindi alla fine ho fatto una cosa molto poco elegante e suppongo che ai veri programmatori sanguineranno gli occhi leggendolo ma:
$CarDefault = str_replace('"', '\'\'', $_POST["Messaggio"]);
funziona... XD
Se avete soluzioni più eleganti/formalmente corrette (e non avete gli occhi insanguinati) sono tutto occhi, se no, grazie a tutti per l'aiuto :-)
21/10/2016 01:05:23
If the input string contains an invalid code unit sequence within the given encoding an empty string will be returned, unless either the ENT_IGNORE or ENT_SUBSTITUTE flags are set.
Fonte http://php.net/manual/en/function.htmlentities.php ↗ http://php.net/manual/en/function.htmlentities.php
Man mano che sono uscite nuove versioni di php htmlentities() come potrai leggere nel link che ho citato ha cambiato le sue impostazioni di default e ora se usi semplicemente htmlentities(9 e la string ritorna alcuni caratteri invalidi per il set di caratteri usato (di default UTF8) ritorna una stringa vuota. per esempio una soluzione è passare la stringas così:
htmlentities($string, ENT_QUOTES|ENT_SUBSTITUTE, "UTF-8", false);
I vari parametri li vedi sempre sul link che ti ho dato.
Devi controllare che tipo di codifica caratteri usa la pagina html e allinearla con quella che è la codifica dell'htmlentities, se no rischi che ci siano errori di codifica dei caratteri
21/10/2016 12:16:40
dyrr ha scritto:
htmlentities($string, ENT_QUOTES|ENT_SUBSTITUTE, "UTF-8", false);
I vari parametri li vedi sempre sul link che ti ho dato.
Pofferbacco! Stasera ci provo, così magari evito quell'orrendo giro di str.replace XD
Grazie, vi faccio sapere come va :-)
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Raja Dunia ↗
Crossout ↗
Cafuné ↗
Hero Wars ↗
Seconda Era ↗
The Coven ↗