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

    Urgente! mysql_real_escape_string con array ...?

    Ciao a tutti.
    Spero che qualcuno possa darmi una mano, perché tutto quello che ho trovato in rete non funziona...
    Dunque, sto creando una sezione riservata ai soci di un circolo sportivo, dove ognuno può, previo login, inserire una propria foto e alcune informazioni personali. Tra i campi da compilare, c'è quello "corsi" costituito da una select multipla dinamica che attinge i dati dalla tabella corsi nel database. Ipotizzando che tra i corsi ci sia anche "tiro con l'arco", mi ritroverei con un array che contiene anche apici e qui è il problema... non riesco ad inserire i dati nel database, a causa dell'apice.
    Ho provato con
    $sql = "UPDATE user_info SET .... corsi='". mysql_real_escape_string(implode(", ", $_POST['corsi'])) ."'.... WHERE username = '".$_SESSION['user_logged']."'";

    ma non funziona.

    Ho visto che esiste la funzione magic_quotes_gpc, ma risulta deprecata.

    Ho provato anche ad usare questa funzione trovata in un forum:

    function test_alter(&$item1) {
    $item1 = mysql_escape_string($item1);
    }
    array_walk($var, 'test_alter');
    $var = implode("','", $var);

    sostituiendo a $var il mio $_POST['corsi'].... ma non funziona.


    Infine ho trovato questa funzione:

    function slashes( $var )
    {
    if( is_array( $var ) )
    {
    return array_map( 'slashes', $var );
    }
    else
    {
    return mysql_real_escape_string( $var );
    }
    }


    niente da fare... forse non ho capito come usarla.


    C'è qualche anima buona che può darmi una mano?

    Grazie!

  2. #2
    Che cosa restituisce questo codice?

    Codice PHP:
    var_dump($_POST['corsi']); 

  3. #3
    Grazie per la risposta.

    var_dump mi restituisce questo, "tiro con l'arco" risulta troncato all'apice.

    array(3) { [0]=> string(5) "Tennis" [1]=> string(9) "Nuoto" [2]=> string(10) "Tiro con l" }

    Questo ovviamente, se inserisco l'array solo con implode(", ", $_POST['corsi']).


    Se invece uso questa funzione:

    function test_alter($item1) {
    $item1 = mysql_escape_string($item1);
    }
    array_walk($_POST['corsi'], 'test_alter');
    $_POST['corsi'] = implode("','", $_POST['corsi']);


    e poi inserisco i dati così:

    $sql = "UPDATE user_info SET .... corsi='". $_POST['corsi'] ."' .....

    mi restituisce errore mysql...


    Quale soluzione?

  4. #4
    Per quanto riguarda array_walk(), l'errore è la mancanza del passaggio per riferimento dell'elemento dell'array (vedi http://www.php.net/array_walk).

    Da come hai strutturato la tua tabella, dovrebbe bastarti un codice come questo:

    Codice PHP:
    $_POST['corsi'] = isset($_POST['corsi']) ? $_POST['corsi'] : array();
    $_POST['corsi'] = is_array($_POST['corsi']) ? $_POST['corsi'] : array($_POST['corsi']);
    $corsi implode(', '$_POST['corsi']);
    $corsi mysql_real_escape_string($corsi);
    $sql "UPDATE user_info SET .... corsi='{$corsi}' ...."
    In ogni caso, la scelta di inserire in un campo dei valori multipli viola le regole di normalizzazione. Dovresti valutare la possibilità di creare una relazione molti a molti.

  5. #5
    Ho provato la tua soluzione, ma il risultato è uguale a prima...

    array(2) { ... [1]=> string(10) "Tiro con l" }

    Probabilmente opterò per la soluzione molti a molti, ma mi resta la curiosità di sapere come risolvere questo problema.

    Faccio qualche altra prova con array_walk, ma vorrei capire anche come funziona array_map, con qualche esempio se possibile.

    Grazie comunque.

  6. #6
    Originariamente inviato da bill_the_cat
    Ho provato la tua soluzione, ma il risultato è uguale a prima...

    array(2) { ... [1]=> string(10) "Tiro con l" }
    Sei sicuro di aver implementato correttamente l'esempio che ho postato?

    $corsi dovrebbe contenere una stringa, non un array...

  7. #7
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Puoi anche usare addslashes( $str ) nel caso.

    Ricordati epro' di controllare sempre le gpc_magig_quotes perche' se sono abilitate e usi o mysql_real_escape oppure la addslashes ti torverai una stringa con i caratteri di escape duplicati il che potrebbe portarti al problema orignario ' == \\' che da errore.

    EDIT :
    Scusa ho postato prima di finire.

    controlla sempre le magic quotes cosi'

    Codice PHP:

    $str 
    ="  ciao a todos ";

    if( 
    get_magic_quotes_gpc() )
    {
        
    $str addslashes($str);
        
    // oppure
        
    $str mysql_real_escape($str );

    cosi' eviti che una eventuale stringa gia' controllata venga passata nuovamente ad una funziona di escaping.

    es :

    str = halo'
    arriva da una form

    gpc_quotes attivato

    $_POST[STR] => halo\';
    se la passi a una delle due funzioni sopracitate avrai
    $str => halo\\'

    quando poi la mette in query la query fallisce perche' \\ lo vede come \ e poi legge il carattere seguente che è ' e chiude la stringa anche se nn dovrebbe.

    Fai attenzione.

  8. #8
    Originariamente inviato da Virus_101
    Puoi anche usare addslashes( $str ) nel caso.
    Soluzione meno affidabile, sopratutto quando si tratta con encoding myltibyte.

    Originariamente inviato da Virus_101
    Ricordati epro' di controllare sempre le gpc_magig_quotes perche' se sono abilitate e usi o mysql_real_escape oppure la addslashes ti torverai una stringa con i caratteri di escape duplicati il che potrebbe portarti al problema orignario ' == \\' che da errore.
    No, al massimo lo porta ad un'altro problema (duplicazione degli slashes), ma NON al problema originario (apici non protetti).

  9. #9
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Beh si la duplicazione degli slashes porta al problema originario che e' sempre la presenza di apici che chiudono le stringhe. infatti \\' e' letto come \+' e l'apice chiude la stringa. E se va dentro una sql io potrei fare ' UNION ....... etc il che nn e' bene.

    Vero che addlsashe e' meno affidabile.

    Io uso sempre mysql_real ...

  10. #10
    Originariamente inviato da filippo.toso
    Sei sicuro di aver implementato correttamente l'esempio che ho postato?

    $corsi dovrebbe contenere una stringa, non un array...

    Hai ragione, contiene una stinga. Avevo lasciato impostato var_dump($_POST['corsi']);
    Ora l'ho stituita con

    echo $corsi;

    e purtroppo mi restituisce sempre la stringa troncata all'apice: Tennis, Tiro con l

    Non capisco perché, visto che il tuo script mi sembra esatto e dovrebbe funzionare bene...
    E anche con addslashes è uguale.

    Uff...

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.