Buonasera a tutti, il mio mini progetto va avanti e php mi appassiona sempre più, ma di tanto in tanto mi blocco per cavolate, e credo che questa volta sia una di quelle. In poche parole, ho la necessità di inserire dei dati su più tabelle Mysql, e tutto funziona perfettamente.
Ad un certo punto però mi è venuto il dubbio, ma se una delle 2 o più transazioni non va a buon fine, potrei trovarmi un Db "sporco" e sinceramente vorrei evitarlo, ma tutto ciò, vorrei farlo soprattutto per imparare (dato che il db sarebbe mio e pulito o sporco poco importa). Vi posto un po di codice per farvi capire cosa ho fatto:
Praticamente l'insert funziona, ma se cambio per esempio il nome ad un campo della query2 non accade nulla...cioè esegue la query 1 e non esegue la query2 senza darmi alcuna anomalia. Il Db è Mysql, e dovrebbe avere in automatico l'autocommit ma non si dovrebbe interrompere con beginTransaction? in sostanza le query vengono eseguite con l'execute fregandosene di tutto il resto...
Grazie a tutti per la pazienza
E
Ad un certo punto però mi è venuto il dubbio, ma se una delle 2 o più transazioni non va a buon fine, potrei trovarmi un Db "sporco" e sinceramente vorrei evitarlo, ma tutto ciò, vorrei farlo soprattutto per imparare (dato che il db sarebbe mio e pulito o sporco poco importa). Vi posto un po di codice per farvi capire cosa ho fatto:
PHP:
try {
$dbh->beginTransaction();
$sql="insert into allegati(id_pratica,rif_pratica,descrizione_all,nome_file,time_upload,creato_da,visibile)values(:id_pratica,:rif_pratica,:descrizione_all,:nome_file,:time_upload,:creato_da,:visibile)";
$query=$dbh->prepare($sql);
$query->bindParam(':id_pratica',$id,PDO::PARAM_STR);
$query->bindParam(':rif_pratica',$_POST['rif_pratica'],PDO::PARAM_STR);
$query->bindParam(':descrizione_all',$_POST['nome_allegato'],PDO::PARAM_STR);
$query->bindParam(':nome_file',$userfile_name,PDO::PARAM_STR);
$query->bindParam(':time_upload',$time_upload,PDO::PARAM_STR);
$query->bindParam(':creato_da',$creato_da,PDO::PARAM_STR);
$query->bindParam(':visibile',$visibile,PDO::PARAM_STR);
$sql2="insert into movimenti( id_pratica, cod_utente_movimento,creato_il, codcol_pratica, tipo_movimento)values(:id_pratica,:creato_da,:time_upload,:codcol_pratica,:tipo_movimento)";
$query2=$dbh->prepare($sql2);
$query2->bindParam(':id_pratica',$id,PDO::PARAM_STR);
$query2->bindParam(':creato_da',$creato_da,PDO::PARAM_STR);
$query2->bindParam(':time_upload',$time_upload,PDO::PARAM_STR);
$query2->bindParam(':codcol_pratica',$codice_coll,PDO::PARAM_STR);
$query2->bindParam(':tipo_movimento',$tipo_movimento,PDO::PARAM_STR);
$query->execute();
$query2->execute();
$dbh->commit();
if (is_dir($root_principale)) {
// Se la cartella esiste ci copio il File
move_uploaded_file($nome_file_tmp, $root_principale . $userfile_name);
echo '<script>alert("Allegato Salvato con Successo")</script>';
}else{
mkdir($root_principale);
move_uploaded_file($nome_file_tmp, $root_principale . $userfile_name);
echo '<script>alert("Allegato Salvato con Successo")</script>';
}
} catch (Exception $e) {
echo $e-> getMessage();
$dbh->rollback();
throw $e;
}
}
Praticamente l'insert funziona, ma se cambio per esempio il nome ad un campo della query2 non accade nulla...cioè esegue la query 1 e non esegue la query2 senza darmi alcuna anomalia. Il Db è Mysql, e dovrebbe avere in automatico l'autocommit ma non si dovrebbe interrompere con beginTransaction? in sostanza le query vengono eseguite con l'execute fregandosene di tutto il resto...
Grazie a tutti per la pazienza
E