Ir al contenido principal

Lección 6 · Autoevaluación

Cómo se usa

Esta página cubre todo lo de la lección 6: conexión con PDO, consultas preparadas, lectura, inserción y transacciones.

Hay 9 preguntas y 3 ejercicios, con corrección inmediata.

Preguntas

Todavía sin contestar · 9 preguntas

La conexión

1. ¿Qué indica el DSN mysql:host=localhost;dbname=tienda;charset=utf8mb4?

Elegí una opción para verla

El DSN dice con qué motor hablar (mysql), en qué servidor, qué base y con qué codificación.

2. ¿Para qué sirve PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION?

Elegí una opción para verla

Hace que un error de base lance una excepción. Sin eso, una consulta puede fallar y el programa seguir como si nada.

3. ¿Por qué la conexión va en un archivo aparte?

Elegí una opción para verla

Para tener los datos de acceso en un solo lugar, traerla con require y no repetir credenciales.

Consultas preparadas

4. ¿Cuál está protegida contra inyección SQL?

Elegí una opción para verla

Solo la consulta preparada: el valor viaja aparte y nunca se interpreta como SQL.

5. ¿Qué pasaría con ' OR '1'='1 en un login vulnerable?

Elegí una opción para verla

Se altera la consulta: la condición siempre verdadera devuelve filas y permite entrar sin credenciales válidas. Eso es inyección SQL.

6. ¿Qué diferencia hay entre ? y :nombre?

Elegí una opción para verla

Son dos estilos de marcador, igual de seguros: ? posicional y :nombre con nombre. Este último es más claro cuando hay varios parámetros.

Leer, insertar y transacciones

7. ¿Qué devuelve fetch() cuando ya no hay más filas?

Elegí una opción para verla

Devuelve false. Por eso se recorre con while ($fila = $consulta->fetch()).

8. ¿Para qué sirve lastInsertId()?

Elegí una opción para verla

Devuelve el id que generó la última inserción; sirve, por ejemplo, para enlazar el detalle de una venta con su cabecera.

9. ¿Qué garantiza una transacción?

Elegí una opción para verla

Que el conjunto sea atómico: si algo falla, rollBack() deshace todo y no queda una venta sin detalle ni un stock mal descontado.

Ejercicios de práctica

Ejercicio 1

Escribí el archivo conexion.php con PDO, DSN mysql y las dos opciones de atributos.

<?php
$pdo = new PDO(
    "mysql:host=localhost;dbname=tienda;charset=utf8mb4",
    "root",
    "",
    [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]
);

Ejercicio 2

Escribí una consulta preparada que busque un producto por nombre y muestre su precio.

$c = $pdo->prepare('SELECT * FROM productos WHERE nombre = ?');
$c->execute([$nombre]);
$producto = $c->fetchAll();

foreach ($producto as $p) {
    echo $p['precio'];
}

Ejercicio 3

Armá una transacción que inserte una venta y después lance una excepción a propósito. Explicá qué pasa.

Al lanzarse la excepción, el catch ejecuta rollBack() y la venta no se guarda: la base queda como antes. Eso es lo que garantiza la transacción.

$pdo->beginTransaction();

try {
    $pdo->exec("INSERT INTO ventas (fecha, total) VALUES (CURDATE(), 100)");
    throw new RuntimeException('falló');
    $pdo->commit();
} catch (Throwable $e) {
    $pdo->rollBack();
}

Cómo saber si está bien

Si acertaste 7 o más, la lección está firme. Si fallaste en consultas preparadas, volvé a esa sección: es la base de la seguridad del sistema.

Lo que hay que poder explicar

  • El DSN dice gestor, servidor, base y codificación.
  • ERRMODE_EXCEPTION hace que los errores avisen.
  • Siempre consultas preparadas.
  • fetch una fila, fetchAll todas.
  • lastInsertId da el id nuevo.
  • Transacción = todo o nada.

Licencia. El material de esta página es elaboración propia de Prof Mauro Bobyk —a partir de las fuentes que detalla el pie del sitio— y se publica bajo una licencia Creative Commons BY-NC-SA 4.0.