Visualizzazione dei risultati da 1 a 8 su 8

Discussione: L'update non avviene

  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606

    L'update non avviene

    Ciao,
    spero che questa sia la sezione giusta del forum, francamente non so dove sta l'errore, se nel PHP o nell'SQL.
    Il fatto è che non c'è un vero errore, se ci fosse lo saprei e l'avrei già corretto, ma apparentemente non c'è nessun errore se non nel fatto che l'update non avviene.
    Sto scrivendo una procedura per l'update di una password in un CMS che sto costruendo per un cliente ma l'update proprio non va. Funziona benissimo l'insert, le select di ogni rodine e grado ma non l'update.
    Ovviamente ho già controllato che l'utente che lo usa abbia i privilegi giusti e li ha :fonzie:


    dunque un po' di codice:
    Procedura di connessione si trova in un file separato che viene incluso al momento di usare il database.
    Codice PHP:
    function connetti($user '') {  $dsn 'mysql:dbname=dominio_XYZ;host=localhost;charset=UTF8';  $user 'dominio_' $user;  try {  $dbh = new PDO($dsn$user'password');            $dbh->setAttribute(PDO::ATTR_AUTOCOMMITfalse);            $dbh->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);            $dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERYtrue);            $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARESfalse);            return $dbh;  }  catch (PDOException $e) {echo 'Connection failed: ' $e->getMessage();}  catch (Exception $e) {echo 'Generic error: ' $e->getMessage();}} 

    La procedura di update potenzialmente incriminata.
    Codice PHP:
    //    Verifico che i dati siano pieni e non ci siano variabili vuote.
    if (array_walk($input, function($v$k){                
      if (
    $v == '' || is_null($v)) return false; else true;
    },  
    ARRAY_FILTER_USE_BOTH) === true) {
                
    //    Nessun errore procedo con la verifica dei dati.                        
              /*
                *    Verifico che le due nuove password siano uguali.
                */
    if ($input['password'][1] == $input['password'][2]) {
                    try {
                        
    $dbh connetti();    //    mi connetto come utente per la verifica dei dati.
                       
    $querySQL 'SELECT password, salt, bannato FROM utente WHERE id_utente=:id LIMIT 1;';
                        
    $sth $dbh->prepare($querySQL);
                        
    $sth->bindValue(':id'$input['id'], PDO::PARAM_INT);
                        if (!
    $sth->execute()) {
                            unset(
    $dbh$querySQL);
                            
    $errore $sth->errorInfo();
                        } else {
                            
    //    Nessun errore proseguo...
                            
    $sth->setFetchMode(PDO::FETCH_ASSOC);
                            
    $utente $sth->fetch();    //    utente contiene i dati dal database.
                            /*
                                *    Prima di continuare verifico che:
                            *    1 - l'utente non sia bannato
                            *    2 - che la vecchia password sia corretta
                            */
                            
    if (($utente['bannato'] > 0) && ($utente['password'] == hash('sha512',"{$input['password'][0]}{$utente['salt']}"))) {
                                unset(
    $dbh$sth);    //    Mi disconnetto...
                                
    $dbh connetti('admin');    //    Mi riconnetto come "amministratore".
                                
    $querySQL 'UPDATE utente SET password = :p, salt = :s WHERE id_utente = :id;';
                                
    $sth $dbh->prepare($querySQL);
                                
    $sth->bindValue(':id'$input['id'], PDO::PARAM_INT);
                                
    $salt hash'sha512'uniqidmt_rand(1mt_getrandmax() ), true ) );    //    Nuovo SALT                            $password = hash( 'sha512', $input['password'][2].$salt );    //    Nuova password ( uso la seconda nuova password, comunque sono verificate entrambe come identiche ).
                                
    $sth->bindValue(':p'$passwordPDO::PARAM_STR);
                                
    $sth->bindValue(':s'$saltPDO::PARAM_STR);
                                if (!
    $sth->execute()) {
                                    unset(
    $sth$dbh$input$utente);
                                    
    $errore $sth->errorInfo();
                                } else {
                                    
    //    se non ci sono stati errori... fatto!
                                    
    unset($sth$dbh$input$utente);
                                    
    //include_once '../bin/logout.php';    //    Mi diconnetto, così l'utente deve per forza riconnettersi usando la nuova password.
                                    
    $errore 'Perfetto! Password cambiata.';
                                }
                            }
                        }
                    }
                    catch (
    PDOException $e) {echo $e->getMessage();}
                    catch (
    Exception $e) {echo $e->getMessage();}
                } else {
                    
    //    Ecco!
                    
    $errore 'Spiacente, ma le due nuove password non coincidono!';
                }

    La procedura è complicata dal fatto che i dati sono cifrati varie volte e confrontati tra loro ma alla fine non cambia la sostanza, anche perché in locale ho messo diversi break point e tutti danno esisto negativo, alla fine della procedura arriva sempre il messaggio "Perfetto! Password cambiata." ma in realtà controllando con phpMyAdmin vedo che non cambia affatto nulla.
    Non so che pesci prendere
    Ultima modifica di Marcolino's; 03-11-2014 a 14:39 Motivo: Per un refuso la formattazione non c'era, ora dovrebbe essere a posto.

  2. #2
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    a me pare corretto, anche se complicato
    hai provato a fare una sorta di log casereccio mettendo un po' di echo nelle varie fasi per vedere che i dati che passi siano corretti?
    altra cosa: la funzione connetti() ti istanzia correntamente PDO?

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Se leggi bene ciò che ho scritto capisci che quelle prove le ho già fatte ( i break point ) e sì ovvio il PDO è corettamente instanziato, anche perché se no avrei un problema con la prima istruzione, cioè prepare().
    No se avessi un errore griderei Eureka! ma purtroppo non ci sono errori e quindi non so che pesci prendere, perché non ho feddback, proprio non capisco dov'è il problema.
    Ah non è solo qui il problema, ma ovunque utlizzi update nel CMS, è come se fosse un comando ignorato.

  4. #4
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    e allora controlla i permessi dei tuoi utenti del DB (e prova a fare le query di update direttamente sul server mysql)

    comunque, quello che intendevo dirti, sebbene tu ipotizzi che io non abbia letto il tuo post, era di stamparti a schermo query e parametri, per verificare a vista che tutto fosse a posto

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    @marcolino's. Poco tempo fa hai aperto un thread sull'insert. Avevi risolto e scritto :

    Ma, prova e riprova, leggi di qua, canta di la sono riuscito a capire, infatti er comunque colpa del file che contiene la procedura di connessione!
    Infatti c'era questa: $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, false); l'ho messa a TRUE e tutto ha rifunzionato... stasera si festeggia!
    E pero' nel codice che posti c'è $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, false); l
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  6. #6
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Quote Originariamente inviata da badaze Visualizza il messaggio
    @marcolino's. Poco tempo fa hai aperto un thread sull'insert. Avevi risolto e scritto :



    E pero' nel codice che posti c'è $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, false); l
    Infatti era quello il motivo, ora va, ma l'avevo messo a false perché se no non mi faceva l'insert con la clausola insert into ... ON DUPLICATE KEY...

  7. #7
    il problema è che se metti autocommit a false poi devi invocare a mano il commit dell'operazione... commit che ovviamente può dare errore e che andrebbe gestito (vedi discorso di inserire chiavi duplicate)....ah si, normalmente bisognerebbe evitare di provare ad inserire chiavi duplicate
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    Quote Originariamente inviata da badaze Visualizza il messaggio
    @marcolino's. Poco tempo fa hai aperto un thread sull'insert. Avevi risolto e scritto :



    E pero' nel codice che posti c'è $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, false); l
    Errare humanum est, perseverare autem diabolicum!

    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

Tag per questa discussione

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.