Ejemplo de función levenheist


echo masParecida("tomato", ["naranja","tomate","platano","morcilla"]);
echo masParecida("marnaja", ["naranja","tomate","platano","morcilla"]);
function masParecida($entrada, $palabras) {
// no se ha encontrado la distancia más corta, aun
$distancia = -1;
$cercana = "";
// bucle a través de las palabras para encontrar la más cercana
foreach ($palabras as $palabra) {
// calcula la distancia entre la palabra de entrada y la palabra actual
$lev = levenshtein($entrada, $palabra);
// verifica por una coincidencia exacta
if ($lev == 0) {
// la palabra más cercana es esta (coincidencia exacta)
return $palabra;
}
// si esta distancia es menor que la siguiente distancia
// más corta o si una siguiente palabra más corta aun no se ha encontrado
if ($lev <= $distancia || $distancia < 0) {
$cercana = $palabra;
$distancia = $lev;
}
}
return $cercana;
}

Funciones de string en PHP categorizadas

Mayúsculas/Minúsculas (5)

  • ucfirst — Convierte el primer caracter de una cadena a mayúsculas
  • ucwords — Convierte a mayúsculas el primer caracter de cada palabra de una cadena
  • lcfirst — Pasa a minúscula el primer caracter de un string
  • strtolower — Convierte una cadena a minúsculas
  • strtoupper — Convierte un string a mayúsculas

Limpiar cadena (4)

  • trim — Elimina espacio en blanco (u otro tipo de caracteres) del inicio y el final de la cadena
  • ltrim — Retira espacios en blanco (u otros caracteres) del inicio de un string
  • rtrim — Retira los espacios en blanco (u otros caracteres) del final de un string
  • chop — Alias de rtrim

Convertir en array (7)

  • explode — Divide un string en varios string
  • str_split — Convierte un string en un array
  • implode — Une elementos de un array en un string
  • join — Alias de implode
  • strtok — Tokeniza string
  • chunk_split — Divide una cadena en trozos más pequeños
  • str_getcsv — Convierte un string con formato CSV a un array

Buscar cadenas (10)

  • strpos — Encuentra la posición de la primera ocurrencia de un substring en un string
  • strripos — Encuentra la posición de la última aparición de un substring insensible a mayúsculas y minúsculas en un string
  • strrpos — Encuentra la posición de la última aparición de un substring en un string
  • stripos — Encuentra la posición de la primera aparición de un substring en un string sin considerar mayúsculas ni minúsculas
  • strstr — Encuentra la primera aparición de un string
  • stristr — strstr insensible a mayúsculas y minúsculas
  • strchr — Alias de strstr
  • strrchr — Encuentra la última aparición de un caracter en un string
  • strpbrk — Buscar una cadena por cualquiera de los elementos de un conjunto de caracteres
  • strspn — Averigua la longitud del segmento inicial de un string que consista únicamente en caracteres contenidos dentro de una máscara dada.

Funciones de información y manipulación de cadenas (14)

  • strlen — Obtiene la longitud de un string
  • str_ireplace — Versión insensible a mayúsculas y minúsculas de str_replace
  • str_pad — Rellena un string hasta una longitud determinada con otro string
  • str_repeat — Repite un string
  • str_replace — Reemplaza todas las apariciones del string buscado con el string de reemplazo
  • str_shuffle — Reordena aleatoriamente una cadena
  • strrev — Invierte una string
  • substr_count — Cuenta el número de apariciones del substring
  • substr_replace — Reemplaza el texto dentro de una porción de un string
  • substr — Devuelve parte de una cadena
  • chr — Devuelve un caracter específico
  • ord — devuelve el valor ASCII de un caracter
  • strtr — Convierte caracteres o reemplaza substrings
  • wordwrap — Ajusta un string hasta un número dado de caracteres

Contar y formatos (7)

  • count_chars — Devuelve información sobre los caracteres usados en una cadena
  • localeconv — Obtener información sobre el formato numérico
  • money_format — Da formato a un número como un string de moneda
  • nl_langinfo — Consulta información sobre el idioma y la configuración regional
  • number_format — Formatear un número con los millares agrupados
  • str_word_count — Devuelve información sobre las palabras utilizadas en un string
  • setlocale — Establecer la información del localismo

Escapar/convertir cadenas (13)

  • addcslashes — Escapa una cadena al estilo de C
  • addslashes — Escapa un string con barras invertidas
  • html_entity_decode — Convierte todas las entidades HTML a sus caracteres correspondientes
  • htmlentities — Convierte todos los caracteres aplicables a entidades HTML
  • htmlspecialchars_decode — Convierte entidades HTML especiales de nuevo en caracteres
  • htmlspecialchars — Convierte caracteres especiales en entidades HTML
  • get_html_translation_table — Devuelve la tabla de traducción utilizada por htmlspecialchars y htmlentities
  • stripslashes — Quita las barras de un string con comillas escapadas
  • strip_tags — Retira las etiquetas HTML y PHP de un string
  • stripcslashes — Desmarca la cadena marcada con addcslashes
  • nl2br — Inserta saltos de línea HTML antes de todas las nuevas líneas de un string
  • quotemeta — Escapa meta caracteres
  • parse_str — Convierte el string en variables

Mostrar por pantalla u otros dispositivos (9)

  • echo — Muestra una o más cadenas
  • fprintf — Escribir una cadena con formato a una secuencia
  • print — Mostrar una cadena
  • printf — Imprimir una cadena con formato
  • sprintf — Devuelve un string formateado
  • vfprintf — Escribe un string con formato en un flujo
  • vprintf — Muestra una cadena con formato
  • vsprintf — Devuelve una cadena con formato
  • sscanf — Interpreta un string de entrada de acuerdo con un formato

Funciones de encriptación (9)

  • crc32 — Calcula el polinomio crc32 de una cadena
  • crypt — Hash de cadenas de un sólo sentido
  • md5_file — Calcula el resumen criptográfico md5 de un archivo dado
  • md5 — Calcula el ‘hash’ md5 de un string
  • sha1_file — Calcula el hash sha1 de un archivo
  • sha1 — Calcula el ‘hash’ sha1 de un string
  • str_rot13 — Realizar la transformación rot13 sobre una cadena
  • convert_uudecode — Descodifica una cadena codificada mediante uuencode
  • convert_uuencode — Codificar mediante uuencode una cadena

Similaridad de cadenas (4)

  • levenshtein — Cálculo de la distancia Levenshtein entre dos strings
  • similar_text — Calcula la similitud entre dos strings
  • soundex — Calcula la clave soundex de un string
  • metaphone — Calcula la clave metaphone de un string

Comparación de cadenas (9)

  • strcasecmp — Comparación de string segura a nivel binario e insensible a mayúsculas y minúsculas
  • strcmp — Comparación de string segura a nivel binario
  • strcoll — Comparación de cadenas basada en la localidad
  • strcspn — Averiguar la longitud del segmento inicial que no coincida con una máscara
  • strnatcasecmp — Comparación de strings, insensible a mayúsculas y minúsculas, utilizando un algoritmo de “orden natural”
  • strnatcmp — Comparación de strings utilizando un algoritmo de “orden natural”
  • strncasecmp — Comparación de los primeros n caracteres de cadenas, segura con material binario e insensible a mayúsculas y minúsculas
  • strncmp — Comparación segura a nivel binario de los primeros n caracteres entre strings
  • substr_compare — Comparación segura a nivel binario de dos o más strings desde un índice hasta una longitud de caracteres dada

Otros alfabetos y hexadecimal (7)

  • hex2bin — Decodifica una cadena binaria codificada hexadecimalmente
  • bin2hex — Convierte datos binarios en su representación hexadecimal
  • hebrev — Convierte texto hebreo lógico a texto visual
  • hebrevc — Convertir texto de hebreo lógico a texto visual con conversión de línea nueva
  • convert_cyr_string — Convierte de un juego de caracteres cirílico a otro juego de caracteres cirílico
  • quoted_printable_decode — Convierte un string quoted-printable en un string de 8 bits
  • quoted_printable_encode — Convierte un string de 8 bits en un string quoted-printable

Funciones de cadena en PHP

Buscar una subcadena dentro de otra. Ejemplo ‘¿Tiene una cadena la @?’:

if (strpos($_POST['email'], '@') === false) {
print 'No hay arroba (@)';
}

Ponemos ‘===’ porque si la arroba está en la posición 0 se entiende como false.

El siguiente código nos devuelve el número de apariciones de una cadena en otra:

function contarCadena($pajar, $aguja) {
    $pos = strpos($pajar, $aguja);
    $cont = 0;
    while ($pos !== false) {
        $cont++;
        $pos = strpos($pajar, $aguja, $pos + 1);
    }
    return $cont;
}

Obtener subcadenas de una cadena. Ejemplo: ‘Obtener los cuatro primeros caracteres del código’.

$substring = substr($string,$start,$length);
$codigo='ABCD123456';
$parte=substr($codigo,0,4); //$parte='ABCD'
$parte=substr($codigo,4,4); //$parte='1234'
$parte=substr($codigo,4); //$parte='123456'
$parte=substr($codigo,-4); //$parte='3456'

Ejercicio: dada una cadena obtener otra con los dos primeros caracteres y los dos últimos.

Mayúsculas y minúsculas:

print ucfirst("how do you do today?"); //Primera letra
print ucwords("the prince of wales"); //primera letra de cada palabra
print strtoupper("i'm not yelling!"); //mayúsculas
print strtolower('<a href="one.php">one</a>'); // minúsculas

Partir cadenas con explode (por separador):

$cadena="hola que tal";
$palabras=explode($cadena); //Array ( [0] => hola [1] => que [2] => tal )
echo implode("-",$palabras);//hola-que-tal

Reemplazar una cadena por otra:

echo str_replace("a", "#", "hola que tal"); //hol# que t#l

Repetir una cadena:

echo str_repeat("|-|",6); //|-||-||-||-||-||-|

Funciones ajedrez y tabla


function ajedrez($tam) {
    ?>
    <table >
        <?php
        for ($i = 0; $i < $tam; $i++) {
            ?><tr><?php
                for ($j = 0; $j < $tam; $j++) {
                    ?><td class="<?= ($i + $j) % 2 == 0 ? "" : "dark" ?>"></td><?php }
                ?></tr><?php
        }
        ?>
    </table><?php
}

function tabla($tabla) {
    ?><table>
        <?php
        for ($i = 1; $i <= 10; $i++) {
            ?>
            <tr><td><?= $i ?></td><td>x</td><td><?= $tabla ?></td>
                <td>=</td><td><?= ($i * $tabla) ?></td></tr>
            <?php
        }
        ?>
    </table><?php
}

Ejemplos PHP

Árbol de un lado:

$cadena = "*";
        for ($i = 1; $i < 10; $i++) {
            echo $cadena . "<br/>";
            $cadena = $cadena . "*";
        }

Árbol de los dos lados:

        $tam=8;
        $cadena = "";
        echo "<pre>";
        for ($i = 0; $i < $tam; $i++) {
            for ($j = 0; $j < $tam - $i; $j++) {
                echo "&nbsp;";
            }
            echo $cadena . "*" . $cadena . "<br/>";
            $cadena .= "*";
        }
        echo "</pre>";

Árbol con bolas de navidad:

        $tam=8;
        $cadena = "";
        echo "<pre>";
        for ($i = 0; $i < $tam; $i++) {
            for ($j = 0; $j < $tam - $i; $j++) {
                echo " ";
            }
            for ($j = 0; $j < $i * 2 + 1; $j++) {
                if (rand(1, 10) == 7) {
                    echo "@";
                } else {
                    echo "*";
                }
            }
            echo "<br/>";
        }
        echo "</pre>";

Tablero de ajedrez, css:

td{
    width:50px;
    height:50px;
    background-color: linen;
    border: 1px solid #BBBBBB;
}
.dark{
    background-color: black;
}

php:

 <h1>Tablero de ajedrez</h1>
        <?php
        $tam = 8;
        ?>
        <table >
            <?php
            for ($i = 0; $i < $tam; $i++) {
                ?><tr><?php
                    for ($j = 0; $j < $tam; $j++) {
                        ?><td class="<?=($i+$j)%2==0?"":"dark"?>"></td><?php }
                    ?></tr><?php
            }
            ?>
        </table>

Crear joins en base de datos

index.php:

 <h1>Camino entre tablas</h1>
        Escoja tabla:
        <form>
            <select name="bd">
                <?php
                $user = 'root';
                $pass = '';
                $server = 'localhost';

                $dbh = new PDO("mysql:host=$server", $user, $pass);
                $dbs = $dbh->query('SHOW DATABASES');

                while (( $db = $dbs->fetchColumn(0) ) !== false) {
                    echo "<option>".$db . '</option>';
                }
                ?>
            </select>
            <input type="submit" value="Enviar"></form>
        <?php
        if (!empty($_GET['bd'])){
            ?>
        <p>Seleccione las tablas origen y fin</p>
        <form action="camino.php">
            <input type="hidden" name="bd" value="<?=$_GET['bd']?>">
            <label>Origen:</label>
            <select name="origen">
                <?php
                 $dbs = $dbh->query('USE '.$_GET['bd']);
                 $dbs = $dbh->query('SHOW TABLES');
                 
                while (( $db = $dbs->fetchColumn(0) ) !== false) {
                    echo "<option>".$db . '</option>';
                }
                ?>
            </select>
            <label>Fin:</label>
            <select name="fin"><?php
                 $dbs = $dbh->query('USE '.$_GET['bd']);
                 $dbs = $dbh->query('SHOW TABLES');
                 
                while (( $db = $dbs->fetchColumn(0) ) !== false) {
                    echo "<option>".$db . '</option>';
                }
                ?></select>
             <input type="submit" value="Enviar">
        </form>
        <?php
        }

camino.php

<?php

$bd = $_GET['bd'];
$origen = $_GET['origen'];
$fin = $_GET['fin'];

$user = 'root';
$pass = '';
$server = 'localhost';

$dbh = new PDO("mysql:host=$server", $user, $pass);
$dbs = $dbh->query('use ' . $bd);

$tablas = getTables($dbh);
$tablas = setFKPaths($tablas, $dbh, $bd);

$caminos = [];
buscarCamino($origen, $fin, $origen, 0);
usort($caminos, function($a, $b) {
    return strlen($a) - strlen($b);
});
foreach ($caminos as $camino) {
    $camino = explode(",", $camino);
    echo "<h4>select * from " . $camino[0];
    for ($i = 1; $i < count($camino); $i++) {
        $c = explode("/", $camino[$i]);
        echo " join " . $c[0] . " using (" . $c[1] . ")<br/>";
    }
    echo "</h4>";
}

function getTables($dbh) {
    $tablas = [];
    $dbs = $dbh->query('SHOW TABLES');

    while (( $db = $dbs->fetchColumn(0) ) !== false) {
        $tablas[$db] = [];
    }
    return $tablas;
}

function setFKPaths($tablas, $dbh, $bd) {
    $dbs = $dbh->query("select * from information_schema.INNODB_SYS_FOREIGN where id like '$bd%'");
    $fks = $dbs->fetchAll();
    foreach ($fks as $fk) {
        $dbs = $dbh->query("select * from information_schema.INNODB_SYS_FOREIGN_COLS where id = '$fk[0]'");
        $fc = $dbs->fetchAll();
        $t1 = explode("/", $fk[1])[1];
        $t2 = explode("/", $fk[2])[1];
        $k = $fc[0][1];
        if (!in_array($t1 . "/" . $k, $tablas[$t2])) {
            $tablas[$t2][] = $t1 . "/" . $k;
        }
        if (!in_array($t2 . "/" . $k, $tablas[$t1])) {
            $tablas[$t1][] = $t2 . "/" . $k;
        }
    }
    return $tablas;
}



function buscarCamino($inicio, $fin, $camino, $prof) {
    global $caminos;
    global $tablas;

    if ($inicio == $fin) {
        $caminos[] = $camino;
        return;
    }
    foreach ($tablas[$inicio] as $destino) {
        $d = explode("/", $destino)[0];
        if (strpos($camino, "," . $d . "/") === false && strpos($camino, $d . ",") === false) {
            buscarCamino($d, $fin, $camino . "," . $destino, $prof + 1);
        }
    }
}

Mantenimento actores

sakila.php

<?php

class Sakila {

private $server = "localhost";
 private $user = "root";
 private $password = "";
 private $db = "sakila";
 public $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();
 }
 }

function getActors() {
 $sql = "select * from actor";
 $query = $this->conn->query($sql);
 return $query->fetchAll();
 }

function getActor($id) {
 $sql = "select * from actor where actor_id=$id";
 $query = $this->conn->query($sql);
 return $query->fetch();
 }

/**
 * 
 * @param type $actor array asociativo con los campos del actor
 * ejemplo: ['actor_id'=>1,'first_name'=>'Santiago','last_name'=>'Segura']
 */
 function updateActor($actor) {
 $sql = "update actor set first_name='" . $actor['first_name'] . "', last_name='" . $actor['last_name'] . "'
 where actor_id=" . $actor['actor_id'] . ";";
 $this->conn->exec($sql);
 }

function deleteActor($id) {
 $sql = "delete from actor where actor_id=$id";
 $this->conn->exec($sql);
 }

