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.
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'