Reconocimiento de voz para consultar una base de datos - Otras variantes en la aplicación

Haremos una serie de modificaciones a nuestra aplicación de reconocimiento de voz luego de haber visto la estructura fundamental en los conceptos anteriores, ésto nos servirá para identificar que partes de la aplicación se deben modificar.

Algoritmos a implementar.

  1. Modificar el acceso a datos utilizando la librería PDO.

    Hay que hacer cambios en todos los archivos que accedemos a datos de MySQL.

    conexion.php
    <?php
    
    function retornarConexion() {
        $server="localhost";
        $usuario="root";
        $clave="";
        $base="base1";
        return new PDO("mysql:dbname=$base;host=$server", "$usuario","$clave", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
    }
    
    ?>
    
    consulta.php
    <?php
    
    header('Content-Type: application/json');
    require("conexion.php");
    
    $_GET['oracion'] = eliminarAcentos($_GET['oracion']);
    $_GET['oracion'] = strtolower($_GET['oracion']);
    
    //Tablas que se pueden analizar
    $tablas = array("clientes", "productos", "facturas", "categorias");
    $tablaconsulta = "";
    $palabras = explode(" ", $_GET['oracion']);
    foreach ($palabras as $palabra) {
        if (in_array($palabra, $tablas)) {
            $tablaconsulta = $palabra;
        }
    }
    
    quePuedoPreguntar();
    
    require("reconocimiento/facturas.php");
    consultasSobreFacturas();
    require("reconocimiento/clientes.php");
    consultasSobreClientes();
    require("reconocimiento/productos.php");
    consultasSobreProductos();
    
    switch ($tablaconsulta) {
        case 'clientes':
            clientes();
            break;
    
        case 'productos':
            productos();
            break;
    
        case 'categorias':
            categorias();
            break;
    
        case 'facturas':
            facturas();
            break;
    }
    
    //------------------ Fin del bloque principal del programa --------------------------------------//
    
    function quePuedoPreguntar()
    {
        if ($_GET['oracion'] == 'que puedo preguntar') {
            mostrarPreguntas();
        }
        if ($_GET['oracion'] == 'que puedo preguntar de clientes') {
            mostrarPreguntasClientes();
        }
        if ($_GET['oracion'] == 'que puedo preguntar de productos') {
            mostrarPreguntasProductos();
        }
    }
    
    function clientes()
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("select codigo,nombre,telefono,mail,direccion from clientes");
        $sql->execute();
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
    }
    
    function productos()
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("select pro.codigo as `codigo de producto`,
                                     pro.descripcion as `descripcion de producto`,
                                     precio,
                                     ca.descripcion as categoria
                                   from productos as pro
                                   join categorias as ca on ca.codigo=pro.codigocategoria");
        $sql->execute();
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
    }
    
    function categorias()
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("select codigo,descripcion from categorias");
        $sql->execute();
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
    }
    
    function facturas()
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
            select 
                      fact.codigo as codigo,
                      date_format(fecha,'%d/%m/%Y') as fecha,
                      nombre,
                      round(sum(deta.precio*deta.cantidad),2) as importefactura
                  from facturas as fact 
                  join clientes as cli on cli.codigo=fact.codigocliente
                  join detallefactura as deta on deta.codigofactura=fact.codigo
                  group by deta.codigofactura
                  order by codigo desc"        
        );
        $sql->execute();
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);    
    }
    
    function mostrarPreguntas()
    {
        echo '
        [{"pregunta":"\"que puedo preguntar\""},
         {"pregunta":"listado de \"productos\""},
         {"pregunta":"listado de \"clientes\""},
         {"pregunta":"listado de \"facturas\""},
         {"pregunta":"listado de \"categorias\""},
         {"pregunta":"\"factura de\" (apellido y nombre)"},
         {"pregunta":"\"facturas de\" (apellido y nombre)"},
         {"pregunta":"\"factura con importe menor a\" (importe)"},
         {"pregunta":"\"facturas con importe menor a\" (importe)"},
         {"pregunta":"\"factura con importe mayor a\" (importe)"},
         {"pregunta":"\"facturas con importe mayor a\" (importe)"},      
         {"pregunta":"\"factura numero \" (numero)"},
         {"pregunta":"\"facturas numero \" (numero)"},
         {"pregunta":"\"mail de\" (apellido y nombre)"},
         {"pregunta":"\"telefono de\" (apellido y nombre)"},
         {"pregunta":"\"direccion de\" (apellido y nombre)"},          
         {"pregunta":"\"todos los datos de\" (apellido y nombre)"},
         {"pregunta":"\"producto numero\" (numero)"},
         {"pregunta":"\"precios de\" (nombre de cateroría)"}
        ]';
        exit(0);
    }
    
    
    function mostrarPreguntasClientes()
    {
        echo '
        [
         {"pregunta":"listado de \"clientes\""},
         {"pregunta":"\"factura de\" (apellido y nombre)"},
         {"pregunta":"\"facturas de\" (apellido y nombre)"},
         {"pregunta":"\"mail de\" (apellido y nombre)"},
         {"pregunta":"\"telefono de\" (apellido y nombre)"},
         {"pregunta":"\"direccion de\" (apellido y nombre)"},     
         {"pregunta":"\"todos los datos de\" (apellido y nombre)"}
        ]';
        exit(0);
    }
    
    function mostrarPreguntasProductos()
    {
        echo '
        [
            {"pregunta":"\"producto numero\" (numero)"},
            {"pregunta":"\"precios de\" (nombre de cateroría)"}   
        ]';
        exit(0);
    }
    
    function eliminarAcentos($oracion)
    {
        $oracion = str_replace('á', 'a', $oracion);
        $oracion = str_replace('é', 'e', $oracion);
        $oracion = str_replace('í', 'i', $oracion);
        $oracion = str_replace('ó', 'o', $oracion);
        $oracion = str_replace('ú', 'u', $oracion);
        return $oracion;
    }
    
    clientes.php
    <?php
    //******************************Consultas sobre clientes */
    function consultasSobreClientes()
    {
        global $palabras;
        if (strpos($_GET['oracion'], "mail de") !== false ) {
            $nombres = '';
            for ($inicio = 2; $inicio < count($palabras); $inicio++) {
                $nombres .= $palabras[$inicio] . " ";
            }
            mailDe(trim($nombres));
        }
        if (strpos($_GET['oracion'], "telefono de") !== false ) {
            $nombres = '';
            for ($inicio = 2; $inicio < count($palabras); $inicio++) {
                $nombres .= $palabras[$inicio] . " ";
            }
            telefonoDe(trim($nombres));
        }    
        if (strpos($_GET['oracion'], "direccion de") !== false ) {
            $nombres = '';
            for ($inicio = 2; $inicio < count($palabras); $inicio++) {
                $nombres .= $palabras[$inicio] . " ";
            }
            direccionDe(trim($nombres));
        }    
        if (strpos($_GET['oracion'], "todos los datos de") !== false ) {
            $nombres = '';
            for ($inicio = 4; $inicio < count($palabras); $inicio++) {
                $nombres .= $palabras[$inicio] . " ";
            }
            todosLosDatosDe(trim($nombres));
        }    
    }
    
    function mailDe($persona)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
            select nombre,
                   mail
                  from clientes
                  where nombre=:persona
                  "        
        );
        $sql->execute(array("persona" => $persona));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    
    function telefonoDe($persona)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
            select nombre,
                   telefono
                  from clientes
                  where nombre=:persona
                  ");
        $sql->execute(array("persona" => $persona));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    
    function direccionDe($persona)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
            select nombre,
                   direccion
                  from clientes
                  where nombre=:persona
                  "        
        );
        $sql->execute(array("persona" => $persona));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    
    function todosLosDatosDe($persona)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
            select nombre,
                   telefono,
                   mail,
                   direccion
                  from clientes
                  where nombre=:persona
                  "        
        );
        $sql->execute(array("persona" => $persona));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    ?>
    
    facturas.php
    <?php
    //******************************Consultas sobre facturacion **************************************/
    
    function consultasSobreFacturas()
    {
        global $palabras;
        if (strpos($_GET['oracion'], "facturas de") !== false || strpos($_GET['oracion'], "factura de") !== false) {
            $nombres = '';
            for ($inicio = 2; $inicio < count($palabras); $inicio++) {
                $nombres .= $palabras[$inicio] . " ";
            }
            facturasde(trim($nombres));
            exit();
        }
        if (
            strpos($_GET['oracion'], "facturas con importe menor a") !== false ||
            strpos($_GET['oracion'], "factura con importe menor a") !== false
        ) {
            $importe = $palabras[count($palabras) - 1];
            facturasConImporteMenorA($importe);
            exit();
        }
        if (
            strpos($_GET['oracion'], "facturas con importe mayor a") !== false ||
            strpos($_GET['oracion'], "factura con importe mayor a") !== false
        ) {
            $importe = $palabras[count($palabras) - 1];
            facturasConImporteMayorA($importe);
            exit();
        }
        if (
            strpos($_GET['oracion'], "factura numero") !== false ||
            strpos($_GET['oracion'], "facturas numero") !== false
        ) {
            $numero = $palabras[count($palabras) - 1];
            facturaNumero($numero);
            exit();
        }
    }
    
    function facturasde($persona)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
        select 
                  fact.codigo as codigo,
                  date_format(fecha,'%d/%m/%Y') as fecha,
                  nombre,
                  round(sum(deta.precio*deta.cantidad),2) as importefactura
              from facturas as fact 
              join clientes as cli on cli.codigo=fact.codigocliente
              join detallefactura as deta on deta.codigofactura=fact.codigo
              where nombre=:persona
              group by deta.codigofactura
              order by codigo desc"        
        );
        $sql->execute(array("persona" => $persona));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    
    function facturasConImporteMenorA($importe)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
        select 
                  fact.codigo as codigo,
                  date_format(fecha,'%d/%m/%Y') as fecha,
                  nombre,
                  round(sum(deta.precio*deta.cantidad),2) as importefactura
              from facturas as fact 
              join clientes as cli on cli.codigo=fact.codigocliente
              join detallefactura as deta on deta.codigofactura=fact.codigo          
              group by deta.codigofactura
              having importefactura<:importe
              order by codigo desc"
        );
        $sql->execute(array("importe" => $importe));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    
    function facturasConImporteMayorA($importe)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
        select 
                  fact.codigo as codigo,
                  date_format(fecha,'%d/%m/%Y') as fecha,
                  nombre,
                  round(sum(deta.precio*deta.cantidad),2) as importefactura
              from facturas as fact 
              join clientes as cli on cli.codigo=fact.codigocliente
              join detallefactura as deta on deta.codigofactura=fact.codigo          
              group by deta.codigofactura
              having importefactura>:importe
              order by codigo desc"
        );
        $sql->execute(array("importe" => $importe));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    
    function facturaNumero($numero)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
        select    pro.descripcion as descripcion,         
                  deta.precio as precio,
                  cantidad,
                  round(deta.precio*deta.cantidad,2) as importefactura
               from detallefactura as deta 
               inner join productos as pro on pro.codigo=deta.codigoproducto
               where codigofactura=:numero
               union
        select   '',
                 '',
                 'Total a pagar:',
                 round(sum(deta.precio*deta.cantidad),2) as importefactura
               from facturas as fact 
               join clientes as cli on cli.codigo=fact.codigocliente
               join detallefactura as deta on deta.codigofactura=fact.codigo          
               where fact.codigo=:numero
               group by deta.codigofactura
        "
        );
        $sql->execute(array("numero" => $numero));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    ?>
    
    productos.php
    <?php
    
    //******************************Consultas sobre productos */
    function consultasSobreProductos()
    {
        global $palabras;
        if (strpos($_GET['oracion'], "producto numero") !== false ) {
            $numero = $palabras[count($palabras) - 1];
            articuloNumero($numero);
            exit();
        }
    
        if (strpos($_GET['oracion'], "precios de") !== false || strpos($_GET['oracion'], "precio de") !== false) {
            $categoria = '';
            for ($inicio = 2; $inicio < count($palabras); $inicio++) {
                $categoria .= $palabras[$inicio] . " ";
            }
            preciosDe(trim($categoria));
            exit();
        }
    }
    
    function articuloNumero($numero)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
        select codigo,descripcion,precio           
               from productos
               where codigo=:numero
                  "        
        );
        $sql->execute(array("numero" => $numero));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    
    
    function preciosDe($categoria)
    {
        $pdo = retornarConexion();    
        $sql = $pdo->prepare("
        select pro.descripcion as nombre,
               precio
            from productos as pro
            inner join categorias as cate on cate.codigo=pro.codigocategoria
            where cate.descripcion=:categoria"        
        );
        $sql->execute(array("categoria" => $categoria));    
        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($resultado);
        exit(0);
    }
    

    Sólo no sufre cambios el archivo 'index.html'