/**
 * 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";
 $st = $this->conn->prepare($sql);
 $st->execute([':first_name' => $first_name, ':last_name' => $last_name]);
 if ($actor = $st->fetch()) {
 return $actor['actor_id'];
 }
 $sql = "insert into actor (first_name,last_name) values (:first_name,:last_name)";
 $st = $this->conn->prepare($sql);
 $st->execute([':first_name' => $first_name, ':last_name' => $last_name]);
 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) {

$this->conn->beginTransaction();
 try {
 $sql = "insert into film(title,language_id) values (:film,1)";
 $st = $this->conn->prepare($sql);
 $st->execute([':film' => $film]);
 $film_id = $this->conn->lastInsertId();
 $sql = "insert into film_category(film_id,category_id) values($film_id,$category_id)";
 $this->conn->exec($sql);
 $this->conn->commit();
 } catch (PDOException $e) {
 echo $e->getMessage();
 $this->conn->rollBack();
 }
 }

/**
 * 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
 }

}

index.php

<!DOCTYPE html>

<html>
 <head>
 <meta charset="UTF-8">
 <title></title>
 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/css/bootstrap.min.css" integrity="sha384-Zug+QiDoJOrZ5t4lssLdxGhVrurbmBWopoEl+M6BdEfwnCJZtKxi1KgxUyJq13dy" crossorigin="anonymous">

</head>
 <body>
 <div class="container">
 <?php
 include "sakila.php";
 $sakila = new Sakila();

$nuevo = filter_input(INPUT_GET, 'nuevo');
 $first_name = filter_input(INPUT_GET, 'first_name');
 $last_name = filter_input(INPUT_GET, 'last_name');

if (!empty($nuevo) && !empty($first_name) && !empty($last_name)) {
 $sakila->newActor($first_name, $last_name);
 }
 $cambiar = filter_input(INPUT_GET, 'cambiar');
 $actor_id = filter_input(INPUT_GET, 'actor_id');

if (!empty($cambiar) && !empty($actor_id) && !empty($first_name) && !empty($last_name)) {
 $sakila->updateActor(['actor_id' => $actor_id, 'first_name' => $first_name, 'last_name' => $last_name]);
 }

$delete = filter_input(INPUT_POST, 'delete');
 $actor_id = filter_input(INPUT_POST, 'actor_id');

if (!empty($delete) && !empty($actor_id)) {
 $sakila->deleteActor($actor_id);
 }


 $actores = $sakila->getActors();
 ?>
 <h1>Mantenimiento actores</h1>

<form>
 <div class="form-group">
 <label for="first_name">Nombre:</label>
 <input type="text" class="form-control" name="first_name">
 </div>
 <div class="form-group">
 <label for="last_name">Apellidos:</label>
 <input type="text" class="form-control" name="last_name">
 </div>
 <input class="btn btn-success" type="submit" name="nuevo" value="Nuevo">
 </form>
 <table class="table">
 <tr><td>Nombre</td><td>Apellidos</td><td>Acciones</td></tr>
 <?php
 foreach ($actores as $actor) {
 ?>
 <tr><td><?= $actor['first_name'] ?></td><td><?= $actor['last_name'] ?></td>
 <td><a href="editar.php?actor_id=<?= $actor['actor_id'] ?>" class="btn btn-success">Editar</a>
 <form action="index.php" method="post" style="float:left;margin-right: 10px">
 <input type="hidden" name="actor_id" value="<?= $actor['actor_id'] ?>">
 <input class="btn btn-success" type="submit" name="delete" value="Borrar"> 
 </form>
 </td></tr>
 <?php
 }
 ?>
 </table>
 </div>
 </body>
</html>

editar.php

<!DOCTYPE html>

<html>
 <head>
 <meta charset="UTF-8">
 <title></title>
 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/css/bootstrap.min.css" integrity="sha384-Zug+QiDoJOrZ5t4lssLdxGhVrurbmBWopoEl+M6BdEfwnCJZtKxi1KgxUyJq13dy" crossorigin="anonymous">

</head>
 <body>
 <div class="container">
 <?php
 include "sakila.php";
 $sakila = new Sakila();


 $actor_id = filter_input(INPUT_GET, 'actor_id');

if (!empty($actor_id)) {
 $actor = $sakila->getActor($actor_id);
 }
 ?>
 <h1>Editar actor</h1>

<form action="index.php">
 <input type="hidden" class="form-control" name="actor_id" value="<?= $actor['actor_id'] ?>">
 <div class="form-group">
 <label for="first_name">Nombre:</label>
 <input type="text" class="form-control" name="first_name" value="<?= $actor['first_name'] ?>">
 </div>
 <div class="form-group">
 <label for="last_name">Apellidos:</label>
 <input type="text" class="form-control" name="last_name" value="<?= $actor['last_name'] ?>">
 </div>
 <input class="btn btn-success" type="submit" name="cambiar" value="Cambiar">
 </form>
 </div>
 </body>
</html>

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 con clases

sakila.php

<?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();
 }
 }

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);
 }

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
 }

}

index.php

<?php
 include "sakila.php";
 $sakila = new Sakila();

$category = filter_input(INPUT_GET, "category", FILTER_VALIDATE_INT);
 $film = filter_input(INPUT_GET, "film");
 if (!empty($category) && !empty($film)) {
 $sakila->newFilm($category, $film);
 }
 ?>
 <form>
 Categoría: 
 <?php $sakila->selectCategory(); ?>
 <br/>
 Película: <input type="text" name="film"><br/>
 <input type="submit">

</form>