Ejercicio actores pseudo autocompletar

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    </head>
    <body>
        Actor:<input type="text" id="actor"><br/>
        <div id="lista"></div>
        <script>
            $(function () {
                console.log("Página cargada");
                $('#actor').keyup(function () {
                    console.log("Pulsado");
                    fetch('fetch_backend.php?actor='+$('#actor').val(), {
                        method: 'GET',
                    })
                            .then(function (response) {
                                console.log(response);
                                return response.json();
                            })
                            .then(function (data) {
                                console.log('data = ', data);
                                $('#lista').html('');
                                for(i=0;i<data.length;i++){
                                    $('#lista').append(data[i]+"<br>");
                                }
                            })
                            .catch(function (err) {
                                console.error(err);
                            });
                });
            });
        </script>
    </body>
</html>

<?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);
    $actor = filter_input(INPUT_GET, "actor");
    $sql = "select * from actor "
            . "where first_name like :actor "
            . "or last_name like :actor limit 10";
    $parametros = [
        'actor' => '%' . $actor . '%'
    ];
    $st = $conn->prepare($sql);
    $st->execute($parametros);
    $resultado = [];
    while ($fila = $st->fetch()) {
        $resultado[] = $fila['first_name'] . " " . $fila['last_name'];
    }
    echo json_encode($resultado);
} catch (Exception $e) {
    echo "Connection failed: " . $e->getMessage();
}

Insertar cliente

Hay que hacer varios pasos

 $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);
    //Los datos que tengo que insertar
    $pais = 'ArgentinaJarll';
    $ciudad = "La plata";
    $direccion = "Agla 6";
    $nombre = "Juan";
    $apellidos = "Pi";
    
    //Compruebo si existe el país consultando a la base de datos si hay
    //algún país que se llame como el que me han pasado
    $sql = "select * from country where country=:country";
    $parametros = [
        'country' => $pais
    ];
    $st = $conn->prepare($sql);
    $st->execute($parametros);
    $country = $st->fetch();
    
    //Si no existe lo inserto
    if (empty($country)) {
        $sql = "insert into country(country) values(:country)";
        $st = $conn->prepare($sql);
        $st->execute($parametros);
        $country_id = $conn->lastInsertId();
    } else {
        $country_id = $country['country_id'];
    }
      //Aquí ya tengo el país
    echo $country_id . "<br/>";

  
    //Hago la misma comprobación para la ciudad pero ojo, de ese país
    $sql = "select * from city where city=:city and country_id=:country_id";
    $parametros = [
        'city' => $ciudad,
        'country_id' => $country_id
    ];
    $st = $conn->prepare($sql);
    $st->execute($parametros);
    $city = $st->fetch();
    
    //Si no existe la ciudad la inserto
    if (empty($city)) {
        $sql = "insert into city(city,country_id) values(:city,:country_id)";
        $st = $conn->prepare($sql);
        $st->execute($parametros);
        $city_id = $conn->lastInsertId();
    } else {
        $city_id = $city['city_id'];
    }
    //Aquí ya tengo el id de la ciudad
    echo $city_id . "<br>";

    //A partir de aquí no compruebo más. Inserto la dirección con esa ciudad
    $sql = "insert into address (city_id,address) values (:city_id,:address)";
    $parametros = [
        'city_id' => $city_id,
        'address' => $direccion
    ];
    $st = $conn->prepare($sql);
    $st->execute($parametros);
    //Recupero el id de de esa dirección
    $address_id = $conn->lastInsertId();
    
    //Inserto el cliente con el id de la dirección y en store_id pongo un 1 directamente
    $sql = "insert into customer (address_id,first_name,last_name,store_id)"
            . " values (:address_id,:first_name,:last_name,1)";
    $parametros = [
        'address_id' => $address_id,
        'first_name' => $nombre,
        'last_name' => $apellidos
    ];
    $st = $conn->prepare($sql);
    $st->execute($parametros);
    echo "insertado el cliente con id ".$conn->lastInsertId();
} catch (Exception $e) {
    echo "Connection failed: " . $e->getMessage();
}

Ejercicios prepare

Poner el código que me permita insertar un país (country)

Poner el código para ver todos los actores que hayan trabajado en películas de rating ‘r’

Poner el código que cambie todos los pagos del cliente ‘593’ al cliente ‘594’

Poner el código para ver todos los clientes de Argentina (fisr_name y last_name)

Poner el código para ver todas las películas que traten de gatos (cat en description)

$sql = "insert into country (country) values (:country)";
    $parametros = [
        'country' => 'Lalalalalandia'
    ];
    $st = $conn->prepare($sql);
    $st->execute($parametros);
	
	  $sql = "select distinct first_name, last_name from film join film_actor using(film_id)
join actor using(actor_id)
where rating=:rating
order by first_name,last_name";
    $parametros = [
        'rating' => 'R'
    ];
    $st = $conn->prepare($sql);
    $st->execute($parametros);
    while ($fila = $st->fetch()) {
        echo $fila['first_name'] . " " . $fila['last_name'] . "<br/>";
    }
	
	
	 $sql = "SELECT distinct first_name,last_name FROM country join city using(country_id) join address using(city_id)
join customer using(address_id) where country=:country";
    $parametros = [
        'country' => 'Argentina'
    ];
    $st = $conn->prepare($sql);
    echo $st->execute($parametros);
    $clientes = $st->fetchAll();
    foreach($clientes as $cliente){
        echo $cliente['first_name']." ".$cliente['last_name']."<br/>";
    }
	
	  $sql = "select title from film where description like :tema";
    $parametros = [
        'tema' => '%cat%'
    ];
    $st = $conn->prepare($sql);
    $st->execute($parametros);
    while ($fila = $st->fetch()) {
        echo $fila['title'] . "<br/>";
    }

Ejemplos prepare

$sql="insert into actor (first_name,last_name) values (:first_name,:last_name)";
    $parametros=[
      'first_name'=>'Perico',
      'last_name'=>'De los palotes'
    ];
    $st=$conn->prepare($sql);
    $st->execute($parametros);
 $sql="SELECT city FROM country join city using(country_id) where country=:country";
   $parametros=[
       'country'=>'Argentina'
   ];
   $st=$conn->prepare($sql);
   $st->execute($parametros);
   $ciudades=$st->fetchAll();
   print_r($ciudades);
  $sql="SELECT country FROM country  where country like :country";
   $parametros=[
       'country'=>'%ar%'
   ];
   $st=$conn->prepare($sql);
   $st->execute($parametros);
   $paises=$st->fetchAll();
   print_r($paises);
 $sql = "SELECT * FROM customer join address using(address_id)
            where email=:email and phone=:phone";
   
  $parametros=[
        'email'=>'mary.smith@sakilacustomer.org',
        'phone'=>'28303384290'
    ];
    $st=$conn->prepare($sql);
    $st->execute($parametros);
    $cliente=$st->fetch();
    if (empty($cliente)){
        echo "No sé quién eres";
    } else{
        echo "hola ".$cliente['first_name'];
    }

    $sql="update film set replacement_cost=replacement_cost*:descuento where rating=:rating";
    $parametros=[
        'descuento'=>0.9,
        'rating'=>'R'
    ];
    $st=$conn->prepare($sql);
    $st->execute($parametros);

Ejercicio Ajax

Hacer un backend al que le pasemos por POST dos parámetros:
Importe y Plazos
El Backend creará una tabla con tantos elementos como plazo y los valores serán:

primer elemento: Importe/plazo*1.2
Segundo: Importe/plazo*1.2
Tercero: Importe/plazo*1.1
Cuarto: Importe/Plazo*1.1
Resto: Importe/Plazo

El backend devuelve la tabla como JSON

Tendremos un fronend con dos campos: Importe y Plazos y un botón de calcular. Cuando le de a calcular llamará al backend, recuperará la tabla, la convertirá a tabla de javascript y la imprimirá como una lista (ul) en un div.

$importe = filter_input(INPUT_POST, "importe");
$plazo = filter_input(INPUT_POST, "plazos");

$tabla = [];

$cantidad = $importe / $plazo;
for ($i = 0; $i < $plazo; $i++) {
    if ($i < 2) {
        $tabla[] = round($cantidad * 1.2,2);
    } elseif ($i < 4) {
        $tabla[] = round($cantidad * 1.1,2);
    } else {
        $tabla[] = round($cantidad,2);
    }
}
/*
array_walk($tabla, function(&$valor){
    $valor= round($valor,2);
});*/
echo json_encode($tabla);
  Importe:<input type="text" id="importe"><br/>
        Plazos:<input type="text" id="plazos"><br/>
        <button id="ajax">Pulsa aquí para probar el ajax</button>
        <div id="resultado"></div>
        <script>
        $(function(){
           console.log("Página cargada"); 
           $('#ajax').click(function(){
               console.log("Pulsado");
               $.post("ajax_backend.php",
               {"importe":$("#importe").val(),
               "plazos":$("#plazos").val()},
               function(data){
                   console.log("resultado "+data);
                  var objeto=JSON.parse(data);
                  $('#resultado').html("<ul>");
                  for(prop in objeto){
                      $('#resultado').append("<li>"+objeto[prop]+"</li>");
                  }
                   $('#resultado').append("</Ul>");
               });
           });
        });
        </script>

Ajax con post y objetos

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
     
    </head>
    <body>
        Nombre:<input type="text" id="first_name"><br/>
        Apellidos:<input type="text" id="last_name"><br/>
        <button id="ajax">Pulsa aquí para probar el ajax</button>
        <div id="resultado"></div>
        <script>
        $(function(){
           console.log("Página cargada"); 
           $('#ajax').click(function(){
               console.log("Pulsado");
               $.post("ejemplo_ajax_backend.php",
               {"first_name":$("#first_name").val(),
               "last_name":$("#last_name").val()},
               function(data){
                   console.log("resultado "+data);
                  var objeto=JSON.parse(data);
                  for(prop in objeto){
                      $('#resultado').append(prop + " - "+objeto[prop]+"<br/>");
                  }
               });
           });
        });
        </script>
    </body>
