Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 43

Discussione: Problemi con database di AlterVista

  1. #1
    Guest

    Predefinito Problemi con database di AlterVista

    Salve,
    quando vado a salvare dei caratteri accentati sul database, sia tramite mysqli_real_escape_string (che non dovrebbe influenzare) sia senza nulla, vengono salvati così: òèò Ã*èò
    Se invece lo faccio in locale (ho mysql 5.6) si salvano correttamente...
    Come posso risolvere?
    Ho bisogno di salvarli così come sono perché devo limitare il numero massimo di caratteri, e perciò non posso neanche usare htmlentities il quale me li salva correttamente è à ecc....

  2. #2
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Controlla le codifiche che usi. Come è impostata la tabella del database? Qual è la codifica usata per i dati che vi inserisci?

  3. #3
    Guest

    Predefinito

    Sia su altervista che in locale il campo in questione ha la seguente codifica:
    utf8_general_ci
    Anche nella pagina principale di phpmyadmin, nel tab "Server del Database" c'è scritto, su entrambi, questo:
    Codifica caratteri del server: UTF-8 Unicode (utf8)

    Per i dati che inserisco non so quale uso, lascio tutto come è di base in PHP...
    Siccome i file che carico sono gli stessi, e la struttura del database è la stessa, magari è la differente versione di PHP o MySQL?

  4. #4
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    PHP non ha una codifica di base: tratta le stringhe come sequenza di byte, senza interpretarle secondo una data codifica. Quindi tipicamente prende i dati come vengono forniti dal client. Puoi indicare l'indirizzo della pagina da cui vengono inviati i dati allo script PHP?

  5. #5
    Guest

    Predefinito

    È che devi essere loggato, quindi dovresti stare li a registrarti :P
    Comunque è uno script ajax, posso darti il codice:

    JQuery:
    Codice:
    $("#save").click(function(){
    			var msg = $('#text').val();
    			 $.ajax({
    					type: "POST",
    					url: "data.php",
    					data: "msg="+msg,
    					dataType: "html",
    					success: function(save) {
    						$("#div").html(save);
    					}
    				});
    		});
    Code PHP nel file data.php

    Codice PHP:
    $message = mysqli_real_escape_string($conn, $_POST['msg']);
    if(!empty(
    $message)){
    mysqli_query($conn, "INSERT INTO text (text) VALUES ('$message')");
    }
    Ho tolto query e variabili aggiuntive per fare ordine, non penso esse influenzino il codice...

  6. #6
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Il metodo send di XMLHttpRequest invia normalmente in UTF-8: http://www.w3.org/TR/XMLHttpRequest/...-send-a-string
    Verifica con gli strumenti per sviluppatori la richiesta in uscita, in particolare l'header Content-Type ed il corpo della richiesta. Controlla poi con phpMyAdmin se la stringa viene riportata correttamente sul database, infine controlla la codifica della pagina usata per mostrare i dati.

  7. #7
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Allora è vero che php tratta una stringa indipendentemente dalla codifica ma dimenticate che php e impostato come text/html charset iso-8859-1 qui su altervista se non si specifica proprio il mime type (altri utf-8). Supponiamo che crei un file php con codifica utf-8 e io faccio la stampa di un carattere non ascii (es. accenti) tipo "é" non visualizzo "é" ma due byte in iso-8859-1. Il riferimento sono i byte non i caratteri.ps. controllate i byte nelle rispettive tabelle delle codifiche. EDIT: ò se letto in utf-8 è ò. (devi inviarlo come mime type utf-8 dal form html)
    Ultima modifica di darbula : 19-10-2015 alle ore 01.21.11

  8. #8
    Guest

    Predefinito

    Sia con
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    che con
    <meta charset="UTF-8">

    fa sempre la stessa cosa...
    Anche con questo
    header('Content-Type: text/html; charset=utf-8');
    Ultima modifica di competenzepertutti : 19-10-2015 alle ore 12.42.05

  9. #9
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Per un'analisi piu accurata puoi postare il contenuto della pagina html del form? ps. hai cancellato la cache del browser? cmq. devi fare anche l'escape con funzioni del proprio database se sono dati generati dall'esterno ops non avevo notato che già usi l'escape EDIT: ps. se non si specifica un charset in fase di login in una query verrà usato il charset latin1 di default qui su altervista.
    Ultima modifica di darbula : 20-10-2015 alle ore 19.20.43

  10. #10
    Guest

    Predefinito

    È uno script ajax, non ho messo nessun form. Comunque faccio l'escape dal file su altervista

  11. #11
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    hai provato il charset direttamente dal file data.php?

  12. #12
    Guest

    Predefinito

    Nel file data.php ho provato solo con l'header, perché è tutto PHP, non ho una <head>..dove lo dovrei mettere?

    Codice PHP:
    bool mysql_set_charset ( string $charset [, resource $link_identifier = NULL ] )
    Metto questo prima del mysqli_query();?
    Ultima modifica di competenzepertutti : 20-10-2015 alle ore 20.33.59

  13. #13
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    non puoi mescolare mysql con mysqli. Devo verificare per una risposta piu approfondita [EDIT:] http://php.net/manual/en/mysqlinfo.concepts.charset.php anche se i dati verranno convertiti (solo in lettura) in visualizzazione ascii, Al momento non ho altre soluzioni
    Ultima modifica di darbula : 21-10-2015 alle ore 20.06.51

  14. #14
    Guest

    Predefinito

    Si è vero errore mio, non mi ero accorto che era mysql, ci metto comunque il corrispondente mysqli...Domani provo e ti faccio sapere.

  15. #15
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    ok ma fai sapere se la tabella è in utf-8 e non il database, probabile che al momento della creazione della tabella non hai specificato il charset (quindi latin1).. Mi è venuto questo dubbio.
    Ultima modifica di darbula : 22-10-2015 alle ore 05.05.15

  16. #16
    Guest

    Predefinito

    Nome|Tipo|Codifica caratteri
    text varchar(72) utf8_general_ci

  17. #17
    Guest

    Predefinito

    Ok, con mysqli_set_charset($conn,"utf8"); funziona :) grazie mille...
    Però ora non riesco a far venire fuori i dati correttamente, in pratica se all'htmlentities non metto nulla, mi legge le lettereaccentate ma non il simbolo €, se gli metto UTF-8 mi legge il simbolo € ma non le lettere accentate...
    Questo forse me li legge entrambi? ISO-8859-15
    E come potrei fare se poi mi scrive qualcosa un cinese? :S
    Non c'è una codifica che legga tutti i simboli del mondo?
    Ultima modifica di competenzepertutti : 22-10-2015 alle ore 14.33.49

  18. #18
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    quacosa è contenuto in cinese in utf-8. Se vuoi esiste anche utf-32 pero i comandi per mysql devono rinanerecon un insieme di caratteri ascii. Nome|Tipo|Codifica caratteri
    text varchar(72) utf8_general_ci questo è solo la codifica del campo e non della tabella.

  19. #19
    Guest

    Predefinito

    Anche la tabella è cosi: utf8_general_ci

    Nemmeno con htmlentities($testo, ENT_QUOTES, "UTF-32") il simbolo € si vede...
    Appare un punto di domanda su rombo nero.
    Ultima modifica di competenzepertutti : 22-10-2015 alle ore 17.28.06

  20. #20
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    ricapitolando scrivi come fai tutti passaggi. mostra il codice di login mysql se è a parte, documento html, data.php. come leggi i dati? con header utf-8 nel caso di php? (ops. lo leggi direttamente dal database) qui va messo solo il charset originale della stringa in oggetto htmlentities($testo, ENT_QUOTES, "UTF-32"). qundi utf-8. Se vuoi utilizzare UTF-32 puoi solo scriverlo a mano/browser perchè php supporterà solo se sarà almeno presente un sottoinsieme di caratteri ASCII che purtroppo non sono presenti in utf-32 (es; a,b,c ecquivalgono a 4 bytes ciascuno)
    Ultima modifica di darbula : 23-10-2015 alle ore 19.45.04

  21. #21
    Guest

    Predefinito

    Lo script ajax è sempre questo:
    Codice:
    $("#save").click(function(){
    			var msg = $('#text').val();
    			 $.ajax({
    					type: "POST",
    					url: "data.php",
    					data: "msg="+msg,
    					dataType: "html",
    					success: function(save) {
    						$("#div").html(save);
    					}
    				});
    		});
    Prende il valore della textarea con id "text" e lo invia a data.php tramite POST
    Questo è il codice PHP che uso in data.php:
    Codice PHP:
    $message = mysqli_real_escape_string($con, $_POST['msg']);
    if(!empty(
    $message)){
    mysqli_set_charset($con,"utf8");
    mysqli_query($con, "INSERT INTO text (text) VALUES ('$message')");
    }
    E fin qui tutto ok, mi inserisce le lettere come sono ovvero se scrivo 'à', ne database mi inserisce 'à'.
    Questo invece è il codice PHP che uso per estrarre i dati dal database:
    Codice PHP:
    $gettext = mysqli_fetch_arrray(mysqli_query($con, "SELECT * FROM text WHERE id= '$id' "));
    $mex = htmlentities($gettext['text'], ENT_QUOTES, "UTF-8");
    $realmessage = trim(preg_replace('/\s+/', ' ', $mex)); //Lo uso per togliere gli spazi.
    echo "<div>$realmessage</div>";
    In questo modo le frasi che contengono parole accentate scompaiono.
    il simbolo € si vede correttamente

    Se metto
    Codice PHP:
    $mex = htmlentities($gettext['text'], ENT_QUOTES);
    Le frasi con parole accentate si vedono correttamente
    Il simbolo € risulta un punto di domanda su rombo nero.
    Ultima modifica di competenzepertutti : 23-10-2015 alle ore 19.48.21

  22. #22
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    qui su altervista il php e con text/html iso-8859-1 metti header utf-8 di php senza htmlentities (per farti capire che oltre al simbolo euro si vedranno anche gli accenti se la pagina php è utf-8) che ti fa la magia
    Ultima modifica di darbula : 23-10-2015 alle ore 19.57.03

  23. #23
    Guest

    Predefinito

    E per evitare che mi vengano usati <script>? Uso htmlspecialchars?

  24. #24
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Utilizzi htmlentities o htmlspecialchars.. Ti ho chiesto solo di verificare se funziona visto che sei il proprietario del sito. Poi ovvio che li converti.
    Codice PHP:
    $message = mysqli_real_escape_string($con, $_POST['msg']);
    if(!empty(
    $message)){
    mysqli_set_charset($con,"utf8");
    mysqli_query($con, "INSERT INTO text (text) VALUES ('$message')");
    }
    CAMBIA IN
    Codice PHP:
    if(!empty($_POST['msg'])){
    $message = mysqli_real_escape_string($con, $_POST['msg']);
    mysqli_set_charset($con,"utf8");
    mysqli_query($con, "INSERT INTO text (text) VALUES ('$message')");
    }
    Ultima modifica di darbula : 23-10-2015 alle ore 20.18.01

  25. #25
    Guest

    Predefinito

    Codice PHP:
    header('Content-Type: text/html; charset=utf-8');
    $gettext = mysqli_fetch_arrray(mysqli_query($con, "SELECT * FROM text WHERE id= '$id' "));
    $realmessage = trim(preg_replace('/\s+/', ' ', $gettext['text'])); //Lo uso per togliere gli spazi.
    echo "<div>$realmessage</div>";
    Ho sostituito così ma non funziona, sempre i punti di domanda...
    So che gli header di PHP vanno usati prima di ogni output, essendo che il mio è uno script ajax, può essere che non funzioni perché c'è gia dell'output?

  26. #26
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    html e già output. apri php inserendo prima
    Codice PHP:
    header('Content-Type: text/html; charset=utf-8');
    . puo darsi che sia mysql che li converte in iso-8859-1
    Codice PHP:
    mysqli_set_charset($con,"utf8");
    $gettext = mysqli_fetch_arrray(mysqli_query($con, "SELECT * FROM text WHERE id= '$id' "));
    $realmessage = trim(preg_replace('/\s+/', ' ', $gettext['text'])); //Lo uso per togliere gli spazi.
    echo "<div>$realmessage</div>";
    Ultima modifica di darbula : 23-10-2015 alle ore 21.08.33

  27. #27
    Guest

    Predefinito

    Ma su che file?
    Su quello principale o su quello dove faccio ajax?

  28. #28
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    solo se invii e leggi i dati da ajax
    Ultima modifica di darbula : 23-10-2015 alle ore 21.14.25

  29. #29
    Guest

    Predefinito

    Messo su entrambi i file prima di tutto ma non funziona neanche lo stesso.
    Noto però che comunque questo carattere "è " me lo trasforma correttamente in è e questo "€" in €, mentre èòàù€ me li trasforma in punti di domanda.

  30. #30
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Codice PHP:
    <?php
    header
    ('Content-Type: text/html; charset=utf-8');
    echo
    'èòàù€';
    ?>
    . mostra il giusto contenuto. Non capisco succede qualcosa a livello di mysql.

Pagina 1 di 2 12 UltimoUltimo

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •