Newsgroup: it.comp.www.php
Titolo: intercettare errore connessione

Ecco cosa mi capita:
Un utente invia un file (tramite l'apposita pagina)
Se l'upload è andato a buon fine avviene la connessione al database e la scrittura di un record.
Sporadicamente accade che, dopo aver uploadato il file, la connessione fallisce e mi ritrovo con un file "orfano" del relativo record.
 
Esiste un modo per far sì che quando si ha un problema di connessione al database (MySql), il DIE invece che visualizzare un testo nella pagina eseguita, invii una mail()?
In questo modo intercetterei il problema in tempo utile e non dopo giorni, quando l'utente si accorge che il suo record non è stato caricato.
 
Oppure, esiste un modo alternativo per testare la connessione "prima" di effettuare delle operazioni?
 
Grazie!

 effettuare delle operazioni?
 
Sì, l'if.
Le funzioni di connessione al DB tornano sempre un messaggio di errore.
 
La classica funzione 
 
mysql_connect(...) or die()
 
non fa altro che cortocircuitare il risultato (false) abusando dell'or. 
In pratica, se la connessione fallisce, diventa
 
false or die()
 
mentre se riesce diventa
 
true or die()
 
Per come funziona l'or, si ferma a valutare appena ha un risultato certo, 
e quando hai true il risultato è certo PRIMA di raggiungere il die(), che 
quindi non viene eseguito, mentre quando è false lui esegue il die() per 
vedere se torna true.
 
In pratica io SCONSIGLIO caldamente questa costruzione a meno che uno non 
abbia almeno 5 anni di esperienza di programmazione in PHP.
 
Bye.

 abbia almeno 5 anni di esperienza di programmazione in PHP.
**************************************************************
 
Sulla base del codice sottostante, puoi darmi un consiglio?
Cioè che vorrei fare è qualcosa del genere:
se la connessione è fallita... mail($mio_indirizzo, $oggetto_mail, $testo_mail);
 
Ho pensato anche a invertire il controllo. Cioè, adesso controllo se è avvenuto l'upload e se è avvenuto scrivo il record. Ma se faccio il contrario rischio che sia il record a essere orfano del file :(
 
Mi ripeto: il problema si è verificato una decina di volte nel corso di due anni. E tutte le volte sono state circoscritte a una sola giornata. Evidentemente, un giorno "sfortunato" per il server (e per me) :)
 
	if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
		{
		$data_inserimento=date('YmdHis');
		$tipo="i";
		$autorizzato="n";
		$visibile="n";
		$utente_inserimento=$_POST['chi'];
		$stringa=$l_anno . $l_organo . $il_numero_del_documento;
		$adozione=substr($_POST['data_adozione'],6,4) . substr($_POST['data_adozione'],3,2) . substr($_POST['data_adozione'],0,2);
		$iniziale=substr($_POST['data_iniziale_pubblicazione'],6,4) . substr($_POST['data_iniziale_pubblicazione'],3,2) . substr($_POST['data_iniziale_pubblicazione'],0,2);
		$finale=substr($_POST['data_finale_pubblicazione'],6,4) . substr($_POST['data_finale_pubblicazione'],3,2) . substr($_POST['data_finale_pubblicazione'],0,2);
		$esecutivita=substr($_POST['data_esecutivita'],6,4) . substr($_POST['data_esecutivita'],3,2) . substr($_POST['data_esecutivita'],0,2);
		$_p_oggetto=$_POST['oggetto'];
		$_p_urgente_si_no=$_POST[urgente_si_no];
		$query = "INSERT INTO mia_tabella VALUES('', '$tipo', '$il_file', '$_p_oggetto', '$il_numero_del_documento', '$l_anno', '$l_organo', '$il_settore_del_documento', '$adozione', '$iniziale', '$finale', '$esecutivita', '$data_inserimento', '$utente_inserimento', '$autorizzato', '$visibile', '', '$stringa', '', '', '$_p_urgente_si_no','')";
		$risultato = mysql_query($query) or die("ANOMALIA. CONTATTARE URGENTEMENTE IL CED. <br><br> " . mysql_error() );
		chmod("../cartella_dei_file/" . basename($_FILES['userfile']['name']), 0777);
 
		}
	else
		{
		echo "Errore nel caricamento del file!\n"; 
		}
 
 


