Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    7

    Dubbio mysql_real_escape_string

    Ciao sto realizzando una classe per la gestione di mysql e ho questo dubbio:

    Premesso che i magic_quotes sono impostati a off in php.ini i metodi sono i seguenti:

    DBCheck() // aggiunge i caratteri di escape ove necessario
    Codice PHP:
    public function DBCheck($data) {
                
                    
    // Se magic_quotes è settato a off non striplashes 
                    // non viene usata 
                    
    if (!get_magic_quotes_gpc()) {
                            if (!
    $data stripslashes(trim($data))) {
                            throw new 
    Exception($this->DBError());
                            }
                    }
                    
                    
    // Se il tipo di dato non è numerico viene usata la funzione 
                    // mysql_real_escape_string     
                    
    if (!is_numeric($data)) {
                            if (!
    $data mysql_real_escape_string($data)) {
                            throw new 
    Exception($this->DBError());
                            }
                    }
                    
                    return 
    $data;
                    
            } 
    // end method DBCheck 
    DBQuery // sottopone la query al database
    Codice PHP:
        public function DBQuery($sql_query) {
                    if (!
    $query mysql_query ($sql_query)) {
                            throw new 
    Exception($this->DBError());
                    }
            } 
    // end method DBQuery 
    Assumendo di dover inserire nome e cognome nei campi dbnome e dbcognome l'inserimento viene fatto in questo modo:

    Codice PHP:
    require ( 'configuration.php' );
    require ( 
    'dblayer_class.php' );

    try {
    // Instanzio la classe
    $db = new DBLayer ();

    $nome $_POST['nome'];
    $cognome $_POST['cognome'];

    // Preparo la query
    $sql_query sprintf ("INSERT INTO anagrafica (dbnome, dbcognome) VALUES ('%s', '%s')",
                     
    $nome $db->DBCheck($nome), 
                     
    $cognome $db->DBCheck($cognome));

    // Stampo la query
    echo $sql_query;

    // Inserisco i dati nel database
    $db->DBQuery($sql_query);
    }

    catch (
    Exception  $e) {      
            
    $e->getMessage(); 

    Il punto è questo:

    Se stampo la query e o nel campo nome o nel campo cognome c'è un apostrofo questo viene fatto precedere da un carattarre di escape:

    Ipotizzando che io mi chiami Marco D'Ambrosi questo è ciò che viene stampato con echo

    INSERT INTO anagrafica (dbnome, dbcognome) VALUES ('Marco', 'D\'Ambrosi')
    P.S. Nel quote riportato qua sopra il backslash non si vede ma c'è

    al contrario se vado a vedere i dati effettivamente inseriti nel database trovo:

    Marco D'Ambrosi \\ senza il carattere di escape
    La domanda finale è: E' corretto tutto questo o sto sbagliando qualcosa ? Si puiò fare di meglio o sono sulla strada sbagliata ?


    Grazie a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    209
    se la tua domanda è "E' normale che un \' quotato si veda non quotato nel database" la risposta è sì.

    Per me non ci sono errori, potresti eventualmente considerare l'idea di trasformare il carattere ' nell'entità HTML ' tramite php prima di fare la query.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    7
    @ Walesio

    Per la prima risposta si ... sono due giorni che ho sto vuoto di memoria e paura di non comprendere bene quello che leggo.

    Per la seconda risposta ... intendi la funzione htmlentities ?

    qualcosa di simile a:

    Codice PHP:
    $data htmlentities(mysql_real_escape_string($data)); 

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    209
    beh, htmlentities codifica TUTTE le entità HTML, compresi i < e > e se devi memorizzare e in seguito stampare codice HTML, potrebbe causarti noie.

    Per codificare unicamente gli ' usa str_replace:
    Codice PHP:
    $data str_replace("'","&apos;",mysql_real_escape_string($data) ); 

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    7
    @ Walesio

    Si hai ragione ... farò così

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 © 2024 vBulletin Solutions, Inc. All rights reserved.