</html>
<?php

$first_name= filter_input(INPUT_POST, "first_name");
$last_name= filter_input(INPUT_POST, "last_name");

$res=["Nombre"=>$first_name,"Apellidos"=>$last_name];

echo json_encode($res);

Ajax un poco menos simple

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
     
    </head>
    <body>
        <button id="ajax">Pulsa aquí para probar el ajax</button>
        <div id="resultado"></div>
        <script>
        $(function(){
           console.log("Página cargada"); 
           $('#ajax').click(function(){
               console.log("Pulsado");
               $.get("ejemplo_ajax_backend.php?tam=10",function(data){
                   console.log("resultado "+data);
                  var tabla=JSON.parse(data);
                  console.log(tabla);
                  for(i=0;i<tabla.length;i++){
                      $('#resultado').append(tabla[i]+"<br/>");
                  }
               });
           });
        });
        </script>
    </body>
</html>

<?php

$lista=[];
$tam= filter_input(INPUT_GET, "tam",FILTER_SANITIZE_NUMBER_INT);
for($i=0;$i<$tam;$i++){
   $lista[]= str_repeat("*", mt_rand(1,20)); 
}
echo json_encode($lista);

Ajax simple

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
     
    </head>
    <body>
        <button id="ajax">Pulsa aquí para probar el ajax</button>
        <div id="resultado"></div>
        <script>
        $(function(){
           console.log("Página cargada"); 
           $('#ajax').click(function(){
               console.log("Pulsado");
               $.get("ejemplo_ajax_backend.php",function(data){
                   console.log("resultado "+data);
                   $('#resultado').append(data+"<br/>");
               });
           });
        });
        </script>
    </body>
</html>
<?php
echo mt_rand(1,10);

CRUD AJAX

actores_ajax (html)

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <script src="actores.js" type="text/javascript"></script>
    </head>

    <body>
        <p>Nombre<input type="text" id="first_name" name="first_name"></p>
        <p>Apellidos<input type="text"  id="last_name" name="last_name"></p>
        <input type="button" value="Añadir" id="nuevo">
        <div id="mensaje"></div>
        <div id="lista"></div>
    </body>
</html>

actores.js (ajax)

$(function () {
    cargar();
    function cargar() {
        $.get("actores_ajax_back.php?funcion=lista", function (data) {
            $("#lista").html(data);
            $(".borrar").click(function () {
                console.log($(this));
                console.log($(this).val());
                $.post("actores_ajax_back.php?funcion=borrar",
                        {actor_id: $(this).val()})
                        .done(function (data) {
                            console.log(data);
                            $('#mensaje').html("Borrado");
                            cargar();
                        });
            });
        });
    }
    $("#nuevo").click(function () {
        $.post("actores_ajax_back.php?funcion=nuevo",
                {first_name: $('#first_name').val(), last_name: $('#last_name').val()})
                .done(function (data) {
                    $('#mensaje').html("Insertado con id " + data);
                    cargar();
                });
    });

});

actores_ajax_back.php (backend)

<?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);
} catch (Exception $e) {
    echo "Connection failed: " . $e->getMessage();
}
$funcion = filter_input(INPUT_GET, "funcion");

if (function_exists($funcion)) {
    $funcion($conn);
}

function lista($conn) {
    try {
        $sql = "select * from actor";
        $q = $conn->query($sql);
        ?>
        <table>
            <tr><td>Id</td><td>Nombre</td><td>Apellido</td><td>Acciones</td>
            </tr>
            <?php
            while ($row = $q->fetch()) {
                ?> 
                <tr><td><?= $row['actor_id'] ?></td>
                    <td><?= $row['first_name'] ?></td>
                    <td><?= $row['last_name'] ?></td>
                    <td><button class="borrar" value="<?= $row['actor_id'] ?>">Borrar</button></td>
                </tr>
                <?php
            }
            ?></table><?php
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
}

function nuevo($conn) {
    try {
        $first_name = filter_input(INPUT_POST, "first_name", FILTER_SANITIZE_MAGIC_QUOTES);
        $last_name = filter_input(INPUT_POST, "last_name", FILTER_SANITIZE_MAGIC_QUOTES);
        if (!empty($first_name) && !empty($last_name)) {
            $sql = "insert into actor(first_name,last_name) values ('$first_name','$last_name')";
            //Ejecutarlo
            if ($conn->exec($sql) > 0) {
                echo $conn->lastInsertId();
            }
        }
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
}
function borrar($conn) {
    try {
        $actor_id = filter_input(INPUT_POST, "actor_id");
         if (!empty($actor_id) ) {
            $sql = "delete from actor where actor_id=$actor_id";
            //Ejecutarlo
            echo $conn->exec($sql);
        }
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
}