• User

    errore return della funzione, dove sbaglio?

    Ciao a tutti, eccomi nuovamente qui con i miei esperimenti... stavo cercando di creare un standard di inserimento tramite form, per le poche cose che devo fare in php/mysql. Questa volta volevo creare una funzione che una volta passateli tutti i parametri mi eseguisse l'escape dell'input. E avevo pensato al seguente codice (il form è su un'altra pagina):
    [php]
    function controllo_inserimento(){
    global $conn;
    $vars_ins = func_get_args();
    $vars=array();

    foreach ($vars_ins as $var){
        $var_ctrl = trim($var);
        $var_ctrl = $conn->real_escape_string($var_ctrl);
        $vars[]=$var_ctrl;
    }
    return $vars;
    

    }

    controllo_inserimento($_POST['nome'],$_POST['cognome'],$_POST['sprnome'],$_POST['pw'],$_POST['mail']);

    echo $vars[0];
    [/php]il fatto che io voglia vedere il primo valore dell'array $vars è solo per provare se funziona, ma al posto di mostrarmi il nome inserito non mi mostra nulla. Il problema secondo me è nel return, visto che ho provato a verificare se fosse il foreach a non mettermi i valori nell'array, ma se all'interno della funzione metto dopo la graffa del foreach echo "$vars[0]<br/>$vars[1], ecc..." visualizzo tutto correttamente. Come mai, dove sbaglio? Confido nella vostra soluzione 🙂 e per adesso vi saluto, ciao ciao


  • ModSenior

    Ciao gigi-bg,

    dovresti fare cosi:
    [php]
    function controllo_inserimento(){
    global $conn;
    $vars_ins = func_get_args();
    $vars=array();

    foreach ($vars_ins as $var){
        $var_ctrl = trim($var);
        $var_ctrl = $conn->real_escape_string($var_ctrl);
        $vars[]=$var_ctrl;
    }
    return $vars;
    

    }

    $vars = controllo_inserimento($_POST['nome'],$_POST['cognome'],$_POST['sprnome'],$_POST['pw'],$_POST['mail']);

    echo $vars[0];
    [/php]


  • User

    Grazie, avevi ragione... mi puoi spiegare perchè però prima non funzionava? alla fine se doveva restituirmi l'array $vars fuori dalla funzione, come mai non lo vedeva?Come funziona returnallora? Scusa se approfitto ma spero di capirne la logica applicandola nel modo migliore la prossima volta 🙂 Grazie ancora ciao ciao


  • Super User

    Il return di prima funzionava... Solo che tu non hai assegnato ad alcuna variabile il valore di ritorno di quella funzione... riguarda il tuo codice:

    [PHP]
    function controllo_inserimento(){
    // etc...
    return $vars;
    }

    // QUI CHIAMI LA FUNZIONE
    controllo_inserimento($_POST['nome'],$_POST['cognome'],$_POST['sprnome'],$_POST['pw'],$_POST['mail']);

    // VARS?
    echo $vars[0];
    [/PHP]

    La variabile $vars non è mai stata inizializzata, probabilmente il tuo server ha error_reporting settato a E_WARNING, perchè avresti sicuramente ricevuto un notice per questo errore.

    Ora.. tu nell'echo provi a stampare una variabile che in realtà non esiste, per questo non ti mostra niente: il return ritorna sempre un certo valore, e tu per memorizzarlo da qualche parte devi fare così:

    [PHP]
    $mio_risultato = funzione();
    [/PHP]

    Altrimenti l'eventuale risultato va sprecato.

    Avresti potuto modificare direttamente la variabile globale vars settandola all'interno della funzione, con un codice come questo:

    [PHP]
    $GLOBALS['vars'] = $vars;
    [/PHP]

    Ed allora la variabile $vars l'avresti inizializzata direttamente all'interno della funzione, tuttavia ciò non è consigliato, perchè se non fai attenzione potresti modificare il valore di una variabile che in realtà ti serviva...

    Scusa se ti ho allungato un pò il brodo, siccome avevi detto di volerne capire di più, ho cercato di spaziare un pò a tutte le alternative 🙂


  • User

    Scusa se hai allungato il brodo?! Grazie!! 🙂 In effetti ora ho decisamente più chiara la situazione e come al solito con il senno di poi è più facile dire: "ah già è vero!" Comunque mille grazie, non sbaglierò più un return 😄 Anzi approfitto della tua/vostra disponibilità per avere un'ulteriore dritta... con questa $vars che giustamente è un array vorrei riassegnare in automatico dei nuovi nomi alle variabili dei valori (per intenderci non più $vars[0] = "Giacomo" ma che fosse $nome = "Giacomo") e avevo pensato ad un array_combine ma ho capito che non poteva essere quello perchè comunque avrei ancora un array, solo con le chiavi associate correttamente... come posso ottenerlo secondo voi? Scusate se approfitto, in caso non abbiate tempo non preoccupatevi, proverò a postarla come nuova discussione, sempre che non riesca a risolverla io 🙂 ma ne dubito XD


  • Super User

    Ma figurati 🙂

    Se ho ben capito, tu vorresti partire da un array così:

    [PHP]
    array(
    0 -> 'Giacomo',
    1 -> 'Falsaperla',
    2 -> 0951537492
    );
    [/PHP]

    Per giungere ad una cosa come questa:
    [PHP]
    $nome = "Giacomo";
    $cognome = "Falsaperla";
    $telefono = "095... etc";
    [/PHP]

    Se è così, esiste un costrutto che ti può tornare utile, ovvero LIST, che si usa in questo modo:

    [PHP]
    $info = array('coffee', 'brown', 'caffeine');

    // Listing all the variables
    list($drink, $color, $power) = $info;
    echo "$drink is $color and $power makes it special.\n";
    [/PHP]

    Ho usato appositamente l'esempio che puoi trovare sul sito officiale di PHP ( php.net/manual/en/function.list.php ).

    In pratica assegna alle tre variabili che tu specifichi all'interno del list(), i valori dell'array che metti dopo l'uguale, in ordine crescente rispetto all'ordine dell'array. Nel tuo caso:
    [PHP]
    list($nome, $cognome, $telefono) = controllo_inserimento( /*bla bla bla */ );
    [/PHP]


  • User

    Scusa per il ritardo nella risposta ed effettivamente devo ringraziarti nuovamente perchè era proprio quello che volevo ottenere... E ora via verso nuovi insormontabili (per me :D) quesiti in php... Grazie a ancora ciao