Daniel Segovia

Blog personal

Archive for mayo, 2011

Introducción a las base de datos con PHP

Hacer un comentario

Un porcentaje muy alto de los desarrollos hechos en PHP usan alguna base de datos, simplemente por que en general tenemos la necesidad de guardar datos o información y ésta es almacenada en ellas.
Existen diferentes bases de datos y cada una de ellas tiene sus particularidades. No me detendré a explicar en detalle cada una, pero si explicaré como trabajar básicamente con las bases de datos más conocidas.
Enfocaré el capítulo del manual a PHP, no entraré en detalle en cada base de datos ni tampoco en el lenguaje SQL.
Existen muchísimos artículos sobre PHP y base de datos que explicarán con más detalle la interacción entre uno y otro.

En este capítulo veremos.

Written by Daniel Segovia

mayo 31st, 2011 at 4:45 pm

Autoload

Un comentario

Cuando se escriben aplicaciones orientadas a objetos en PHP los archivos con las clases generalmente van dentro de una carpeta.
Esto es una practica común para encontrar las clases en determinado lugar.
__autoload no es una función definida en PHP, __autoload es una función que debemos definir y ésta será ejecutada cuando se instancie una clase.
Entonces si nosotros almacenamos todas nuestras clases dentro de una carpeta clases podremos instanciar la clase sin necesidad de incluir el archivo que contenga la definición de la clase. Obviamente si el archivo no está incluido producirá un error.
Un ejemplo muy común es definir el autoload y que este incluya el archivo fuente donde este la definición de la clase.

<?php
//index.php
function __autoload($fileName){
    $file = 'clases/' . $fileName.'.php';
    if (file_exists($file)){
        require_once $file;
    }
}
 
$nuevo = new nuevo;
?>
<?php
//clases/nuevo.php
class nuevo{
    function __construct(){
        echo "Clase 'nuevo' ha sido instanciada";
    }
}
?>

En este ejemplo es importante que tanto el nombre del archivo como el nombre de la definición de la clase sean los mismos para que no produzcan un error.
Cuando hago un new nuevo;, antes de hacer efectiva la instancia se ejecuta la función __autoload (debido a que esta definida) y llega como parametro el string nuevo;.
La función concatena strings ($file = ‘clases/’ . $fileName.’.php’;) y forma el path clases/nuevo.php, luego pregunta si el archivo existe y si la pregunta es afirmativa termina incluyéndolo.
Entonces sin necesidad de incluir el archivo estamos haciendo la instancia de la clase que deseábamos.
Otra de las ventajas de usar autoload es que solamente vamos a incluir los archivos que son necesarios para nosotros. Muchas aplicaciones incluyen “kilos” de código innecesariamente sobrecargando la memoria sin sentido

Written by Daniel Segovia

mayo 16th, 2011 at 6:23 pm

Excepciones

Hacer un comentario

Una excepción en PHP es similar a las excepciones en otros lenguajes.
Una excepción puede ser lanzada y atrapada. Dentro de un bloque try definiremos nuestros código para facilitar la captura de posibles excepciones. Cada bloque try debe poseer al menos un bloque catch, y este actuará en caso de que una excepción sea lanzada. La excepción la lanzaremos mediante throw
Cuando una excepción es lanzada todo el código que sigue a ese lanzamiento dentro del bloque try no será ejecutado, entonces el flujo del programa buscará el “catch” correspondiente a ese bloque try. De no haber un catch para ese bloque PHP omitirá un fatal error con un mensaje de “Uncaught Exception”, a menos que este definido un gestor con set_exception_handler().

<?php
function division($dividendo, $divisor) {
    if ($divisor == 0) {
        throw new Exception('Imposible dividir por 0');
    }
    else return $dividendo/$divisor;
}
 
try {
    echo division(10, 5) . "<br />";
    echo division(25, 3) . "<br />";
    echo division(8, 0) . "<br />";
} catch (Exception $e) {
    echo 'Excepción capturada: ',  $e->getMessage(), "\n";
}
 
?>

Resultado

2
8.33333333333
Excepción capturada: Imposible dividir por 0

Un ejemplo dentro de una clase
Es muy común en una clase de base de datos que se lance una excepción cuando no se puede conectar a la base.

<?php
 
class db{
 
    private $link;
 
    function __construct($host, $user, $pass, $db){
        $this->link = false;
        $this->conectar($host, $user, $pass);
        $this->selectDB($db);
    }
 
    function conectar($host, $user, $pass){
        try{
            $this->link = @mysql_pconnect($host, $user, $pass);
            if(!$this->link){
                throw new Exception('No pudo conectarse a la base de datos');
            }
        } catch (Exception $e) {
            echo 'Excepción capturada: ',  $e->getMessage(), "<br />";
        }
    }
 
    function selectDB($db){
        try{
            if(@mysql_select_db($db, $this->link) || !$this->link){
                throw new Exception('No puede seleccionarse la base de datos "'.$db.'"');
            }
        } catch (Exception $e) {
            echo 'Excepción capturada: ',  $e->getMessage(), "<br />";
        }
 
    }
}
 
//usuario, contraseña y db correctas
$db = new db('localhost', 'usuario', 'passok', 'encuentas');
//usuario y contraseña fallidas
$db = new db('localhost', 'usuario', 'passfaild', 'encuenstas');
//usuario y contrasebas correctas y nombre de db fallida
$db = new db('localhost', 'usuario', 'passok', 'dbfaild');
 
?>

Written by Daniel Segovia

mayo 6th, 2011 at 11:53 am