Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-07-2008, 11:40   #1
Swalke
Member
 
L'Avatar di Swalke
 
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.
Swalke è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2008, 14:06   #2
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da Swalke Guarda i messaggi
Ciao a tutti.
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?
Non capisco cosa intendi fare... cioè... su 100 righe, se alla 50° c'è un errore (anche mysql) vuoi che tutte le 49 righe precedenti (comprese operazioni mysql) vengano annullate?
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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 05-07-2008 alle 17:46. Motivo: aggiunta
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2008, 18:34   #3
kk3z
Senior Member
 
L'Avatar di kk3z
 
Iscritto dal: Nov 2003
Messaggi: 980
prova con set_error_handler
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2008, 18:37   #4
Leo_SR
Member
 
L'Avatar di Leo_SR
 
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 */ }
Se vuoi evitare di "contornare" il codice di if-else puoi creare una classe wrapper che ti gestisca la connessione al DB.

Spero di essere stato chiaro ed utile
__________________
Ho concluso felicemente con: mrcypress, gabrieca, predator87, seb87, Arguggi

Ultima modifica di Leo_SR : 05-07-2008 alle 18:42.
Leo_SR è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2008, 18:44   #5
demos88
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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2008, 23:44   #6
Swalke
Member
 
L'Avatar di Swalke
 
Iscritto dal: Dec 2004
Messaggi: 131
Innanzitutto grazie per le risposte, cercherò di spiegare meglio il mio problema rispondendo a ognuno di voi:

Quote:
Non capisco cosa intendi fare... cioè... su 100 righe, se alla 50° c'è un errore (anche mysql) vuoi che tutte le 49 righe precedenti (comprese operazioni mysql) vengano annullate?
Assolutamente no. L'unica cosa che mi serve annullare sono le modifiche al db eseguendo un rolback. Certo è che il mio rolback deve essere invocato quando una delle 100 righe causa un errore. Quindi appunto mi chiedevo: devo fare un "if else" su ognuna delle 100 istruzioni per vedere se causa un errore?
Esempio (in pseudocodice):
Codice:
if(n!=0)
{
    x=y/n;
}
else
{
    rolback;
    redirect;
}
...mi sembra assurdo dovere fare sta cosa su ogni istruzione che può causare eccezione. In JAVA è molto più semplice basta fare:
Codice:
try {
   tutte le 100 istruzioni
}
catch {
   rollback;
   redirect;
}
...su come fare gestire il commit e rollback siamo d'accordo invece ma non era quello il mio problema

Quote:
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à.
Hai ragione infatti. Quello che faccio io è controllare semplicemente se restituisce errore. Se lo fa rolbacko e redirigo (non serve neanche fare il try catch). Però vedi dobbiamo sempre usare un if else per ogni istruzione SQL per verificare se ritorna degli errori. E similmnete dovremmo fare anche per le altre 100 istruzioni di cui sopra?
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:
Se vuoi evitare di "contornare" il codice di if-else puoi creare una classe wrapper che ti gestisca la connessione al DB.
Ma così risolverei la questione solo relativamente alla connessione al db no?

Quote:
prova con set_error_handler
Ho dato un occhiata. se ho capito bene dovrei comunque fare un if else su ogni istruzione per capire se devo lanciare l'error hendler no?

Quote:
...si effettivamente con le eccezioni ci si infogna parecchio
Anche perchè come dicevi giustamente tu le funzioni mysql non lanciano eccezioni ma ritornano solo errori testuali.

Insomma non c'è un modo per eseguire solo una volta il controllo solo alla fine?

Codice:
...
100 istruzioni + istruzioni sql
...
if(siSonoVerificatiErrori)
{
   rollback;
   redirect;
}
Così avremmo una soluzione molto più efficiente e simile all'esempio java. E eviteremmo di fare un mare di if else che rilevano i singoli errori.
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.
Swalke è offline   Rispondi citando il messaggio o parte di esso
Old 06-07-2008, 09:54   #7
Leo_SR
Member
 
L'Avatar di Leo_SR
 
Iscritto dal: Dec 2005
Città: Siracusa / Pisa
Messaggi: 194
Quote:
Originariamente inviato da Swalke Guarda i messaggi
Ma così risolverei la questione solo relativamente alla connessione al db no?
No, per connessione intendevo qualsiasi interazione con il DB una cosa del genere:
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;
   }

//...
}
In modo da controllare il DB con una classe.
__________________
Ho concluso felicemente con: mrcypress, gabrieca, predator87, seb87, Arguggi
Leo_SR è offline   Rispondi citando il messaggio o parte di esso
Old 06-07-2008, 10:34   #8
Swalke
Member
 
L'Avatar di Swalke
 
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.
Swalke è offline   Rispondi citando il messaggio o parte di esso
Old 06-07-2008, 10:55   #9
Leo_SR
Member
 
