# SQLite en PHP

Nota: Esta lección se conserva en los apuntes puesto que SQLite sigue incluida en PHP, pero se recomienda utilizar la extensión PDO que permite acceder con las mismas funciones a diferentes bases de datos.

## Qué es SQLite

SQLite es una biblioteca escrita en C que implementa un motor de base de datos SQL92 (algunas características de SQL92 no están implementadas). SQLite se distribuye bajo la licencia de dominio público. La página web de SQLite es http://www.sqlite.org.

En la versión 4 de PHP, SQLite se podía utilizar como base de datos instalando un módulo PECL. A partir de la versión 5 de PHP, SQLite está incluido en PHP, por lo que está disponible sin necesidad de realizar ninguna instalación adicional.

Los nombres de las funciones de php que permiten utilizar SQLite en PHP empiezan por sqlite_ y son similares a los que permiten acceder otras bases de datos utilizables desde PHP (mysql, postgresql, etc). El manual de PHP incluye un capítulo dedicado a SQLite.

Volver al principio de la página

## Versión de SQLite

Como SQLite y PHP son proyectos independientes, la versión incluida en PHP no tiene por qué ser la última versión disponible de SQLite. Hay dos funciones que permiten conocer la versión de SQLite instalada en PHP:

- sqlite-libversion(), que devuelve la versión de SQLite.
- sqlite-libencoding(), que devuelve la codificación (ISO-8859-1 or UTF-8) de SQLite.

Por ejemplo, en PHPhome 2.3.4, que incluye PHP 5.0.0, la versión de SQLite incluida es la 2.8.14, publicada el 9 de junio de 2004, con codificación iso8859:

    <?php
    print "<p>Versión PHP: ".phpversion()."</p>";
    print "<p>Versión SQLite: ".sqlite_libversion()."</p>";
    print "<p>Codificación: ".sqlite_libencoding()."</p>";
    ?>
| Versión PHP: 5.0.0 Versión SQLite: 2.8.14 Codificación: iso8859

Volver al principio de la página

## Utilización de SQLite

### Creación/Acceso a la base de datos

En SQLite, una base de datos es normalmente un fichero, aunque también pueden abrirse bases de datos en memoria.

La función para abrir una base de datos es sqlite_open(). El argumento de sqlite_open() es la ruta del archivo en el servidor (o :memory: en el caso de crear la base de datos en memoria. Si la base de datos no existe, la función crea una base de datos nueva. La función devuelve un manejador (handle), que se utiliza en el resto de funciones que acceden a la base de datos.

En el ejemplo siguiente, la variable $caminodb almacena la ruta donde se encuentra la base de datos y la variable $db el manejador de la base de datos.

    <?php
    $caminodb = $_SERVER['DOCUMENT_ROOT']."db\\prueba01.db";
    $db = sqlite_open($caminodb) or die("No puedo abrir la base de datos ");
    ?>

Volver al principio de la página

### Consultas a la base de datos

Una vez abierta la base de datos, se pueden realizar consultas SQL utilizando varias funciones. Cada función devuelve el resultado de la consulta de forma ligeramente distinta.

- sqlite_array_query(handle, consulta, tipo) devuelve la consulta en forma de matriz
- sqlite_exec(consulta) devuelve simplemente verdadero o falso, pero no los datos.
- sqlite_query(handle, consulta) devuelve un manejador del resultado
- sqlite_single_query(handle, consulta, primera_línea) devuelve únicamente una columna o la primera fila del resultado
- sqlite_unbuffered_query(handle, consulta) devuelve la consulta sin prefecht

La función sqlite_array_query() devuelve la respuesta de la consulta en forma de matriz. No es conveniente utilizar esta función si el resultado de la consulta contiene muchos registros, ya que puede ocupar mucha memoria en el servidor.

Explicar las diferencias entre ellas.

Volver al principio de la página

### Consultas CREATE TABLE, DROP TABLE, INSERT INTO, UPDATE, DELETE FROM

En estos ejemplos, la variable $db es un manejador creado con sqlite_open().

Para crear una tabla, se utiliza la consulta CREATE TABLE. Para crear un campo índice hay que definirlo INTEGER PRIMARY KEY.

    <?php
    sqlite_query($db, "CREATE TABLE personas(id INTEGER PRIMARY KEY, nombre, apellidos)");
    ?>

Para borrar una tabla, se utiliza la consulta DROP TABLE.

    <?php
    sqlite_query($db, "DROP TABLE personas");
    ?>

Para añadir un registro a una tabla, se utiliza la consulta INSERT INTO.

    <?php
    sqlite_query($db, "INSERT INTO personas values (NULL , 'pepito' , 'conejo')" );
    ?>

Al insertar una cadena de texto, algunos caracteres pueden dar problemas, por lo que conviene utilizar la función sqlite_escape_string(). Esta función parece dar problemas con las cadenas vacías, así que parece que sólo hay que aplicarla tras comprobar que la cadena no es vacía.

    <?php
    $apellido = ($_REQUEST['apellido'] == "") ? "" : sqlite_escape_string($_REQUEST['apellido']);
    sqlite_query($db, "INSERT INTO personas values (NULL, 'pepito' , '$apellido')" );
    ?>

Lógicamente, si se ha utilizado la función sqlite_escape_string() al introducir una cadena en la base de datos, es necesario deshacer los cambios al mostrar la cadena. Para ello se puede utilizar la función stripslashes():

    <?php
    print "<p>Apellidos:".stripslashes($resultado['apellidos'])."</p>
    ?>

Para modificar un registro a una tabla, se utiliza la consulta UPDATE.

    <?php
    sqlite_query($db, "UPDATE personas SET nombre = 'Juan', apellidos = 'López' WHERE id = '4'");
    ?>

Para borrar un registro de una tabla, se utiliza la consulta DELETE FROM.

    <?php
    sqlite_query($db, "DELETE FROM personas WHERE id = '1'");
    ?>

### Consulta SELECT

Para obtener registros que cumplan determinados criterios se utiliza la consulta SELECT.

    <?php
    $resultado = sqlite_array_query($db, "SELECT * FROM personas ORDER BY apellidos DESC", SQLITE_ASSOC);
    ?>

La consulta SELECT permite efectuar búsquedas en cadenas utilizando el condicional LIKE o NOT LIKE y los comodines _ (cualquier carácter) o % (cualquier número de caracteres). La primera consulta del ejemplo siguiente devolvería todos los registros en los que el primer apellido es Pérez, mientras que la segunda consulta devolvería todos los registros en los que el primer o segundo apellido es Pérez.

    <?php
    $resultado = sqlite_array_query($db, "SELECT * FROM personas WHERE apellidos LIKE 'Pérez%'", SQLITE_ASSOC);
    ?>
    <?php
    $resultado = sqlite_array_query($db, "SELECT * FROM personas WHERE apellidos LIKE '%Pérez%'", SQLITE_ASSOC);
    ?>

Se pueden realizar consultas de unión:

    <?php
    $resultado = sqlite_array_query($db, "SELECT * FROM personas, ciudades
        WHERE personas.nacido-localidad = ciudades.id", SQLITE_ASSOC);
    ?>

Si se utiliza la misma tabla dos veces se deben utilizar alias:

    <?php
    $resultado = sqlite_array_query($db, "SELECT * FROM personas, ciudades AS nacido, ciudades AS fallecido
        WHERE personas.nacido-localidad = nacido.id AND personas.fallecido-localidad = fallecido.id",
        SQLITE_ASSOC);
    ?>

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons.