# MySQL en PHP

Nota: Esta lección se conserva en los apuntes puesto que las extensiones mysql y mysqli siguen incluidas en PHP, pero se recomienda utilizar la extensión PDO que permite acceder con las mismas funciones a diferentes bases de datos.

PHP dispone de dos extensiones (llamadas mysql y mysqli) y para acceder a la base de datos MySQL. La extensión mysql es la más antigua. La extensión mysqli es más moderna y está pensada para sacar partido de las versiones más recientes de MySQL (4.1 y posteriores). En esta lección se utiliza mysqli.

Tengo que mirar cómo se hace para meter números grandes

## Resumen

    // CONECTAR CON LA BASE DE DATOS
    $db = mysqli_connect('localhost', 'root', '');
    if (!$db) {
        print "<p>Imposible conectarse con la base de datos.</p>";
        exit();
    }

    // EJEMPLOS DE CONSULTAS
    // Borrar la base de datos
    $consulta = "DROP DATABASE agenda"

    // Crear la base de datos
    $consulta = "CREATE DATABASE agenda"

    // Crear una tabla
    $consulta = "CREATE TABLE agenda.gente (
      id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
      nombre VARCHAR(50), apellidos VARCHAR(80),
      telefono VARCHAR(9), correo VARCHAR(50),
      PRIMARY KEY(id) )";
    // Se puede poner al final de la $consulta TYPE = InnoDB;";

    // Borrar una tabla

    // Añadir un dato
    $consulta = "INSERT INTO agenda.gente
                 values (NULL, '$nombre', '$apellidos', '$telefono', '$correo')";

    // Seleccionar todos los registros
    $consulta = "SELECT * FROM agenda.gente ORDER BY $campo $orden";

    // Borrar un registro
    $consulta = "DELETE FROM agenda.gente WHERE id = '$numero'";

    // Borrar varios registros
    foreach ($_REQUEST['id'] as $num => $basura) {
        $numero = limpia_para_consulta($db, $num);
        $consulta = "DELETE FROM agenda.gente WHERE id = '$numero'";
        ...
    }

    // Buscar registros
    $consulta = "SELECT * FROM agenda.gente WHERE nombre LIKE '%$nombre%'"
     ." AND apellidos LIKE '%$apellidos%' AND telefono LIKE '%$telefono%'"
     ." AND correo LIKE '%$correo%' ORDER BY $campo $orden";

    // Modificar un registro
    $consulta = "UPDATE agenda.gente SET nombre = '$nombre',
                 apellidos = '$apellidos', telefono = '$telefono', correo = '$correo'
                 WHERE id = '$id'";

    // FIN EJEMPLOS DE CONSULTAS

    // EJECUTAR LA CONSULTA
    $result = mysqli_query($db, $consulta);

    // Para comprobar si el resultado es vacío:
    if (mysqli_num_rows($result) == 0) {
        print "<p>Sin resultado</p>";
    }

    // Si el resultado de la consulta pueden ser varias filas:
    while ($valor = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
        print "<p>Nombre: $valor[nombre] - Apellidos: $valor[apellidos]</p>";
    }
    // El tipo de la tabla puede ser MYSQLI_ASSOC, MYSQLI_NUM, MYSQLI_BOTH

    // Para comprobar si una base de datos existe se puede hacer la consulta:
    $consulta = "SELECT COUNT(*) as existe_db FROM INFORMATION_SCHEMA.SCHEMATA
                 WHERE SCHEMA_NAME='agenda'"
    $result = mysqli_query($db, $consulta);
    $valor = mysqli_fetch_array($result, MYSQLI_ASSOC);
    if ($valor['existe'db]) {
        ...

Volver al principio de la página

## Conexión con MySQL

La función para conectar con la base de datos es mysqli_connect($hostname, $usuario, $password), que devuelve un identificador de enlace que se utiliza en todas las consultas posteriores.

En el ejemplo siguiente, la variable $db almacena el identificador de enlace.

    <?php
    $db = mysqli_connect('localhost', 'root', '');
    if (!$db) {
        print "<p>Imposible conectarse con la base de datos.</p>";
        exit();
    }
    ?>

Si no se puede establecer la conexión con la base de datos, puede deberse a que la base de datos no esté funcionando, a que los datos de usuario no sean correctos o a que no esté activada la extensión mysqli (véase la lección sobre configuración de php).

Volver al principio de la página

## Consultas a la base de datos

Una vez realizada la conexión a la base de datos, las operaciones se realizan a través de consultas.

La principal función para efectuar consultas es mysqli_query($db, $consulta). Dependiendo del tipo de consulta, la función devuelve un valor lógico o un recurso.

Hablar de las otras consultas (obsoletas o no).

Volver al principio de la página

### Seguridad en las consultas

Los ataques malintencionados más habituales son las inyecciones de SQL, que consisten en enviar en los campos de formulario partes de una consulta SQL de manera que PHP ejecute una consulta distinta a la preparada por el programador de la página.

Para evitar este tipo de ataques, es necesario utilizar la función mysqli_real_escape_string($db, $cadena) antes de incluir en la consulta datos enviados por el usuario. Esta función debe aplicarse a cualquier campo de formulario que vaya a incluirse dentro de una consulta.

    <?php
    function recoge_para_consulta($db, $var)
    {
        $var = (isset($_REQUEST[$var])) ? trim(strip_tags($_REQUEST[$var])) : "";
        if (get_magic_quotes_gpc()) {
            $var = stripslashes($var);
        }
        if (!is_numeric($var)) {
            $var = mysqli_real_escape_string($db, $var);
        }
        return $var;
    }

    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");
    $nombre = recoge_para_consulta($db, "nombre");
    ?>

Falta explicar el ejemplo (get_magic_quotes_gpc, stripslashes, is_numeric, etc).
Faltan ejemplos de inyecciones: esta página en francés habla sobre el tema http://www.phpsecure.info/v2/article/InjSql.php

Volver al principio de la página

### Consultas CREATE DATABASE, DROP DATABASE

Para crear una base de datos, se utiliza la consulta CREATE DATABASE.

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $consulta = "CREATE DATABASE agenda";
    if (mysqli_query($db, $consulta)) {
        print "<p>Base de datos creada correctamente.</p>";
    } else {
        print "<p>Error al crear la base de datos.</p>";
    }
    ?>

Para borrar una base de datos, se utiliza la consulta DROP DATABASE.

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $consulta = "DROP DATABASE agenda";
    if (mysqli_query($db, $consulta)) {
        print "<p>Base de datos eliminada correctamente.</p>";
    } else {
        print "<p>Error al eliminar la base de datos.</p>";
    }
    ?>

Volver al principio de la página

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

Para crear una tabla, se utiliza la consulta CREATE TABLE.

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");
    $consulta = "CREATE TABLE agenda.gente
                   (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
                   nombre VARCHAR(50), apellidos VARCHAR(80), PRIMARY KEY(id))";
    if (mysqli_query($db, $consulta)) {
        print "<p>Tabla creada correctamente.</p>";
    } else {
        print "<p>Error al crear la tabla.</p>";
    }
    ?>

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

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $consulta = "DROP TABLE agenda.gente";
    if (mysqli_query($db, $consulta)) {
        print "<p>Tabla eliminada correctamente.</p>";
    } else {
        print "<p>Error al eliminar la tabla.</p>";
    }
    ?>

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

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $consulta = "INSERT INTO agenda.gente values (NULL , 'pepito' , 'conejo')";
    if (mysqli_query($db, $consulta)) {
        print "<p>Registro añadido correctamente.</p>";
    } else {
        print "<p>Error al añadir el registro.</p>";
    }
    ?>

Si se insertan datos provinientes de un formulario, las cadenas deben haberse tratado para evitar inyecciones de SQL.

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

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $consulta = "UPDATE agenda.gente SET nombre = 'Juan', apellidos = 'López' WHERE id = '4'";
    if (mysqli_query($db, $consulta)) {
        print "<p>Registro modificado correctamente.</p>";
    } else {
        print "<p>Error al modificar el registro.</p>";
    }
    ?>

Si se insertan datos provinientes de un formulario, las cadenas deben haberse tratado para evitar inyecciones de SQL.

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

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $consulta = "DELETE FROM agenda.gente WHERE id = '1'";
    if (mysqli_query($db, $consulta)) {
        print "<p>Registro borrado correctamente.</p>";
    } else {
        print "<p>Error al borrar el registro.</p>";
    }
    ?>

Volver al principio de la página

### Consulta SELECT

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

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $consulta = "SELECT * FROM agenda.gente ORDER BY apellidos DESC";
    $resultado = mysqli_query($db, $consulta, MYSQLI_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
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $consulta = "SELECT * FROM agenda.gente WHERE apellidos LIKE 'Pérez%'";
    $resultado = mysqli_query($db, $consulta, MYSQLI_ASSOC);
    ?>
    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $consulta = "SELECT * FROM agenda.gente WHERE apellidos LIKE '%Pérez%'";
    $resultado = mysqli_query($db, $consulta, MYSQLI_ASSOC);
    ?>

Se pueden realizar consultas de unión:

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $resultado = mysqli_query($db, "SELECT * FROM agenda.gente, agenda.ciudades
      WHERE gente.nacido-localidad = ciudades.id", MYSQLI_ASSOC);
    ?>

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

    <?php
    $db = mysqli_connect('localhost', 'root', '') or die("No se puede establecer la conexión con la base de datos");

    $resultado = mysqli_query($db, "SELECT *
      FROM agenda.gente, agenda.ciudades AS nacido, ciudades.agenda AS fallecido
      WHERE gente.nacido-localidad = nacido.id
      AND gente.fallecido-localidad = fallecido.id", MYSQLI_ASSOC);
    ?>

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons.