19. Prevenció d'errors
Índex
Tipologia dels errors
Qualsevol programa informàtic és susceptible d'errors. D'errors, n'hi ha de tres tipus:
- Errors del programador metre construeix el programa: idealment un programa posat en circulació no en conté, tot i que algunes vegades se'n descobreixen posteriorment; per minimitzar aquest risc és bo d'usar recursos que ens adverteixen de possibles fallades mentre construïm els programes.
- Errors de l'usuari: mai no podem donar per garantit que l'usuari farà allò que nosaltres hàgim previst que hauria de fer; no n'hi ha prou, per exemple, d'indicar que un camp d'un formulari és obligatori; cal fer-lo obligatori mitjançant estructures de control, que sovint donen pas a un avís seguit del retorn a la posició de partença.
- Errors de funcionament: fallades puntuals del servidor, o de la connexió, o un microtall d'electricitat, etc.
A continuació es presenten alguns recursos.
Ús d'estructures condicionals
S'acostuma a fer servir estructures de l'estil de la següent:
- if (avaluació_d'una_condició){
- instruccions en cas d'èxit
- }else{
- instruccions en cas de fracàs
- }
En el segon exemple del tema 17 hem fet servir aquesta sintaxi.
Aquesta mena de control es pot fer extensible a l'execució d'una funció. Les funcions, quan són executades, generen el valor true; en cas contrari, donen false, que pot condicionar l'aparició d'un missatge d'error.
Notem que en aquesta estructura no es fa servir el ';' final.
- Document HTML amb dues opcions, qua passa els valor a un document php via GET. Una de les dues opcions és volgudament errònia.
- <?php
-
- echo "<p>";
-
- $a = $_GET['v']; // Rep les dades
- if ($ar=fopen($a,"r")){ // Intenta obrir el fitxer
- while(!feof($ar)){ // En cas d'èxit
- $lectura = fgets($ar);
- echo $lectura . "<br />";
- }
- fclose($ar);
- }else{
- echo "Error: no funciona"; // En cas d'error (per exemple, el fitxer invocat no existeix)
- }
-
- echo "</p>";
-
- ?>
- Document '.txt'. (només n'hi ha un; l'altre 'ens hem oblidat de fer-lo')
Vegeu-ne el resultat
Les funcions die() i exit()
Aquestes funcions donen un missatge d'error i alhora interrompen l'execució del programa. En general es fan dependre d'un or.
- $ar=fopen("dades.txt","a") or
- die("La cosa no ha anat bé");
Aquestes funcions són excessivament dràstiques i es fan servir sobre tot en les fases d'escriptura dels programes. Si el que volem és prevenir l'usuari final davant un error aleatori, no atribuïble a una mala programació, és molt millor el procediment exposat a l'apartat anterior.
- Document HTML amb un enllaç, volgudament erroni.
- <?php
-
- $a=$_GET['v'];
- $ar=fopen($a,"r")
- or exit("Error: no funciona"); // En cas d'error, interromp el programa
-
- ?>
Vegeu-ne el resultat.
Observeu en particular el codi font del document generat: queda a mig fer a causa de la interrupció.
Accés restringit mitjançant una contrassenya temporal
La protecció contra l'ús indegut pot ésser reforçat mitjançant contrassenyes temporals, presentades a l'usuari en forma d'imatge, generalment acompanyada d'elements que, sense impedir-ne la lectura humana, dificultin molt la lectura automàtica.
- Document HTML amb una imatge inserida, portadora d'una contrassenya, i dotat alhora d'un formulari en el qual cal escriure la contrassenya com a comprovació.
- <?php
-
- $ctrl=imageCreate(100,30);
- $groc_clar=imagecolorallocate($ctrl,255,255,127);
- $rosa=imagecolorallocate($ctrl,255,127,127);
- $verd=imagecolorallocate($ctrl,0,127,0);
- imagefill($ctrl,0,0,$groc_clar);
- $valor_aleatori=rand(100000,999999); // Es genera un nombre aleatori
- session_start();
- $_SESSION['nombre_aleatori'] = $valor_aleatori; // El nombre aleatori es desa com variable de sessió
- imagestring($ctrl,5,25,5,$valor_aleatori,$verd); // S'inscriu el nombre en la imatge
- for($c=0;$c<=5;$c++){
- $x1=rand(0,100);
- $y1=rand(0,30);
- $x2=rand(0,100);
- $y2=rand(0,30);
- imageline($ctrl,$x1,$y1,$x2,$y2,$rosa); I s'hi afegeixen línies aleatòries per a 'despistar'
- }
- header ("Content-type: image/jpeg");
- imagejpeg ($ctrl);
- imagedestroy($ctrl);
-
- ?>
- <?php
-
- session_start();
- if ($_SESSION['nombre_aleatori'] != $_REQUEST['control']){ // Analitza la coincidència entre el nombre entrat per l'usuari i la variable de sessió recuperada
- header ("Location: 19j.htm"); // Si no hi ha coincidència
- }else{
- header ("Location: 19i.htm"); // Si hi ha coincidència
- }
-
- ?>
- Document de notificació d'error.
- Document notificador d'encert; en un cas real seria la continuació del programa.
Vegeu-ne el resultat.
Missatges automàtics d'error
El PHP disposa d'un conjunt de missatges d'error que s'activen quan, per un error de programació o per una fallada del sistema, s'interromp l'execució del programa. Són molt útils en la fase de programació per tal com indiquen succintament les causes de l'error.
- [Mon Jun 07 14:54:07 2010] [error] [client xx.xx.x.xx] PHP Parse error:
syntax error, unexpected '>' in /home/xxxxxx/public_html/php_mysql/19z.php on line 24
-
- [Mon Jun 07 14:53:56 2010] [error] [client xx.xx.x.xx] File does not exist:
/home/xxxxxx/public_html/404.shtml