Ciao,
spero che questa sia la sezione giusta del forum, francamente non so dove sta l'errore, se nel PHP o nell'SQL quindi mi rimetto al vostro giudizio.
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.
La procedura di update potenzialmente incriminata.
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
spero che questa sia la sezione giusta del forum, francamente non so dove sta l'errore, se nel PHP o nell'SQL quindi mi rimetto al vostro giudizio.
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.
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_AUTOCOMMIT, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $dbh;
}
catch (PDOException $e) {echo 'Connection failed: ' . $e->getMessage();}
catch (Exception $e) {echo 'Generic error: ' . $e->getMessage();}
}
La procedura di update potenzialmente incriminata.
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', uniqid( mt_rand(1, mt_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', $password, PDO::PARAM_STR);
$sth->bindValue(':s', $salt, PDO::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!';
}
}
Non so che pesci prendere