Ejercicio Tienda

Vamos a crear una clase para rellenar elementos de la tienda, se llamará testTienda

En la clase tendremos un constructor que se conectará a la base de datos automáticamente (igual a como lo hemos estado haciendo).

Tendrá un método addCategorias(numero) que nos añadirá el número de categorías que le pongamos (por defecto 5). Con los nombres ‘Categoria1’, ‘Categoria2’,…

Tendrá un método addProductos(idCategoria,numero) que nos añadirá el número de productos que le pongamos (por defecto 5). Con los nombres ‘Producto1’, ‘Producto2’… el precio a cero y la categoría que le pasemos.

Tendrá un método addCatProd(categoria, producto) que pasándole el nombre de una categoría y el nombre de un producto nos añada a la base de datos esa categoría y ese producto haciendo que pertenezca a esa categoría.


class testTienda {

private $server = "localhost";
private $user = "root";
private $password = "";
private $db = "tienda_jp";
protected $conn;

function __construct() {
try {
$this->conn = new PDO("mysql:host=$this->server;dbname=$this->db;charset=UTF8", $this->user, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
throw new Exception("Connection failed: " . $e->getMessage());
}
}

function addCategorias($numero = 5) {
try {
for ($i = 1; $i <= $numero; $i++) {
$sql = "insert into categorias (nombre) values ('Categoría$i')";
$this->conn->exec($sql);
}
} catch (Exception $ex) {
echo $ex->getMessage();
}
}

function addProducto($idCategoria, $numero = 5) {
try {

$sql = "insert into productos (nombre,idcategoria) values (:nombre,:idcategoria)";
$st = $this->conn->prepare($sql);
for ($i = 1; $i <= $numero; $i++) {
$st->execute(['nombre' => "Producto$i", "idcategoria" => $idCategoria]);
}
} catch (Exception $ex) {
echo $ex->getMessage();
}
}

function addCatProd($producto, $categoria) {
try {
$sql = "insert into categorias (nombre) values (:nombre)";
$st = $this->conn->prepare($sql);
$st->execute(['nombre' => $categoria]);
$id = $this->conn->lastInsertId();
$sql = "insert into productos (nombre,idcategoria) values (:nombre,:idcategoria)";
$st = $this->conn->prepare($sql);
$st->execute(['nombre' => $producto, "idcategoria" => $id]);
} catch (Exception $ex) {
echo $ex->getMessage();
}
}

}

Acceso a datos con PDO

Conectar al servidor:

 $server = "localhost";
 $user = "root";
 $password = "";
 $db = "sakila";
 try {
     $conn = new PDO("mysql:host=$server;dbname=$db;charset=UTF8", $user, $password);
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 } catch (Exception $e) {
      echo "Connection failed: " . $e->getMessage();
 }

Ejecutar una consulta de acción (también funcionaría con query):

$sql = "update category set name='$nombre' where category_id=$category_id";
            if ($conn->exec($sql) === true) {...}

Recorrer los registros:

$sql = "select * from category ";
$resul = $conn->query($sql);
if ($resul->rowCount()>0) {
  while ($row = $resul->fetch()) {
...
}
}

Obtener todos los registros de una sola vez:

$sql = "select * from category ";
$resul = $conn->query($sql);
$rows=$resul->fetchAll()

Insertar y obtener el último id:

 $sql = "insert into category (name) values ('" . addslashes($nombre) . "')";
            if ($conn->query($sql) == true) {
                $last_id = $conn->lastInsertId();
                echo "Insertada categoría $nombre con id " . $last_id;
            } else {
                echo "Error " . $conn->error;
            }

Enlazar resultados con variables:

$row = $conn->query('SELECT first_name,last_name from actor');
$row->bindColumn('first_name', $nombre);

$row->bindColumn(2, $apellido);
while ($row->fetch()) {
    print "$nombre $apellido. 
\n";
}

Preparar sentencias y luego pasar valores:

$st = $conn->prepare('INSERT INTO actor (first_name,last_name) VALUES (?,?)');
$st->execute(array('Vito','Corleone'));
$st->execute(array('Juan','Perez'));

$st = $conn->prepare('select * from actor where actor_id>?');
$st->execute(array(50));
print_r($st->fetchAll());

Pasar valores con nombre:

$st = $conn->prepare('select * from actor where first_name like :first_name');
$st->execute(array(':first_name'=>'%z%'));

Enlazar parámetros con variables:

$actores=['juan'=>'perez','ana'=>'pi','rosa'=>'buj'];
$st = $conn->prepare('insert into actor (first_name,last_name) values(:first_name,:last_name)');
$st->bindParam(':first_name', $first_name);
$st->bindparam(':last_name', $last_name);
foreach($actores as $first_name=>$last_name){
$st->execute();
}

Número de filas (Ojo, no funciona en todas las bases de datos):

$resul->rowCount()

Ejecutar con arrays:

