Ejercicios (bases de datos) - PDO - Soluciones

En esta página se muestran una parte de las soluciones de los ejercicios PDO, concretamente el fragmento PHP, sin el principio ni el final de la página que se pueden dejar en fragmentos HTML.

Si lo prefiere, puede descargar unas posibles soluciones completas de estos ejercicios.

PDO 1 - SQLite: programa único

<?php
//
//
// PASO 1: Definir las opciones del programa

// Variables configurables por el administrador de la aplicación

// Configuración para SQLite

$cfg["sqliteDatabase"] = "/tmp/pdo-1.sqlite";           // Ubicación de la base de datos

// Tamaño de los campos en la tabla Personas

$cfg["tablaPersonasTamNombre"]    = 40;                 // Tamaño de la columna Personas > Nombre
$cfg["tablaPersonasTamApellidos"] = 60;                 // Tamaño de la columna Personas > Apellidos

// Variables configurables por el programador de la aplicación

// Nombres de las tablas

$cfg["tablaPersonas"] = "personas";                     // Nombre de la tabla Personas

//
//
// PASO 2: Crear el objeto PDO de conexión con la base de datos.

// SQLITE: Conexión con la base de datos

function conectaDb()
{
    global $cfg;

    try {
        $tmp = new PDO("sqlite:$cfg[sqliteDatabase]");
        $tmp->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
        $tmp->query("PRAGMA foreign_keys = ON");
        $tmp->query("PRAGMA encoding = 'UTF-8'");
        return $tmp;
    } catch (PDOException $e) {
        print "    <p class=\"aviso\">Error: No puede conectarse con la base de datos. {$e->getMessage()}</p>\n";
        exit;
    }
}

// CONEXIÓN CON LA BASE DE DATOS

$pdo = conectaDb();

//
//
// PASO 3: Borrar la tabla.

// CONSULTA DE BORRADO DE TABLA

$consulta = "DROP TABLE IF EXISTS $cfg[tablaPersonas]";

if (!$pdo->query($consulta)) {
    print "    <p class=\"aviso\">Error al borrar la tabla. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p>Tabla borrada correctamente (si existía).</p>\n";
}
print "\n";

//
//
// PASO 4: Crear la tabla.

// SQLITE: CONSULTA DE CREACIÓN DE TABLA

$consulta = "CREATE TABLE $cfg[tablaPersonas] (
             id INTEGER PRIMARY KEY,
             nombre VARCHAR($cfg[tablaPersonasTamNombre]) COLLATE NOCASE,
             apellidos VARCHAR($cfg[tablaPersonasTamApellidos]) COLLATE NOCASE
             )";

if (!$pdo->query($consulta)) {
    print "    <p class=\"aviso\">Error al crear la tabla. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p>Tabla creada correctamente.</p>\n";
}
print "\n";

//
//
// PASO 5: Insertar un registro en la tabla.

// CONSULTA DE INSERCIÓN DE REGISTRO

$nombre    = "Pepito";            // Normalmente estos valores vendrán de un formulario
$apellidos = "Conejo";

$consulta = "INSERT INTO $cfg[tablaPersonas]
             (nombre, apellidos)
             VALUES (:nombre, :apellidos)";

$resultado = $pdo->prepare($consulta);
if (!$resultado) {
    print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} elseif (!$resultado->execute([":nombre" => $nombre, ":apellidos" => $apellidos])) {
    print "    <p class=\"aviso\">Error al ejecutar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p>Registro creado correctamente.</p>\n";
    print "\n";
}

//
//
// PASO 6: Mostrar cuántos registros hay en la tabla.

// CONSULTA DE SELECCIÓN DE REGISTROS QUE DEVUELVE UN ÚNICO REGISTRO DE UNA COLUMNA

$consulta = "SELECT COUNT(*) FROM $cfg[tablaPersonas]";

$resultado = $pdo->query($consulta);
if (!$resultado) {
    print "    <p class=\"aviso\">Error en la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p>La tabla contiene {$resultado->fetchColumn()} registro(s).</p>\n";
    print "\n";
}

//
//
// PASO 7: Mostrar los valores del registro guardado en la tabla.

// CONSULTA DE SELECCIÓN DE REGISTROS QUE PUEDE DEVOLVER VARIOS REGISTROS (O UNO O NINGUNO)

$consulta = "SELECT * FROM $cfg[tablaPersonas]";

$resultado = $pdo->query($consulta);
if (!$resultado) {
    print "    <p class=\"aviso\">Error en la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p><strong>Registro(s) obtenido(s):</strong></p>\n";
    print "    <ul>\n";
    foreach ($resultado as $registro) {
        print "      <li>$registro[id] - $registro[nombre] - $registro[apellidos]</li>\n";
    }
    print "    </ul>\n";
    print "\n";
}

//
//
// PASO 8: Modificar el registro guardado en la tabla.

// CONSULTA DE MODIFICACIÓN DE REGISTRO

$id        = "1";                 // Normalmente estos valores vendrán de un formulario
$nombre    = "Pepita";
$apellidos = "Conejo";

$consulta = "UPDATE $cfg[tablaPersonas]
             SET nombre = :nombre, apellidos = :apellidos
             WHERE id = :id";

$resultado = $pdo->prepare($consulta);
if (!$resultado) {
    print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} elseif (!$resultado->execute([":nombre" => $nombre, ":apellidos" => $apellidos, ":id" => $id])) {
    print "    <p class=\"aviso\">Error al ejecutar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p>Registro modificado correctamente.</p>\n";
    print "\n";
}

//
//
// PASO 9: Mostrar los valores del registro guardado en la tabla.

// CONSULTA DE SELECCIÓN DE REGISTROS QUE PUEDE DEVOLVER VARIOS REGISTROS (O UNO O NINGUNO)

$consulta = "SELECT * FROM $cfg[tablaPersonas]";

$resultado = $pdo->query($consulta);
if (!$resultado) {
    print "    <p class=\"aviso\">Error en la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p><strong>Registro(s) obtenido(s):</strong></p>\n";
    print "    <ul>\n";
    foreach ($resultado as $registro) {
        print "      <li>$registro[id] - $registro[nombre] - $registro[apellidos]</li>\n";
    }
    print "    </ul>\n";
    print "\n";
}

//
//
// PASO 10: Insertar un segundo registro en la tabla.

// CONSULTA DE INSERCIÓN DE REGISTRO

$nombre    = "Numa";            // Normalmente estos valores vendrán de un formulario
$apellidos = "Nigerio";

$consulta = "INSERT INTO $cfg[tablaPersonas]
             (nombre, apellidos)
             VALUES (:nombre, :apellidos)";

$resultado = $pdo->prepare($consulta);
if (!$resultado) {
    print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} elseif (!$resultado->execute([":nombre" => $nombre, ":apellidos" => $apellidos])) {
    print "    <p class=\"aviso\">Error al ejecutar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p>Registro creado correctamente.</p>\n";
    print "\n";
}

//
//
// PASO 11: Mostrar cuántos registros hay en la tabla.

// CONSULTA DE SELECCIÓN DE REGISTROS QUE DEVUELVE UN ÚNICO REGISTRO DE UNA COLUMNA

$consulta = "SELECT COUNT(*) FROM $cfg[tablaPersonas]";

$resultado = $pdo->query($consulta);
if (!$resultado) {
    print "    <p class=\"aviso\">Error en la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p>La tabla contiene {$resultado->fetchColumn()} registro(s).</p>\n";
    print "\n";
}

//
//
// PASO 12: Mostrar los valores de los dos registros guardados en la tabla.

// CONSULTA DE SELECCIÓN DE REGISTROS QUE PUEDE DEVOLVER VARIOS REGISTROS (O UNO O NINGUNO)

$consulta = "SELECT * FROM $cfg[tablaPersonas]";

$resultado = $pdo->query($consulta);
if (!$resultado) {
    print "    <p class=\"aviso\">Error en la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p><strong>Registro(s) obtenido(s):</strong></p>\n";
    print "    <ul>\n";
    foreach ($resultado as $registro) {
        print "        <li>$registro[id] - $registro[nombre] - $registro[apellidos]</li>\n";
    }
    print "    </ul>\n";
    print "\n";
}

//
//
// PASO 13: Borrar el primer registro guardado en la tabla.

// CONSULTA DE BORRADO DE REGISTROS

$id = [1 => "on"];     // Normalmente este valor vendrá de un formulario (en este caso, como matriz).

foreach ($id as $indice => $valor) {
    $consulta = "DELETE FROM $cfg[tablaPersonas]
                 WHERE id = :indice";

    $resultado = $pdo->prepare($consulta);
    if (!$resultado) {
        print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } elseif (!$resultado->execute([":indice" => $indice])) {
        print "    <p class=\"aviso\">Error al ejecutar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } else {
        print "    <p>Registro borrado correctamente (si existía).</p>\n";
        print "\n";
    }
}

//
//
// PASO 14: Mostrar los valores del registro guardado en la tabla.

// CONSULTA DE SELECCIÓN DE REGISTROS QUE PUEDE DEVOLVER VARIOS REGISTROS (O UNO O NINGUNO)

$consulta = "SELECT * FROM $cfg[tablaPersonas]";

$resultado = $pdo->query($consulta);
if (!$resultado) {
    print "    <p class=\"aviso\">Error en la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
} else {
    print "    <p><strong>Registro(s) obtenido(s):</strong></p>\n";
    print "    <ul>\n";
    foreach ($resultado as $registro) {
        print "      <li>$registro[id] - $registro[nombre] - $registro[apellidos]</li>\n";
    }
    print "    </ul>\n";
    print "\n";
}
?>

PDO 2 - SQLite: programa con funciones

<?php
// SQLITE: FUNCIÓN DE CONEXIÓN CON LA BASE DE DATOS

function conectaDb()
{
    global $cfg;

    try {
        $tmp = new PDO("sqlite:$cfg[sqliteDatabase]");
        $tmp->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
        $tmp->query("PRAGMA foreign_keys = ON");
        $tmp->query("PRAGMA encoding = 'UTF-8'");
        return $tmp;
    } catch (PDOException $e) {
        print "    <p class=\"aviso\">Error: No puede conectarse con la base de datos. {$e->getMessage()}</p>\n";
        exit;
    }
}

// SQLITE: FUNCIÓN DE BORRADO Y CREACIÓN DE TABLA

function borraTodo()
{
    global $pdo, $cfg;

    $consulta = "DROP TABLE IF EXISTS $cfg[tablaPersonas]";

    if (!$pdo->query($consulta)) {
        print "    <p class=\"aviso\">Error al borrar la tabla. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } else {
        print "    <p>Tabla borrada correctamente (si existía).</p>\n";
    }
    print "\n";

    $consulta = "CREATE TABLE $cfg[tablaPersonas] (
                 id INTEGER PRIMARY KEY,
                 nombre VARCHAR($cfg[tablaPersonasTamNombre]) COLLATE NOCASE,
                 apellidos VARCHAR($cfg[tablaPersonasTamApellidos]) COLLATE NOCASE
                 )";

    if (!$pdo->query($consulta)) {
        print "    <p class=\"aviso\">Error al crear la tabla. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } else {
        print "    <p>Tabla creada correctamente.</p>\n";
    }
    print "\n";
}

// FUNCIÓN DE INSERCIÓN DE REGISTRO

function insertaRegistro($nombre, $apellidos)
{
    global $pdo, $cfg;

    $consulta = "INSERT INTO $cfg[tablaPersonas]
                 (nombre, apellidos)
                 VALUES (:nombre, :apellidos)";

    $resultado = $pdo->prepare($consulta);
    if (!$resultado) {
        print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } elseif (!$resultado->execute([":nombre" => $nombre, ":apellidos" => $apellidos])) {
        print "    <p class=\"aviso\">Error al ejecutar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } else {
        print "    <p>Registro creado correctamente.</p>\n";
        print "\n";
    }
}

