La primera parte del código PHP : la variable $sqltxt la vamos a usar si aplicamos sentencias sql desde
PHP y el resto si usamos los procedures que se cargan por los .sql
las variables
$nom = ""; $dir = ""; $correo = ""; $sex = ""; se inicializan a nada y luego se asignan
a los valores que se eligieron en la búsqueda, que retornan en los $_POST[].
- if(isset($_GET['accion']))TRUE si venimos del form o FALSE si es la
carga inicial
- if($_GET['accion']=="buscar")TRUE si venimos del form Buscar
FALSE si venimos de Buscar en todos los campos
- if($_POST['nombre']<>"--nombre--" && $_POST['nombre']<>"")TRUE si escribimos algo dentro del
input entonces agregamos un " AND nombre LIKE '%" . $_POST['nombre'] . "%'" al SQL o le
asignamos a $nom = $_POST['nombre']
- Repetimos para todos los campos de búsqueda
- Finalizamos generando un string con el CALL en $procedimiento
$procedimiento = "CALL buscar_porcampos_buscar('".$nom."','".$dir."','".$correo."','".$sex."')"
o cerrando el $sqltxt
- Si 2 es falso venimos de buscar en todos los campos entonces si usamos procedimientos resultará
$procedimiento = "CALL buscar_todos_buscar('" . $_POST['cualquiera'] . "')" o debemos realizar
una sentencia SQL con OR.
- Finalmenmte si 1 es FALSE entonces es la carga original y asignamos
$procedimiento = "CALL mostrar_todos_buscar";
En el body el llenado del selector desde la db está explicado en
Llenar selector desde dB y el llenado de la tabla es el clásico
explicado en
Listar a tabla simple dB con la diferencia que en la versión procedure llamamos a un
$procedimiento que contiene el string con el call. Los procedures pueden verse en "Ver archivos .sql" abajo.
<head>
<?
include("conexion.php"); // abre la conexión a la base de datos
global $conn; //lo usamos en conexion
$nom = ""; // todas las variables para el procedure en nada.
$dir = "";
$correo = "";
$sex = "";
if(isset($_GET['accion'])){ //carga inicial de la página
if($_GET['accion']=="buscar"){ //vuelvo de ejecutar buscar por campos
$sqltxt = "SELECT id,nombre,direccion,mail,sexo FROM clientes WHERE true";
if($_POST['nombre']<>"--nombre--" && $_POST['nombre']<>""){
$sqltxt = $sqltxt . " AND nombre LIKE '%" . $_POST['nombre'] . "%'";
$nom= $_POST['nombre'];
}
if($_POST['direccion']<>"--dirección--" && $_POST['direccion']<>""){
$sqltxt = $sqltxt . " AND direccion LIKE '%" . $_POST['direccion'] . "%'";
$dir = $_POST['direccion'] ;
}
if($_POST['mail']<>"--email--" && $_POST['mail']<>""){
$sqltxt = $sqltxt . " AND mail LIKE '%" . $_POST['mail'] . "%'";
$correo = $_POST['mail'];
}
if($_POST['sexo']<>"--género--" && $_POST['sexo']<>""){
$sqltxt = $sqltxt . " AND sexo LIKE '%" . $_POST['sexo'] . "%'";
$sex = $_POST['sexo'];
}
$procedimiento = "CALL buscar_porcampos_buscar('".$nom."','".$dir."','".$correo."','".$sex."')";
}else{ //vuelvo de ejecutar buscar en toda la base
$sqltxt = "SELECT id,nombre,direccion,mail,sexo FROM clientes WHERE false";
if($_POST['cualquiera']<>"--tipear aquí--" && $_POST['cualquiera']<>""){
$procedimiento = "CALL buscar_todos_buscar('" . $_POST['cualquiera'] . "')";
// es solo para mostrar el SQL
$sqltxt = $sqltxt . " OR nombre LIKE '%" . $_POST['cualquiera'] . "%'";
$sqltxt = $sqltxt . " OR direccion LIKE '%" . $_POST['cualquiera'] . "%'";
$sqltxt = $sqltxt . " OR mail LIKE '%" . $_POST['cualquiera'] . "%'";
$sqltxt = $sqltxt . " OR nombre LIKE '%" . $_POST['cualquiera'] . "%'";
$sqltxt = $sqltxt . " LIMIT 0,200";
// FIN es solo para mostrar el SQL
}else{
$procedimiento = "CALL mostrar_todos_buscar";
// es solo para mostrar el SQL
$sqltxt = "SELECT id,nombre,direccion,mail,sexo FROM clientes LIMIT 0,200";
// FIN es solo para mostrar el SQL
}
}
}else{
$procedimiento = "CALL mostrar_todos_buscar";
// es solo para mostrar el SQL
$sqltxt = "SELECT id,nombre,direccion,mail,sexo FROM clientes LIMIT 0,200";
// FIN es solo para mostrar el SQL
}
?>
</head>
<body>
<div style="margin-bottom: 20px; border:#333 solid 1px; padding:10px; display:inline-block;">
<form action="?accion=buscar" method="POST"> <!-- Búsqueda por campos-->
<input id="buscar" type="submit" value="Buscar">
<input name="nombre" type="text" value="--nombre--" onfocus="LimpiaInput(this)" onblur="LimpiaInput(this)">
<input name="direccion" type="text" value="--dirección--" onfocus="LimpiaInput(this)" onblur="LimpiaInput(this)">
<input name="mail" type="text" value="--email--" onfocus="LimpiaInput(this)" onblur="LimpiaInput(this)">
<select name="sexo" id="personas">
<option value="--género--">--género--</option>
<?
if(conectar()){
$sqltxt1 = "SELECT DISTINCT sexo FROM clientes ORDER BY sexo";
$sqldevolucion = mysqli_query($conn,$sqltxt1);
while ($prove = mysqli_fetch_array($sqldevolucion, MYSQLI_ASSOC)){
?>
<option value="<? echo $prove["sexo"] ?>"><? echo $prove["sexo"] ?> </option>
<?
}
mysqli_free_result($sqldevolucion); //devuelvo recurso a memoria
mysqli_close($conn); // cierro conexion
}else{
echo(mysqli_error($conn)); //no se puede conectar con la DB
}
?>
<option value="no binario">No binario</option>
</select>
</form>
</div>
<div style="margin-bottom: 20px; border:#333 solid 1px; padding:10px; display:inline-block;">
<form action="?accion=todos" method="POST"> <!-- Búsqueda por todos los campos-->
<input id="todos" name="busqueda" type="submit" value="Buscar en todos los campos" >
<input style="display:inline-block;" name="cualquiera" type="text" value="--tipear aquí--" onfocus="LimpiaInput(this)" onblur="LimpiaInput(this)">
</form>
</div>
<!--******comienza la tabla*************-->
<div>
<table>
<?
if(conectar()){
// si se usa sentencias SQL directas uso $sqltxt en lugar de $procedimiento
$sqldevolucion = mysqli_query ($conn,$procedimiento);
if (!mysqli_num_rows($sqldevolucion)) {
echo("NO HAY REGISTROS PARA ESTA BÚSQUEDA");
} else {
echo("<tr>");
echo("<td>ID</td>");
echo("<td>NOMBRE</td>");
echo("<td>DIRECCIÓN</td>");
echo("<td>EMAIL</td>");
echo("<td>GÉNERO</td>");
echo("</tr>");
while ($registro = mysqli_fetch_array($sqldevolucion, MYSQLI_ASSOC)){
echo("<tr>");
echo("<td>".$registro["id"] . "</td>" );
echo("<td>".$registro["nombre"] . "</td>" );
echo("<td>".$registro["direccion"] . "</td>" );
echo("<td>".$registro["mail"] . "</td>" );
echo("<td>".$registro["sexo"] . "</td>" );
echo("</tr>");
}
mysqli_free_result($sqldevolucion); //devuelvo recurso a memoria
mysqli_close($conn); // cierro conexion
}
}else{
echo(mysqli_error($conn)); //no se puede conectar con la DB
}
?>
</table>
</div>
</body>