|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Dec 2004
Messaggi: 131
|
[PHP] identificare errori
Ciao a tutti.
Come si può fare per identificare un errore (di qualsiasi tipo esso sia) in PHP? Mi spiego meglio con un esempio: Ho una pagina PHP che: - esegue una connessione al db, - esegue delle query di selezione, - esegue delle operazioni sui dati - esegue una serie di insert e update Ad eseguire un rollback non ci vuole nulla ma come si fa ad identificare quando farlo? Dovrei fare il rollback ogni volta che va storto qualcosa in una query ma anche se si verifica un qualsiasi errore durante la "manipolazione dei dati". Spero io non debba "contornare" ogni mia singola operazione con un if-else per vedere se è andata a buon fine! ![]() In java basta racchiudere tutto in un try catch ed eseguire il rollback nel blocco catch. Anche in PHP 5 ho visto si possono usare i blocchi try catch ma non fanno al caso mio (ho provato a mettere tutto il codice in un try e a mettere dei parametri sbagliati nella connessione al db)... ...il blocco catch non è mai stato eseguito, ho avuto una serie di Notice e fatal error come se il mio try catch non esistesse. Qualcuno mi sa aiutare? Ultima modifica di Swalke : 13-07-2008 alle 12:54. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Il costrutto try catch non mi risulta faccia nessun rollback su operazioni php eseguite... te la puoi cavare con il mysql, ma allora devi usare costrutti propri del mysql e non il php. Mia idea: -All'inizio della pagina esegui la connessione al db e la query "START TRANSACTION;" -poi esegui tutte le modifiche che vuoi racchiuse in un try -nella clausola catch inserisci l'istruzione per eseguire la query "ROLLBACK;" e exit(); per bloccare lo script -alla fine di tutto (dopo il catch) esegui la query "COMMIT;". in pratica START TRANSACTION fa partire una transazione del database e tutte le operazioni sul db da quel momento in poi saranno depositate in una tabella a parte. Quando esegui la query "COMMIT" le operazioni verranno scritte e rese definitive, se invece esegui la query "ROLLBACK" esse verranno scartate e il db non avrà subito nessuna modifica. Prova così... rimembranze di database di un annetto fa asd edit della sera (importante): vagamente mi ricordavo che fosse così, poi ho cercato e ne ho avuto conferma: funzioni delle libreria mysql e mysqli NON lanciano eccezioni ma solo errori testuali. Ad ogni istruzione di query o connessione dovresti controllare che la funzione sia andata a buon fine e se non lo fosse, lanciare una eccezione che faccia partire il blocco catch e quindi il rollback. Ovviamente, se è fallita la connessione, anche la query di rollback fallirà.
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 05-07-2008 alle 17:46. Motivo: aggiunta |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
prova con set_error_handler
|
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Dec 2005
Città: Siracusa / Pisa
Messaggi: 194
|
In un caso "classico" (usando le funzioni mysql_connect() e mysql_query() e compagnia) ogni funzione restituisce un risultato che, nel caso qualcosa non sia andato come doveva, sarà uguale a false.
Quindi per esempio: Codice:
$connection = mysql_connect( /* parametri connessione */); if(!$connection) { /* Codice di gestione dell'errore */ } Spero di essere stato chiaro ed utile ![]() Ultima modifica di Leo_SR : 05-07-2008 alle 18:42. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
asd si effettivamente con le eccezioni ci si infogna parecchio... ci sono sicuramente vie più semplici.
prima prova queste altre soluzioni proposte
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
![]() |
![]() |
![]() |
#6 | |||||
Member
Iscritto dal: Dec 2004
Messaggi: 131
|
Innanzitutto grazie per le risposte, cercherò di spiegare meglio il mio problema rispondendo a ognuno di voi:
Quote:
Esempio (in pseudocodice): Codice:
if(n!=0) { x=y/n; } else { rolback; redirect; } Codice:
try { tutte le 100 istruzioni } catch { rollback; redirect; } Quote:
Non c'è un modo per vedere se durante tutta l'esecuzione ci son stati errori? In modo che solo alla fine posso fare un controllo e fare il mio eventuale rollback? Quote:
Quote:
Quote:
Insomma non c'è un modo per eseguire solo una volta il controllo solo alla fine? Codice:
... 100 istruzioni + istruzioni sql ... if(siSonoVerificatiErrori) { rollback; redirect; } Tutto sta nel capire come si può ottenere quel "siSonoVerificatiErrori". Dopotutto PHP da qualche parte li memorizzerà quegli errori (notice, warning, error, ecc...) che stampa quando qualcosa va male no? Spero di essere riuscito a darvi informazioni e mi scuso per la lunghezza del post. Ultima modifica di Swalke : 13-07-2008 alle 12:57. |
|||||
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Dec 2005
Città: Siracusa / Pisa
Messaggi: 194
|
Quote:
Codice:
class MySQL { private $connection; public function __construct() {/* Costruttore */} public function connect() { $this->connection = @mysql_connection(/* Dati connessione */); if(!$this->connection) { throw new Exception(mysql_error()); } } public function query($sql) { $q = mysql_query(); if(!$q) { throw new Exception(mysql_error()); } else return $q; } //... } |
|
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Dec 2004
Messaggi: 131
|
Si scusa, però ancora stai contornando ogni operazione con una istruzione di if else che controlla se è il caso o meno di lanciare un'eccezione.
...io dovrei fare quell oche dici tu, più una serie di if else analoghi per ogni istruzione che opera sui dati estratti. Quello che volevo io era appunto un modo per fare solo un controllo alla fine e rollbackare se era il caso. A me non interessa quale errore è avvenuto. Mi interessa solo sapere se è avvenuto. In java chiudendo tutte le istruzioni in un blocco try, qualsiasi eccezione si verifichi (senza che debba essere tu a eseguire un throw) viene eseguito il blocco catch (dove è posizionato il tuo rollback). Insomma in php sono costretto a fare 1000 if else per controllare se ogni singola cosa genera un errore? ...mi pare assurdo. ![]() Ultima modifica di Swalke : 13-07-2008 alle 12:59. |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Dec 2005
Città: Siracusa / Pisa
Messaggi: 194
|
Se hai una classe l'if-else lo fai solo dentro la classe. Per intenderci, dopo aver sviluppato (per bene...) quella classe, nel tuo codice avrai una cosa del tipo:
Codice:
try { $db = new MySQL(); $db->connect(/*blablabla*/); $db->begin(); $sql = "SELECT * FROM tabella WHERE condizione_astrusa"; $q = $db->query($sql); $res = $db->result($q); //... $sql = "INSERT INTO altra_tabella(id, nome, cognome) VALUES (null, 'Pippo', 'La Coca')"; $db->query($sql); //... $sql = "UPDATE ennesima_tabella SET campo = 10"; $db->query($sql); //... $db->commit(); } catch(Exception $ex) { //Rollback $db->rollback(); } |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Nov 2000
Città: Bussero (MI)
Messaggi: 1263
|
Quote:
non entry nel blocco catch perchè probabilmente è stato sollevato un errore e non un eccezione.. se vuoi gestire tutto con eccezioni devi farti un error handler che intercetta gli errori e lancia delle eccezioni e tutto funzionerà come sei abituato in java |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
![]() ![]() Puoi scegliere tu se far lanciare una eccezione oppure integrare direttamente nel codice della funzione handler il tuo rollback+redirect. Se fai lanciare un'eccezione allora devi mettere un try/catch alle istruzioni e, inserire il rollback nel catch.
__________________
|
|
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Dec 2004
Messaggi: 131
|
ok ragazzi ho capito.
Vi ringrazio infinitamente dell'aiuto e mi metto all'opera! |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
Ciauuuuu
__________________
|
|
![]() |
![]() |
![]() |
#14 | |
Member
Iscritto dal: Dec 2004
Messaggi: 131
|
In realtà postare il mio codice credo confonderebbe solo le idee perchè è suddiviso in più file e contiene anche cose che non centrano con l'argomento.
Fatto sta che quella che segue è la soluzione al problema ed è ciò su cui mi sono basato: Quote:
http://it2.php.net/set-error-handler |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:33.