Newsgroup: it.comp.www.php
Titolo: aggiungere funzioni prima di "or die()"

Salve,
avete presente la stringa di chiamata a query che notoriamente usiamo?
$result=mysql_query($query) or die ("Problema query");
bene, io vorrei fare qualche cosa in più oltre al "die()", cioé vorrei che 
prima di fare die e stampare a schermo chiamasse un'altra funzione (mi serve 
per fare debug), ma non so né se é possibile farlo e né come farlo...
forse qualcosa del tipo:
$result=mysql_query($query) or (miafunzione() and die ("Problema query"));
E' solo un'ipotesi la mia.
Grazie per eventuali aiuti
Mark 


Non credo che così funzioni.
Prova cosi:
mysql_query($query) or (miafunzione());
function miafunzione()
{
quello che ti serve.
die();
}
Cordialmente.
Melus.
Il mio e-mail non ha i simboli di zorro.

Mon, 15 Nov 2004 11:15:28 +0100, "Mark Renton" <miaemail@b.c> ha
detto:

Esempio molto semplice:
function show_db_errors_die ($query)
{
	echo "<p>Si è verificato un errore o un malfunzionamento nel
database. Si prega di segnalare questi dati al webmaster.</p>";
	echo "<p>File: ".$_SERVER['PHP_SELF']."<br />";
	echo "Query: ".$query."<br />";
	echo "Errore database: ".mysql_error()."<br />";
	echo "Codice Errore database: ".mysql_errno()."<br /></p>";
	die();
}
$result=mysql_query($query) or show_db_errors_die ($query);
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Project Admin di "PHP Reservation - Online booking system" - 
http://phpreservation.sourceforge.net
Dev.Staff di E-Xoopport - 
http://dev.e-xoopport.it

 }
Grazie, non ci avevo pensato... in effetti é semplice e pulito.
Mi rimane sempre il dubbio su come funzioni quell' "or" tra le due funzioni, 
credo che non funzioni come l'or in una istanza if o in una query, giusto? 

 $result=mysql_query($query) or show_db_errors_die ($query);
Grazie, ho implementato gli stessi errori di database nella mia funzione per 
farmi mandare una email dal server remoto.

>

Ok, il mio era un esempio da utilizzare per debug in fase di
progettazione.
Ciao


 sintatticamente e semanticamente cosa significano.
scusa ma non ho capito cosa intendi dire, potresti spiegarmi cosa intendi
per "funzione per 'side effect', non per specifica" ?
TIA
-- 
artemis.alpeia
Si avvisano tutti i condomini degli interni pari che il frigorifero non
funziona

 per "funzione per 'side effect', non per specifica" ?
Intendevo funzionA, verbo funzionare, ho solo pigiato il tasto sbagliato. :)
Intendo dire che:
mysql_query($sql) or die("errore")
NON SIGNIFICA ASSOLUTAMENTE:
fai la query, e se c'e' un errore esci.
E' solo che... DI GRAN CULO... il risultato è lo stesso.
Quella riga è un'espressione logica:
QUALCOSA or QUALCOS'ALTRO.
OR è un operatore logico che restituisce true se almeno un operando è 
true (se l'operando è una funzione, essa viene eseguita e viene preso 
come operando il valore restituito (non 'ritornato', termine che mi fa 
accapponare i testicoli).
Nel caso della riga in questione, i due operandi di OR sono i risultati 
delle due funzioni mysql_query() e die().
Quella riga valuta il risultato di mysql_query() e lo mette in OR con il 
risultato di die(), e NON FA NULLA del risultato.
Queste sono le CERTEZZE, il resto è culo.
Ora accade che, per come è implementato OR in php, gli operandi vengono 
valutati da sinistra a destra. Ora poichè una serie di operandi in OR 
vale false se e solo se TUTTI gli operandi sono false, accade che per 
efficienza il php valuti tutti gli operandi da sx a dx e si fermi appena 
ne trova uno che vale TRUE.
Quindi, die() non viene eseguita se mysql_query() restituisce true, ma 
attenzione:
Se il team di php si sveglia domani mattina e decide di valutare gli 
operandi da destra a sinistra (o anche di valutarli... tutti), accade 
che.... viene eseguita solo die() (o entrambe).
Nota che questo non "calpesterebbe" in alcun modo il significato di OR, 
che continuerebbe a fare esattamente ciò che DEVE fare, secondo le 
specifiche di OR. Sarebbe una modifica insensata, ma terribilmente LECITA.
Lo so che è pratica comune, io evito come la peste queste cose, se 
volete usatele, ma il mio consiglio è sempre quello di conoscere 
PERFETTAMENTE le porcate che si fanno. Sottolineo il PERFETTAMENTE :)