L'Avatar di Leo_SR
 
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();
}
Ovviamente i metodi me li sono invetati, ma dovrebbero essere più o meno quelli
__________________
Ho concluso felicemente con: mrcypress, gabrieca, predator87, seb87, Arguggi
Leo_SR è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2008, 16:45   #10
Hiskrtapps
Senior Member
 
L'Avatar di Hiskrtapps
 
Iscritto dal: Nov 2000
Città: Bussero (MI)
Messaggi: 1263
Quote:
Originariamente inviato da kk3z Guarda i messaggi
la soluzione è esattamente questa che ti è stata data.
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
Hiskrtapps è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2008, 17:28   #11
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Hiskrtapps Guarda i messaggi
la soluzione è esattamente questa che ti è stata data.
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
Confermo, l'error_handler è quello che fa per te.

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.
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2008, 12:50   #12
Swalke
Member
 
L'Avatar di Swalke
 
Iscritto dal: Dec 2004
Messaggi: 131
ok ragazzi ho capito.

Vi ringrazio infinitamente dell'aiuto e mi metto all'opera!
Swalke è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2008, 09:25   #13
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da Swalke Guarda i messaggi
ok ragazzi ho capito.

Vi ringrazio infinitamente dell'aiuto e mi metto all'opera!
Magari quando hai finito posta il risultato... così il 3d è completo e si può chiudere.

Ciauuuuu
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2008, 18:50   #14
Swalke
Member
 
L'Avatar di Swalke
 
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:
<?php

// ridefinisce la costante dell'errore utente - solo PHP 4
define (FATAL,E_USER_ERROR);
define (ERROR,E_USER_WARNING);
define (WARNING,E_USER_NOTICE);

// configura il livello di restituzione errore per questo script
error_reporting (FATAL | ERROR | WARNING);

// funzione di gestione dell'errore
function myErrorHandler ($errno, $errstr, $errfile, $errline) {
switch ($errno) {
case FATAL:
echo "<b>FATAL</b> [$errno] $errstr<br>\n";
echo " Fatal error in line ".$errline." of file ".$errfile;
echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>\n";
echo "Aborting...<br>\n";
exit 1;
break;
case ERROR:
echo "<b>ERROR</b> [$errno] $errstr<br>\n";
break;
case WARNING:
echo "<b>WARNING</b> [$errno] $errstr<br>\n";
break;
default:
echo "Unkown error type: [$errno] $errstr<br>\n";
break;
}
}

// funzione di prova del gestore di errore
function scale_by_log ($vect, $scale) {
if ( !is_numeric($scale) || $scale <= 0 )
trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale",
FATAL);
if (!is_array($vect)) {
trigger_error("Incorrect input vector, array of values expected", ERROR);
return null;
}
for ($i=0; $i<count($vect); $i++) {
if (!is_numeric($vect[$i]))
trigger_error("Value at position $i is not a number, using 0 (zero)",
WARNING);
$temp[$i] = log($scale) * $vect[$i];
}
return $temp;
}

// configura il gestore dell'errore definito dall'utente
$old_error_handler = set_error_handler("myErrorHandler");

// attiva alcuni errori, definendo prima un array misto con elementi non numerici
echo "vector a\n";
$a = array(2,3,"foo",5.5,43.3,21.11);
print_r($a);

// genera il secondo array, generando un avviso
echo "----\nvector b - a warning (b = log(PI) * a)\n";
$b = scale_by_log($a, M_PI);
print_r($b);

// questo è il problema, passiamo una stringa al posto di un array
echo "----\nvector c - an error\n";
$c = scale_by_log("not array",2.3);
var_dump($c);

// errore critico, il log di zero o di un numero negativo non è definito
echo "----\nvector d - fatal error\n";
$d = scale_by_log($a, -2.5);

?>
Trovate il codice e commenti vari all'argomento a questo indirizzo:
http://it2.php.net/set-error-handler
Swalke è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
La JAXA ha eseguito un test del prototip...
Netflix, ritorna la prova gratuita per i...
Il satellite LINK per salvare il telesco...
Il nuovo iPhone 18 Pro Max costerà...
Il tredicesimo volo del razzo spaziale S...
Pagare il parcheggio è sempre pi&...
Torvalds: 'Non sono più un progra...
Xiaomi lavora alla nuova Smart Band 11, ...
Inabissato in Grecia, iPhone 16 Pro sopr...
Volkswagen Zukunftsplan 2030: il nuovo p...
'Non ci interessano i segreti di Apple':...
Genitori troppo connessi: uno studio riv...
Motorola conferma l'arrivo del nuovo Edg...
Smascherata la truffa dei finti SSD da 1...
Xiaomi 18 Pro: chip a 2 nm, Privacy Disp...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:33.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v