BUSCAR REGISTROS CON VARIAS CLAVES DE BÚSQUEDA
Devolviendo registro(s) o mensaje si no se lo encuentra
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[].
  1. if(isset($_GET['accion']))TRUE si venimos del form o FALSE si es la carga inicial
  2. if($_GET['accion']=="buscar")TRUE si venimos del form Buscar FALSE si venimos de Buscar en todos los campos
  3. 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']
  4. Repetimos para todos los campos de búsqueda
  5. Finalizamos generando un string con el CALL en $procedimiento $procedimiento = "CALL buscar_porcampos_buscar('".$nom."','".$dir."','".$correo."','".$sex."')" o cerrando el $sqltxt
  6. 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.
  7. 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>						
						
					
© IQSystems 2023