Cujo wrote:
Giň che ci sono:
IMHO piů pulito:
$result = mysql_query($sql);
if (!$result) {
	die("errore");
}
Poi se ne puň discutere. In genere uso le exceptions visto che php5 le 
implementa, ma potrebbero essere troppa cosa per un semplice script.


 che.... viene eseguita solo die() (o entrambe).
ok, allora avevo capito bene... in questo caso sarebbe piu' "robusto"
if (mysql_query($query) === FALSE)
{
 die(mysql_error());
}
eppure, sembra pratica diffusa (specie tra chi viene da js) usare costrutti
simili specie per le assegnazioni di variabili:
$a = $b || 3;
grazie per la spiegazione esauriente
-- 
artemis.alpeia
Eh si', mi consenta dottore, tempo fa non c'erano tutte queste ragazzine coi
tatuaggi

 grazie per la spiegazione esauriente
figurati!


 }
grazie, credo di aver capito anch'io. Infatti non mi era molto chiaro l'uso 
di or in quel costrutto! :)

 PERFETTAMENTE le porcate che si fanno. Sottolineo il PERFETTAMENTE :)
Nessuna porcata ... si puo` tranquillamente usare "or die()". Lo uso anche
io. Pure la maggior parte degli esempi nella stessa documentazione ufficiale
del PHP usa questo costrutto.
Certo, se un programmatore non sa cosa sono gli operatori, le precedenze
degli operatori, ecc..., c'e` sempre da qualche parte un bel lotto di terra
da zappare!
-- 
Andrea Binello
Software and Web Developer
http://www.andreabinello.com

die non e' la soluzione ottimale
e basta fare una verifica in base all'error number ( mysql_errno() ) che
ritorna mysql
se diverso da 0 ed in quel caso salvare l'errore in un file di log
o mandarlo in output con il proprio template oltre ad aggiungere varie altre
informazioni
come linea, file dell'errore e stringa SQL passata
function my_dbquery_error($arr_err,$sql_q, $Linen, $Nfile)
{
 if($arr_err['number'] != 0)
 {
$my_error = $sql_q . "<br><br>\n" .
"errno: " . $arr_err['number'] . "<br>\n" .
"errdescription: " . $arr_err['description'] . "<br>\n" .
"<br><br>\nLine: " . $Linen . " <br>\nFile: " . $Nfile . "<br><br>\n";
$template->add_content($my_error);
$template->flush();
 }
}
/*
(personalmente passo i valori come array preso dalla classe di connessione
al db)
 $arr_err["description"] = @mysql_error($db);
 $arr_err["number"] = @mysql_errno($db);
$sql_q e' la stringa sql che viene utilizzata per fare la query
*/
my_dbquery_error($db->sql_error(),$sql_q, __LINE__, __FILE__);
senza dover neanche fare questioni sull'utilizzo o meno dell' OR
spero che l'esempio possa essere di aiuto per qualcosa di + completo anche
se per certi versi
+ pesante....
ciao
-- 
J2be
e-mail: info[nospam]J2Be.com
www: 
http://www.J2Be.com
"Mark Renton" <miaemail@b.c> wrote in message
news:cn9vo7$vts$1...@lacerta.tiscalinet.it...


 implementa, ma potrebbero essere troppa cosa per un semplice script.
Sono d'accordissimo!!!
E se vuoi fare uno scriptino perl, o un oneliner, allora ben vengano i
controllori di flusso "smart" e gli script strani, tipo
s/hw/HELLOWORLD/,print while <STDIN>
Ma appena superi le 50 righe di codice, sto metodo qua non č piu' tanto
pratico.
Meglio allora il sano vecchio metodo di:
1) esecuzione ed assegnazione del risultato.
2) Valutazione del risultato
3) attuazione delle misure in conseguenza del risultato
-- 
nick: corine
L'ascia lascia la scia
http://alnitak.ctt.it/iltuodovere.jpg