A occhio e croce:
 
if (!mysql_connect(...))
  {
   mail($mio_indirizzo, $oggetto_mail, $testo_mail);
   die();
  }

   }
 
Grazie 1.000! L'ho inserito nel codice APPENA PRIMA della scrittura del record.
 

 		{
 
Non ti offendere, ma questo codice è illeggibile e molto pericoloso.
 
Riscrivertelo per renderlo più leggibile e sicuro è un po' lungo, ma 
qualche consiglio:
 
1- verifica sempre i dati che ti arrivano dall'utente (le date in $_POST, 
sei sicuro che siano nel formato yyyymmdd? Te lo dico io: no).
 
2- escape SEMPRE, di tutti i dati, anche di quelli che generi tu, quando 
scrivi nel DB. Usa PDO con i placeholder, e se proprio vuoi continuare a 
farti male con mysql_query(), almeno usa mysql_real_escape_string()
 
3- suddividi in funzioni (meglio se dentro delle classi). Per esempio una 
per fare il parse delle date.
 
Bye.

 sei sicuro che siano nel formato yyyymmdd? Te lo dico io: no).
 
Perché dovrei offendermi.
Se chiedo consigli è perché voglio imparare.
Riguardo le date... sono sicuro che arrivino in quel modo. Uso uno script in javascript che, cliccando su una data, crea 8 caratteri nel formato yyyymmdd
 
Riguardo il punto 3... faccio già il parse delle date.
 
Prenderò in seria considerazione il punto 2, anche se mi vergogno per non aver capito il senso di "se vuoi continuare a farti male..." :(
 
 
Grazie mille per l'attenzione.

 Riguardo le date... sono sicuro che arrivino in quel modo. Uso uno script in javascript che, cliccando su una data, crea 8 caratteri nel formato yyyymmdd
 
Errata corrige: le date arrivano nel formato ddmmyyyy e poi le inverto, come da codice postato questa mattina :)

 non aver capito il senso di "se vuoi continuare a farti male..." :(
 
Le funzioni mysql_* sono generalmente insegnate perché sono quelle 
"storiche" di PHP, ma sono insicure, e pertanto deprecate (verranno 
rimosse, probabilmente con PHP 6). Va un po' meglio con mysqli, ma gli 
sviluppatori di PHP consigliano di passare a PDO.
 
Qui trovi un buon tutorial per partire:
 
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-
 
for-database-access/
 
La parte fondamentale è appunto usare i placeholder (vedi il paragrafo 
"Prepared Statements") per evitare che un parametro in arrivo dal client 
ti spacchi il database.
 
Bye.

 3- un utente si connette al tuo server con curl, e ti passa i dati che vuole.
 
Innanzitutto grazie per le tue preziose informazioni.
Mi chiedevo come possa fare un utente a modificare il mio javascript se tale file è nel mio server.
 
Ho appena cercato Curl e mi sono fatto un'idea :( 

 tale file è nel mio server.
 
Non lo modifica sul server. Il javascript viene eseguito nel browser, 
quindi viene scaricato e poi eseguito.
 
Modificarlo è abbastanza facile. Metti un breakpoint nel browser, e prima 
che inizi ad eseguirlo (ma dopo che l'ha scaricato) lo modifichi.
 
Nel tuo caso è abbastanza inutile farlo. Conviene mandare direttamente i 
dati con curl. In altri casi, in cui magari i dati vengono elaborati in 
modo più complesso prima di essere spediti, togliere un controllo o un 
filtro può essere più semplice che mandare i dati manualmente.
 
In sostanza, il concetto è: non sai mai cosa ti arriva dal client. Sul 
server devi sempre (ri)controllare tutto.
 
Bye.