 $sentencia = $conn->prepare("INSERT INTO actor( first_name,last_name) VALUES (?,?)");
 $sentencia->execute(array('asd','dsa'));

 $sentencia = $conn->prepare("INSERT INTO actor( first_name,last_name) VALUES (:f,:l)");
 $sentencia->execute(array('f'=>'asd','l'=>'dsa'));

Enlace manual php:

http://php.net/manual/es/pdo.prepared-statements.php

Tutorial de PDO

Un ejemplo:

<body>
        <form action="#">
            País:
            <input type="text" name="pais">
            <input type="submit">
        </form>
        <?php
        $server = "localhost";
        $user = "root";
        $password = "";
        $db = "sakila";
        try {
            $conn = new PDO("mysql:host=$server;dbname=$db;charset=UTF8", $user, $password);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          //Para insertar, recupero el pais de GET y si hay país lo inserto
            $pais = filter_input(INPUT_GET, "pais", FILTER_SANITIZE_MAGIC_QUOTES);
            if (!empty($pais)) {
                $sql = "insert into country (country) values('$pais')";
                if ($conn->exec($sql) > 0) {
                    echo "Registro insertado<br/>";
                }
            }
            $sql = "select * from country ORDER BY COUNTRY_ID DESC";
            $q = $conn->query($sql);
            while ($row = $q->fetch()) {

                echo $row['country_id'] . "-" . $row['country'] . "<br>";
            }
        } catch (Exception $e) {
            echo "Connection failed: " . $e->getMessage();
        }
        ?>
    </body>

CRUD actores Sakila

Index.php