// FUNCIÓN DE CONTEO DE REGISTROS

function cuentaRegistros()
{
    global $pdo, $cfg;

    $consulta = "SELECT COUNT(*) FROM $cfg[tablaPersonas]";

    $resultado = $pdo->query($consulta);
    if (!$resultado) {
        print "    <p class=\"aviso\">Error en la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } else {
        print "    <p>La tabla contiene {$resultado->fetchColumn()} registro(s).</p>\n";
        print "\n";
    }
}

// FUNCIÓN DE SELECCIÓN DE TODOS LOS REGISTROS

function muestraRegistros()
{
    global $pdo, $cfg;

    $consulta = "SELECT * FROM $cfg[tablaPersonas]";

    $resultado = $pdo->query($consulta);
    if (!$resultado) {
        print "    <p class=\"aviso\">Error en la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } else {
        print "    <p><strong>Registro(s) obtenido(s):</strong></p>\n";
        print "    <ul>\n";
        foreach ($resultado as $registro) {
            print "      <li>$registro[id] - $registro[nombre] - $registro[apellidos]</li>\n";
        }
        print "    </ul>\n";
        print "\n";
    }
}

// FUNCIÓN DE MODIFICACIÓN DE REGISTRO

function modificaRegistro($id, $nombre, $apellidos)
{
    global $pdo, $cfg;

    $consulta = "UPDATE $cfg[tablaPersonas]
                 SET nombre = :nombre, apellidos = :apellidos
                 WHERE id = :id";

    $resultado = $pdo->prepare($consulta);
    if (!$resultado) {
        print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } elseif (!$resultado->execute([":nombre" => $nombre, ":apellidos" => $apellidos, ":id" => $id])) {
        print "    <p class=\"aviso\">Error al ejecutar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
    } else {
        print "    <p>Registro modificado correctamente.</p>\n";
        print "\n";
    }
}

// FUNCIÓN DE BORRADO DE REGISTROS

function borraRegistros($id)
{
    global $pdo, $cfg;

    foreach ($id as $indice => $valor) {
        $consulta = "DELETE FROM $cfg[tablaPersonas]
                     WHERE id = :indice";

        $resultado = $pdo->prepare($consulta);
        if (!$resultado) {
            print "    <p class=\"aviso\">Error al preparar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
        } elseif (!$resultado->execute([":indice" => $indice])) {
            print "    <p class=\"aviso\">Error al ejecutar la consulta. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
        } else {
            print "    <p>Registro borrado correctamente (si existía).</p>\n";
            print "\n";
        }
    }
}

// Variables configurables por el administrador de la aplicación

// Configuración para SQLite

$cfg["sqliteDatabase"] = "/tmp/pdo-2.sqlite";           // Ubicación de la base de datos

// Tamaño de los campos en la tabla Personas

$cfg["tablaPersonasTamNombre"]    = 40;                 // Tamaño de la columna Personas > Nombre
$cfg["tablaPersonasTamApellidos"] = 60;                 // Tamaño de la columna Personas > Apellidos

// Variables configurables por el programador de la aplicación

$cfg["tablaPersonas"] = "personas";                   // Nombre de la tabla Personas

$pdo = conectaDb();

borraTodo();

insertaRegistro("Pepito", "Conejo");

cuentaRegistros();

muestraRegistros();

modificaRegistro(1, "Pepita", "Conejo");

muestraRegistros();

insertaRegistro("Numa", "Nigerio");

cuentaRegistros();

muestraRegistros();

borraRegistros([1 => "on"]);

muestraRegistros();

?>

PDO 3 - SQLite: programa con biblioteca

PDO 4 - MySQL: programa con biblioteca

PDO 5 - Base de datos configurable: SQLite o MySQL