Newsgroup: it.comp.www.php
Titolo: Un consiglio sullo sitle di programmazione

Salve ragazzi,
La stragrande maggioranza dei miei
script php produce output in base al contenuto
di un database (ma guarda un pň!!!).
Viste le premesse vorrei avere un cosngilio da qualcuno che
ha piů esperienza di me:
se una query al db non va a buon fine generalmente interrompo
il normale flusso dell script dando in output un messaggio di errore.
Molte delle mie istruzioni assumono quindi questa sintassi:
if (!$risultato = funzione_che_esegue_la_query()) stampa_pagina_di_errore();
dove:
funzione_che_esegue_la_query() restituisce 0 in caso di errore e all'interno
della funzione stampa_pagina_di_errore() c'č anche una "bella" exit(0).
Lo so che non č buona pratica terminare in maniera cosě brusca l'esecuzione
di uno script
(specie se questo avviene non nel corpo dello script ma all'interno di una
funzione da esso
chiamata) ma non ho un'idea migliore.
Che ne pensate voi di effettuare questa "brutta" operazione direttamente
all'interno della
funzione funzione_che_esegue_la_query() in maniera tale da avere nello
script del codice
piů pulito tipo:
$risultato = funzione_che_esegue_la_query();
Soluzioni alternative sono ben accette.
Saluti.

 Soluzioni alternative sono ben accette.
Visto che la maggior parte delle funzioni (DB e non) permettono di
verificare l'esito della chiamata controllando il risultato restituito
io utilizzo questo sistema:
$res = @command ();
if ($res)
{ 
 //OK
}
else
{ 
 //KO
}
Ad esempio per le operazioni su DB utilizzo:
function safe_query ($query = "")
{
	if (empty ($query)) { return false; }
	return @mysql_query($query);
}
$result = safe_query ($sql);
if ($result)
{
	if (mysql_num_rows ($result)>0)
	{
		while ($row = mysql_fetch_assoc ($result))
		{
			// print etc.
		}
	}
	else // if (mysql_num_rows ($result)>0)
	{
		// non ci sono record
	}
	mysql_free_result ($result);
}
else // if ($result)
{
	// Gestione errore
}
Questa struttura permette una certa flessibilita' e pulizia di codice
-- 
I'am what I'am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/1


E' proprio questo stile che, con la mia soluzione "brutta", ho cercato di
evitare.
Non è una critica nei confronti del tuo stile, ma così scrivevo troppe volte
lo stesso
codice per controllare o meno degli errori che tra parentesi non si
verificano quasi mai.....
Visto che nella maggior parte dei casi un errore in una interrogazione
al db mi comporta l'impossibilità di proseguire nello script allora ho
pensato di terminare
l'esecuzione dello script e generare un messaggio di errore delegando il
tutto ad una apposita
funzione.
In questo modo ottengo righe di codice negli script del tipo
if (!$r = f()) error();
Secondo me l'ideale sarebbe ottenere qualcosa del tipo
$r = f();
ed effettuare all'interno della funzione f() la chiamata alla funzione
error() nel
caso in cui si verifichino errori.
Fa proprio schifo come soluzione???
Ciao.

 Fa proprio schifo come soluzione???
E' una questione di scelte. :)


 Saluti.
ciao ...
-- 
#include <stdio.h>
int main(void){char c[]={10,65,110,116,111,110,105,111,32,98,97,114,98,111,110,
101,32,60,104,105,110,100,101,109,105,116,64,116,105,115,99,97,108,105,110,101,
116,46,105,116,62,10,10,0};printf("%s",c);return 0;}

 della funzione stampa_pagina_di_errore() c'è anche una "bella" exit(0).
Mi viene in mente un "trucchetto": immagina un insieme di istruzioni, l'una
dipendente dalle precedenti
mysql_connetti();
mysql_qualcosa();
mysql_qualcosaltro();
mysql_close();
potresti fare in questo modo:
_________________
$tutto_ok = 0;
for ($hehe = 0; $hehe == 0; $hehe++) {
    // ciclo che viene eseguito una sola volta
    if (!mysql_connetti()) break;
    if (!mysql_qualcosa()) break;
    if (!mysql_qualcosaltro()) break;
    if (!mysql_close()) break;
    // qui ci arriva solo se è andato tutto bene
    $tutto_ok = 1;
}
if (!$tutto_ok) {
    stampaerrore();
    // in stampaerrore non c'è la exit!
}else {
...tutto il normale output
}
// parte finale della pagina
____________________
Invece del semplice break potresti impostare anche una variabile che
descriva l'errore (con un'identificativo o con un messaggio), in modo che
stampaerrore() sappia indicare esattamente cosa è successo.
Buona notte
Ludovico Grossi

 
Mah forse ti risolve tutto php 5.0 con le eccezioni....
Ciao

Secondo me la tua soluzione non è ottima ma è sicuramente un buon
compromesso
nel senso che per fare le cose per bene dovresti avere un vero sistema di
gestione degli errori
quindi tracciare gli errori tramite log ecc.
Magari non dovresti bloccare l'intero script e gestirla diversamente (in
questo momento non mi vien in mente niente) comunque quello che bisogna
assolutamente evitare e di scrivere tanto codice duplicato qua e la
la cosa più sensata dovrebbe essere centralizzare ovvero far riferimento a
del codice sia di gestioe di errore
o che fa altre cose riutilizzabile se si verifica un'errore o ti accorgi di
qualche boiata che hai fatto devi mettere mano in un sol punto altrimenti
avrai un proliferare di if else a mio avviso ... non comodi per queste cose
io consiglierei più una soluzoine OO
cmq sono un inesperto questa è solo la mia idea
Ciao spero di esserti stato d'aiuto



Il tuo sistema va bene per gli errori generati da PHP, meno se hai bisogno
di gestire gli errori in modo flessibile...quindi anche errori che per PHP
non sono errori ma che lo sono per la logica della tua applicazione.
Se cerchi una gestione degli errori completa in Php 4 ti consiglio di
perdere un po' di tempo con le funzioni set_error_handler() e
trigger_error(), non sono come le eccezioni ma ci provano.
Un'alternativa è quella di far ereditare alle proprie classi il sistema di
errori PEAR.
Fabio
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/