     <h1>Mantenimiento actores de Sakila</h1>
        <form>
            <input type="hidden" name="action" value="insert">
            Nombre:<input type="text" name="first_name">
            Apellidos:<input type="text" name="last_name">
            <input type="submit" class="btn btn-info">
        </form>
        <table class="table">
            <tr><td>Id</td><td>Nombre</td><td>Apellidos</td><td>Acciones</td></tr>
            <?php
            $server = "localhost";
            $user = "root";
            $password = "";
            $db = "sakila";
            $action = filter_input(INPUT_GET, 'action');
            $last_name = filter_input(INPUT_GET, 'last_name', FILTER_SANITIZE_STRING);
            $first_name = filter_input(INPUT_GET, 'first_name', FILTER_SANITIZE_STRING);
            $actor_id = filter_input(INPUT_GET, 'actor_id', FILTER_VALIDATE_INT);
            try {
                $conn = new PDO("mysql:host=$server;dbname=$db", $user, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                //Acciones sobre la base de datos
                if ($action == 'insert' && !empty($first_name) && !empty($last_name)) {
                    $sql = "insert into actor (first_name, last_name) values ('$first_name','$last_name')";
                    $conn->exec($sql);
                }
                if ($action == "delete" && !empty($actor_id)) {
                    $sql = "delete from actor where actor_id=$actor_id";
                    $conn->exec($sql);
                }
                if ($action == 'update' && !empty($first_name) && !empty($last_name) && !empty($actor_id)) {
                    $sql = "update actor set first_name='$first_name', last_name='$last_name' where actor_id=$actor_id";
                    $conn->exec($sql);
                }

                $sql = "select * from actor";
                $resul = $conn->query($sql);
                while ($fila = $resul->fetch(PDO::FETCH_ASSOC)) {
                    ?>
                    <tr><td><?= $fila['actor_id'] ?></td>
                        <td><?= $fila['first_name'] ?></td>
                        <td><?= $fila['last_name'] ?></td>
                        <td><a href="?action=delete&actor_id=<?= $fila['actor_id'] ?>">Borrar</a>
                            <a href="update.php?actor_id=<?= $fila['actor_id'] ?>">Editar</a></td></tr>

                    <?php
                }
            } catch (Exception $ex) {
                echo "Ha ocurrido un error<br/>" . $ex->getMessage();
            }
            ?></table>

update.php

  <h1>Editar actor</h1>
        <?php
        $server = "localhost";
        $user = "root";
        $password = "";
        $db = "sakila";
        $actor_id = filter_input(INPUT_GET, 'actor_id', FILTER_VALIDATE_INT);
        if (!empty($actor_id)) {
            try {
                $conn = new PDO("mysql:host=$server;dbname=$db", $user, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $sql = "select * from actor where actor_id=$actor_id";
                $resul=$conn->query($sql);
                $fila=$resul->fetch();
            } catch (Exception $ex) {
                echo "Ha ocurrido un error<br/>" . $ex->getMessage();
            }
        }
        ?>
        <form action="index.php">
             <input type="hidden" name="action" value="update">
             <input type="hidden" name="actor_id" value="<?=$actor_id?>">
            Nombre:<input type="text" name="first_name" value="<?=$fila['first_name']?>">
            Apellidos:<input type="text" name="last_name" value="<?=$fila['last_name']?>">
            <input type="submit" class="btn btn-info">
        </form>

final.php

 <h1>Consulta actores de Sakila</h1>
        <form>
            Nombre:<input type="text" name="first_name">
            Apellidos:<input type="text" name="last_name">
            <input type="submit" class="btn btn-info" value="Buscar">
        </form>
        <table class="table">
            <tr><td>Id</td><td>Nombre</td><td>Apellidos</td></tr>
            <?php
            $server = "localhost";
            $user = "root";
            $password = "";
            $db = "sakila";
            $last_name = filter_input(INPUT_GET, 'last_name', FILTER_SANITIZE_STRING);
            $first_name = filter_input(INPUT_GET, 'first_name', FILTER_SANITIZE_STRING);
            try {
                $conn = new PDO("mysql:host=$server;dbname=$db", $user, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


                $sql = "select * from actor where 1";
                if (!empty($first_name)){
                    $sql.=" and first_name like '%$first_name%'";
                }
                if (!empty($last_name)){
                    $sql.=" and last_name like '%$last_name%'";
                }
                $resul = $conn->query($sql);
                while ($fila = $resul->fetch(PDO::FETCH_ASSOC)) {
                    ?>
                    <tr><td><?= $fila['actor_id'] ?></td>
                        <td><?= $fila['first_name'] ?></td>
                        <td><?= $fila['last_name'] ?></td>
                    </tr>

                    <?php
                }
            } catch (Exception $ex) {
                echo "Ha ocurrido un error<br/>" . $ex->getMessage();
            }
            ?></table>

Clase sakila

<?php

class Sakila {

private $server = "localhost";
 private $user = "root";
 private $password = "";
 private $db = "sakila";
 private $conn;

function __construct() {
 try {
 $this->conn = new PDO("mysql:host=$this->server;dbname=$this->db", $this->user, $this->password);
 $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$this->conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
 $this->conn->exec("SET CHARACTER SET utf8");
 } catch (PDOException $e) {
 echo "Connection failed: " . $e->getMessage();
 }
 }

/**
 * Inserta un nuevo actor o devuelve el id si ya existe
 * @param string valor de first_name
 * @param string valor de last_name
 * @return int id
 */
 function newActor($first_name, $last_name) {
 if (!empty($first_name) && !empty($last_name)) {
 $sql = "select * from actor where first_name='$first_name' and last_name='$last_name'";
 $c = $this->conn->query($sql);
 if ($actor = $c->fetch()) {
 return $actor['actor_id'];
 }
 $sql = "insert into actor (first_name,last_name) values ('$first_name','$last_name')";
 $this->conn->exec($sql);
 return $this->conn->lastInsertId();
 } else {
 return null;
 }
 }

/**
 * Inserta una película en una categoría
 * @param int id de la categoría
 * @param string título de la película
 */
 function newFilm($category_id, $film) {

$sql = "insert into film(title,language_id) values ('$film',1)";
 $this->conn->exec($sql);
 $film_id = $this->conn->lastInsertId();
 $sql = "insert into film_category(film_id,category_id) values($film_id,$category_id)";
 $this->conn->exec($sql);
 }

/**
 * Crea un select con todas las categorías
 */
 function selectCategory() {
 $sql = "select * from category";
 $q = $this->conn->query($sql);
 $categorias = $q->fetchAll();
 ?>
 <select name="category">
 <?php foreach ($categorias as $categoria) {
 ?>
 <option value="<?= $categoria['category_id'] ?>"><?= $categoria['name'] ?></option>
 <?php } ?>
 </select>
 <?php
 }

}

Añadir película y categoría

<?php
 $server = "localhost";
 $user = "root";
 $password = "";
 $db = "sakila";

try {
 $conn = new PDO("mysql:host=$server;dbname=$db", $user, $password);
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
 $conn->exec("SET CHARACTER SET utf8");

$category = filter_input(INPUT_GET, "category", FILTER_VALIDATE_INT);
 $film = filter_input(INPUT_GET, "film");
 if (!empty($category) && !empty($film)) {
 $sql="insert into film(title,language_id) values ('$film',1)";
 $conn->exec($sql);
 $film_id=$conn->lastInsertId();
 $sql="insert into film_category(film_id,category_id) values($film_id,$category)";
 $conn->exec($sql);
 }

$sql = "select * from category";
 $q = $conn->query($sql);
 $categorias = $q->fetchAll();
 } catch (PDOException $e) {
 echo "Connection failed: " . $e->getMessage();
 }
 ?>
 <form>
 Categoría: 
 <select name="category">
 <?php foreach ($categorias as $categoria) {
 ?>
 <option value="<?= $categoria['category_id'] ?>"><?= $categoria['name'] ?></option>
 <?php } ?>
 </select>
 <br/>
 Película: <input type="text" name="film"><br/>
 <input type="submit">

</form>