prima di tutto lasciami ringraziare di tutto cuore Luigi777,
ho visto un suo post, di qualche mese fa, che conteneva una classe database
ho percepito che era una buona soluzione, l'ho "presa" e me la sono sistemata
inserendo un po' di idee
le istruzioni "require" importano le due classi nello script
le successive aprono i db e li rendono disponibili
pdo lo vedi all'interno della classe ma è un modo per connettersi al database,
nulla di particolare, nel mio file trovi
$dbPDO = 'sqlsrv'
da sostituire con mysql .... ma cerca il nome giusto, non ho mai utilizzato mysql
subito dopo la connessione al db trovi l'attivazione degli errori,
attivando in questo modo, tutti gli errori "gravi" vengono scritti nel log di php
errori non controllabili per esempio il nome di una tabella o di un campo sbagliati
io preferisco lasciarlo sempre attivo anche in "produzione"
trovi anche la gestione delle "transazioni" (non so se si può con mysql)
ma quando ho aggiornamenti su più tabelle che devono essere coerenti,
inizio una transazione che chiudo con il "commit" o con il "rollback"
la funzione "myLog" mi permette di disseminare log nelle applicazioni
e commento la riga con "error_log" in produzione.
la funzione "myErr" la utilizzo, per esempio, quando mi accorgo che qualche utilizzatore tenta di forzare
il normale funzionamento dell'applicazione, anche in questo caso registro il mio messaggio e chiudo
l'applicazione per l'utilizzatore
da ultimo la funzione che registra l'errore del db non correggibile.
hai già l'esempio delle select ma ti posto anche un breve esempio di un'update all'interno di una transazione
preferisco non inserire nella classe le funzioni come questa perchè specifiche dell'applicazione
e mi sembra meglio così ...
penso sia tutto facile da capire .... in ogni caso ... posta
ciao
Marino
questa è la classe, puoi cambiare nome per creare le altre 2 e null'altro (salvo parametri del db)
PHP:
<?php
error_reporting(E_ALL);
class solarpowerDB {
private $db;
public $OPtransaction = false;
function __construct(
$dbPDO = 'sqlsrv',
$dbHOST = '',
$dbUSER = '',
$dbPASS = '',
$dbNAME = ''){
try { $this->db = new PDO("$dbPDO:Server=$dbHOST;Database=$dbNAME", "$dbUSER", "$dbPASS"); }
catch (PDOException $e) { $this->handle_sql_errors("PDO : OPEN DB", $e); }
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->OPtransaction = false;
}
function __destruct() {
$this->close();
}
function Query_exec($sql){
$this->MyLog("SQL : $sql");
try { return $this->db->exec($sql); }
catch(PDOException $e){ $this->handle_sql_errors($sql, $e); }
}
function Query_select($sql){
$this->MyLog("SQL : $sql");
try { $sth = $this->db->prepare($sql); $sth->execute(); return $sth->fetchall(PDO::FETCH_NUM); }
catch(PDOException $e){ $this->handle_sql_errors($sql, $e); }
}
function begin_transaction(){
try { $this->db->beginTransaction(); }
catch(PDOException $e){ $this->handle_sql_errors($row, $e); }
$this->OPtransaction = true;
return true;
}
function commit_transaction(){
try { $this->db->commit(); }
catch(PDOException $e){ $this->handle_sql_errors($row, $e); }
$this->OPtransaction = false;
}
function rollback_transaction(){
try { $this->db->commit(); }
catch(PDOException $e){ $this->handle_sql_errors($row, $e); }
$this->OPtransaction = false;
}
function close(){
unset($this->db);
}
function MyLog($text) {
global $swN;
error_log("$swN $text", 0); // commentare se non si vuole il log
}
function MyErr($text) {
global $swN;
error_log("$swN $text", 0);
print "ERRORE INATTESO, contatta l'amministratore del sistema";
die;
}
function handle_sql_errors($sql, $e){
if ($this->OPtransaction) $this->db->rollBack();
error_log("SQL cmd : $sql", 0);
error_log("error code : ". $e->getCode(), 0);
error_log("error info : ". $e->getMessage(), 0);
print "ERRORE INATTESO, contatta l'amministratore del sistema";
die;
} }
questo è l'esempio
PHP:
function update_DB() {
global $db,$swN;
$db->MyLog("function update_DB");
$OPdbresult = $db->begin_transaction();
if ($OPdbresult) {
$sql = "update .... set";
$sql.= " .....=.....";
$sql.= " .....=.....";
$sql.= " where ....=....";
$sql.= " and .....=......";
$OPdbresult = $db->Query_exec($sql);
if ($OPdbresult)
$OPdbresult = update_formule_DB();
if ($OPdbresult) $db->commit_transaction();
else $db->rollback_transaction();
}
return $OPdbresult;
}
ps. utilizzo la fetch con NUM, sostituiscila con ASSOC se ti va meglio