Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    vocali accentate trattate in modo diverso nella pagina e nel DB

    Spiego l'ambiente ed il problema.
    il DB ha: Collation utf8_general_ci
    i campi sono del tipo varchar(150) utf8_general_ci
    la pagina ha: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    Quindi, secondo me le due interfacce, la pagina PHP ed il MYSQL, sembrano allineate nella codifica ma si comportano in modo diverso.
    Cerco di inserire questi dati (esempio banalissimo):
    mikè
    città

    Ebbene mi trovo in questa situazione:
    Nel DB vengono registrati:
    mikè
    cittÃ
    Ritornando al form in caso di errore mi ritrovo:
    mik�
    città
    Leggendo i dati dal DB nella pagina mi ritrovo con i dati giusti.
    Qui di seguito metto due frammenti di codice:
    uno per la preparazione dei dati e l'altro per richiamarli nella pagina.

    Per il momento uso solo stripslashes e addslashes. Ma ho provato, uno alla volta, anche con tutti gli altri controllo ora commentati
    Codice PHP:
    $errors = array();
    $values = array();
    for(
    $i=0;$i<count($fields);$i++) {
        if (
    trim($_REQUEST[$fields[$i]]) == "") {
            if (
    in_array($fields[$i], $fields_request)) {
                
    $errors[] = "<font color='RED'>E' necessario inserire il campo " $fields[$i] . "</font>";
            }
        } else {
            
    $value $_REQUEST[$fields[$i]];
            
    $value stripslashes($value);
    //        $value = htmlentities(get_magic_quotes_gpc() ? stripslashes($value) : $value);        
    //        $value = utf8_decode($value);
    //        $value = htmlspecialchars_decode(htmlentities($value));
    //        $value = htmlspecialchars_decode($value);
    //        $value = htmlentities($value, ENT_COMPAT, 'UTF-8');
    //        $values[$fields[$i]] = mysql_real_escape_string($value);
            
    $values[$fields[$i]] = addslashes($value);
            
    $_SESSION['sess_' $fields[$i]] = $value;
        }

    Per visualizzare i dati uso il classico:
    Codice PHP:
    $Query_user "select * from " $table;
    echo 
    $Query_user "<br />\n";
    $result mysql_query($Query_user);
    $num_row mysql_num_rows($result);
    $numfields mysql_num_fields($result);
    $fields = array(); 
    for (
    $i=0$i $numfields$i++) {
        
    $fields[] = mysql_field_name($result$i);
    }
    echo 
    $num_row " record letti<br />\n";
    echo 
    "<table>\n";        
    echo 
    "<tr>\n";
    for (
    $i=0$i $numfields$i++) {
        echo 
    "<td>" $fields[$i] . "</td>\n";
    }
    echo 
    "</tr>\n";
    while (
    $row mysql_fetch_array($result)) {
        echo 
    "<tr>\n";
        for (
    $i=0$i $numfields$i++) {
            echo 
    "<td>" $row[$fields[$i]] . "</td>\n";
        }
        echo 
    "</tr>\n";
    }
    echo 
    "</table>\n"
    Si potrà pensare che se i dati si visualizzano correttamente ci si può trovare soddisfatti. Ma temo che questo possa incidere su ricerche mirate.

    Grazie per l'aiuto

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Dove fai la connessione al db, subito dopo la selezione del database, mettici

    mysql_set_charset('utf8');

    assicurati anche che i file php siano salvati in formato "UTF8 senza BOM" oppure "ANSI as UTF8" (dipende dall'editor che usi per verificare il charset il nome, sono la stessa cosa)

  3. #3
    Dimenticavo di dire che legghendo il codice HTML generato nella pagina PHP, a seconda del metodo usato, leggo questo
    codice:
    <td>d'asc&egrave;</td>
    <td>citt&agrave;</td>
    
    oppure
    
    <td>mikè</td>
    <td>città</td>

  4. #4
    Ciao Alhazred,
    grazie per la rapidissima risposta.
    Allora per l'editor uso DW.
    Facendo proprietà pagina (ALT - J) in titolo/codifica leggo "Unicode(UTF-8)"
    Per quanto riguarda la riga: mysql_set_charset('utf8'); Per la connessione e la scelta del DB uso una funzione persolane
    Questa riga la metto nella funzione o nella pagina appena esco dalla funzione?
    Se è possibile vorrei lasciare la funzione così com'è
    Codice PHP:
    function db_connect() {
        global 
    $Host;
        global 
    $User;
        global 
    $Password;
        global 
    $DBName;
        if (!
    $link mysql_connect($Host$User$Password)) {
            echo 
    mysql_error() . "<br />\n";
            return 
    FALSE;
        }
        if (!
    mysql_select_db($DBName$link)) {
            echo 
    mysql_error() . "<br />\n";
            return 
    FALSE;
        }
        return 
    $link;

    Grazie ancora

  5. #5
    Ho tatto una prova.
    L'ho messo nella pagina, subito dopo la chiamata della funzione ed ancora mi dava lo strano carattere ( mik� )
    l'ho messo nella funzione ed ora pare che funzioni bene. Le due interfacce per ora sembrano allineate bene.
    Spero solo che col tempo non smetta di funzionare.

    Codice PHP:
    function db_connect() {
        global 
    $Host;
        global 
    $User;
        global 
    $Password;
        global 
    $DBName;
        if (!
    $link mysql_connect($Host$User$Password)) {
            echo 
    mysql_error() . "<br />\n";
            return 
    FALSE;
        }
        if (!
    mysql_select_db($DBName$link)) {
            echo 
    mysql_error() . "<br />\n";
            return 
    FALSE;
        }
        
    mysql_set_charset('utf8');
        return 
    $link;

    Grazie ancora
    Ultima modifica di micdas; 18-11-2013 a 00:39

  6. #6
    A-ri-ciao
    grazie al tuo suggerimento ho risolto il problema della incongruenza della scrittura dei dati nel DB e nella pagina PHP che richiama i dati: mysql_set_charset('utf8'); dopo la selezione del DB.

    Continuando con le prove ho ancora dei problemi col ritorno al form in caso di errore.
    Posto i codici:
    Il processo al form:
    Codice PHP:
    for($i=0;$i<count($fields);$i++) {
        if (
    trim($_REQUEST[$fields[$i]]) == "") {
            if (
    in_array($fields[$i], $fields_request)) {
                
    $errors[] = "<font color='RED'>E' necessario inserire il campo " $fields[$i] . "</font>";
            }
        } else {
            
    $value $_REQUEST[$fields[$i]];
            
    $value Strip_tags($value);
            
    $value stripslashes($value);        
    //        $value = htmlentities(get_magic_quotes_gpc() ? stripslashes($value) : $value);        
    //        $value = utf8_decode($value);
    //        $value = htmlspecialchars_decode(htmlentities($value));
    //        $value = htmlspecialchars_decode($value);
    //        $value = htmlentities($value, ENT_COMPAT, 'UTF-8');
    //        $values[$fields[$i]] = mysql_real_escape_string($value);
            
            
    $values[$fields[$i]] = addslashes($value);
            
    $_SESSION['sess_' $fields[$i]] = $value;
        }
    }
    ///////// se non ci sono errori si procede alla scrittura nel DB, altrimenti si torna al form con le $_SESSION valorizzate come sopra 
    Questo nel form quando si torna dopo un errore:
    Codice PHP:
    if ($_SESSION['sess_error']) {
            $error = $_SESSION['sess_error'];
            $cognome = $_SESSION['sess_cognome'];
            $nome = utf8_decode($_SESSION['sess_nome']);
            $indirizzo = $_SESSION['sess_indirizzo'];
            $cap = $_SESSION['sess_cap'];
            $citta = $_SESSION['sess_citta'];
            $prov = $_SESSION['sess_prov'];
            $nazione = $_SESSION['sess_nazione'];
            $tel = $_SESSION['sess_tel'];
            $mail = $_SESSION['sess_mail'];
            $username = $_SESSION['sess_username'];
            foreach ($_SESSION['sess_error'] as $valore) {
                echo $valore . "<br />\n";
            }
    }
    // .........................
    <tr>
     <td>cognome (*)</td>
     <td><input type="text" name="cognome" size="30" value="<?php echo $cognome?>" class="si" /> </td>
    </tr>
    Nel form dopo il ritorno noto ancora caratteri fastidiosi tipo questo: mik� invece di mikè.
    Questo potrebbe indurre un utente inesperto ad accettare il valore mik� combinando guai nel DB.

    Da tener presente è che la pagina del processo è una pagina fantasma che non si vede nel browser, quindi senza DOCTYPE, che tramite una header("location: " . $go); va ad una pagina o ad un'altra a seconda dell'esito.

    Grazie per i suggerimenti

  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Il problema potrebbe essere che prima non usavi il mysql_set_charset(), quindi i valori inseriti in precedenza sono ormai salvati in modo errato.
    Devi risistemarli tutti a mano o creandoti uno script che se ne occupi.

    E' da ora in avanti che non avrai più problemi.

  8. #8
    Ciao Alhazred,
    no, non è così. Siccome sto lavorando in locale ed il form appunto per questi problemi della codifica dei caratteri ancora non è pronto, via via che vado avanti il DB lo cancello ad ogni errore che riscontro,

    Invece, come vedi dai frammenti di codice che sto postando, dalla pagina del processo a quella del form a cui torno solo in caso di errori, il DB non viene interrogato perchè se nella pagina del processo riscontro un qualche errore, torno al form coi dati inviati tramite le SESSION. Nella pagina del processo carico le session e nella pagina del form le leggo.

    Forse sbaglio o a caricare le SESSION o a leggerle.
    Come facevo notare più sopra, c'è una cosa che mi turba un tantinello. Mentre la pagina del form è una pagina completa di DOCTYPE, quella del processo ne è priva e contiene solo il codice di convalida per poter usare la header("location: " . $go);. Non vorrei che fosse questo il problema.

    Aspetto un chiarimento a proposito


  9. #9
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Allora, perché tutto funzioni devono avere la stessa codifica le seguenti cose:
    - collation DB
    - charset tabelle
    - tag <meta charset="utf-8"> delle pagine (serve solo se deve mostrare il testo su una pagina, se è solo uno script php che elabora dati non serve)
    - mysql_set_charset subito dopo la connessione al db
    - charset dei file php
    se tutto questo è impostato in modo corretto, i caratteri li avrai sempre codificati nel modo giusto.

    Per il charset dei file scarica Notepad++ (è gratuito) aprili e guarda in basso a destra, deve esserci scritto "ANSI as UTF8", se non c'è scritto così, dal menu "Formato" scegli "Converti in UTF8 Senza BOM" e salva.
    Ultima modifica di Alhazred; 19-11-2013 a 00:56

  10. #10
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Allora, perché tutto funzioni devono avere la stessa codifica le seguenti cose:
    - collation DB
    - charset tabelle
    - tag <meta charset="utf-8"> delle pagine (serve solo se deve mostrare il testo su una pagina, se è solo uno script php che elabora dati non serve)
    - mysql_set_charset subito dopo la connessione al db
    - charset dei file php
    se tutto questo è impostato in modo corretto, i caratteri li avrai sempre codificati nel modo giusto.

    Per il charset dei file scarica Notepad++ (è gratuito) aprili e guarda in basso a destra, deve esserci scritto "ANSI as UTF8", se non c'è scritto così, dal menu "Formato" scegli "Converti in UTF8 Senza BOM" e salva.
    Sembra tutto come indicato da te:
    In Notepad++ Per i due files del form e del processo e del file dove ho le funzioni personali:
    - ANSI as UTF-8
    - Codifica in UTF-8 (senza BOM)

    In phpmyadmin:
    - DB: Set di caratteri MySQL: UTF-8 Unicode (utf8)
    - TABELLA: utf8_general_ci
    - I campi testo: varchar(20) utf8_general_ci, naturalmente gli altri campi (int e timestamp) non hanno Collation

    Nella funzione personale che crea le connessioni:
    mysql_set_charset subito dopo la connessione al db fatto come si vede nel codice postato più sopra.

    Questo nelle funzione:
    if (!mysql_select_db($DBName, $link)) {
    ..............
    }
    mysql_set_charset('utf8');

    CONCLUSIONE:
    Sembra tutto come suggerito da te (ho sempre usato questa codifica perchè ho notato che è quella che da meno problemi). E' da molto che uso i FORM, ma è la prima volta che ho questo problema che pare non voglia risolversi.
    Invece è la prima folta che uso le SESSION per spostare valori da una pagina ad un'altra.

    Un piccolo dubbio mi viene che l'anomalia sia dovuta su come memorizzo i valori nelle SESSION e su come le leggo.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.