PHP - Buscador multiple no realiza bien la consulta

 
Vista:
sin imagen de perfil
Val: 139
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscador multiple no realiza bien la consulta

Publicado por towi62 (79 intervenciones) el 03/08/2020 20:25:40
Buen dia,quiero realizar una búsqueda desde un formulario que contiene los valores columna1, columna2 y columna3. El cual paso los valores a formulaio procesa.php. Para luego meterla a la variable $consulta, que es la que se va encargar de realizar la busqueda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Creamos el primer parametro en caso de que exista
if ($_POST['columna1']!='') $parametros.="columna1=".$_POST['columna1'].'&';
//Creamos el segundo parametro en caso de que exista
if ($_POST['columna2']!='') $parametros.="columna2=".$_POST['columna2'].'&';
//Creamos el tercer parametro en caso de que exista
if ($_POST['columna3']!='') $parametros.="columna3=".$_POST['columna3'].'&';
 
//Dividimos los parametros
$porciones=explode('&',$parametros);
 
//Contamos la cantidad de parametros
$cantidad=count($porciones)-1;
 
 //Si hay mas de 1 parametro los unimos con AND para mysql
 if ($cantidad>1){
 for ($i=0; $i < $cantidad; $i++) {
  $consulta.= $porciones[$i].' AND ';
 }
 } else {
 $consulta.= $porciones[0].' AND ';
}
 
//Eliminamos el AND del final
$consulta = substr ($consulta, 0, strlen($consulta) - 4);
Hasta ahí va todo bien ya que le hice un echo ha $consulta y si me muestra los valores.

Ahora ya que tengo esos valores unidos quiero hacer una búsqueda, la conexión si la hago muy bien pero no me devuelve resultados recogidos de la tabla contenedor que es la que contiene los valores que necesio.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNA INSTRUCION CON LIKE
$cadbusca=sprintf("unSELECT * FROM contenedor WHERE datos2 LIKE '%$consulta%' OR datos1 LIKE
'%$consulta%'OR datos3 LIKE '%$consulta%'");
 
 
 
$result = $conn->query($cadbusca);
 
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->mysql_fetch_object()) {
echo "Nombre: " . $row["datos1"]. " - edad: " . $row["datos2"]. "<br>";
}
} else {
echo "0 resultados";
 
}
$conn->close();

:::::::::::::::::::::::::::::::::::: Connected successfully

0 resultados :::::::::::::::::::::::::::::::::::::::
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Buscador multiple no realiza bien la consulta

Publicado por Roy (1 intervención) el 03/08/2020 20:50:03
En un query SQL si utilizas la clausula LIKE %valor% lo que estas pidiendo es que te devuelva todos los valores que inicien o terminen con el valor indicado. En tu caso "valor" trae lo contenido en la variable $consulta que seria: "columna1 AND columna2 AND columna3". Supongo que ningun campo de tu BD contiene los 3 valores agrupados juntos. No hace falta unir los parametros con AND, tendrias que utilizarlos por separado.
Simplemente tendrias que pasar cada uno de los valores condicionado al campo de BD respectivo:
1
SELECT * FROM  contenedor WHERE datos1 LIKE '%$columna1%' OR datos2 LIKE '%$columna2%' OR datos3 LIKE '%$columna3%'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 139
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscador multiple no realiza bien la consulta

Publicado por towi62 (79 intervenciones) el 03/08/2020 21:11:17
muchas gracias, checare ese punto buen lunes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Buscador multiple no realiza bien la consulta

Publicado por anonymous (53 intervenciones) el 03/08/2020 21:14:46
No se recomienda efectuar búsquedas con doble comodín, es decir colocar el símbolo de porcentaje a ambos lados del criterio a buscar, pues tiene un rendimiento desastroso y pone de rodillas cualquier base de datos.

Obviamente habrá escenarios muy particulares donde sea necesario hacerlo así, pero si se evalúa el performance de las instrucciones:

LIKE 'cualquiercosa%'

LIKE '%cualquiercosa'

LIKE '%cualquiercosa%'

La última instrucción es las más lenta y pesada, el criterio "cualquiercosa" deberá ser siempre una columna indizada, donde dependiendo del tipo de índice (Primary Key, Unique, Índice con duplicados), responderá más o menos rápido y eficientemente.

La recomendación es emplear: LIKE 'cualquiercosa%' solo con el comodín al final del criterio, pero ya eso depende de que se desea buscar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Buscador multiple no realiza bien la consulta

Publicado por juan (1 intervención) el 04/08/2020 15:07:30
Es muy acertado el planteamiento que hace Jorge al respecto, pues si se le hace un explain plan al query:

1
SELECT * FROM  contenedor WHERE datos1 LIKE '%$columna1%' OR datos2 LIKE '%$columna2%' OR datos3 LIKE '%$columna3%'

Se podrá apreciar que el rendimiento es pésimo. Eso afecta hasta un Oracle, se considera una muy mala práctica emplear doble comodín en una búsqueda, y más cuando se le añade más de un criterio con OR
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 139
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscador multiple no realiza bien la consulta

Publicado por Towi62 (79 intervenciones) el 04/08/2020 16:33:24
Ya hice lo que me dijo pero sigue sin mostrarme resultados. Pongo el código haber que es lo que estoy haciendo mal. Muchas gracias buen día
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
 
include "conexion.php";
 
$dbname = "towiwiwi_batman";
 
//Creamos las variables
$consulta='';
$parametros='';
 
// Create connection
 
$conn = new mysqli($servername, $username, $password, $dbname);
 
// Check connection
 
if ($conn->connect_error) {
 
  die("Connection failed: " . $conn->connect_error);
 
}
 
//Creamos el primer parametro en caso de que exista
if ($_POST['columna1']!='') $parametros.="columna1=".$_POST['columna1'].'&';
//Creamos el segundo parametro en caso de que exista
if ($_POST['columna2']!='') $parametros.="columna2=".$_POST['columna2'].'&';
//Creamos el tercer parametro en caso de que exista
if ($_POST['columna3']!='') $parametros.="columna3=".$_POST['columna3'].'&';
 
 
//Dividimos los parametros
$porciones=explode('&',$parametros);
 
//Contamos la cantidad de parametros
$cantidad=count($porciones)-1;
 
//Si hay mas de 1 parametro los unimos con AND para mysql
if ($cantidad>1){
	for ($i=0; $i < $cantidad; $i++) {
		$consulta.= $porciones[$i].' AND ';
	}
} else {
	$consulta.= $porciones[0].' AND ';
}
 
//Eliminamos el AND del final
$consulta = substr ($consulta, 0, strlen($consulta) - 4);
 
//Obtenemos algo como columna1=dato1 AND columna2=dato2
echo $consulta.'<br><br>';
 
    //SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNa INSTRUCION CON LIKE
    $cadbusca="SELECT * FROM contenedor WHERE datos1 LIKE '$columna1%' OR datos2 LIKE '$columna2%' OR datos3 LIKE '$columna3%'";
 
 
 
      $result = $conn->query($cadbusca);
 
      if ($result->num_rows > 0) {
      // output data of each row
      while($row = $result->mysql_fetch_object()) {
      echo "Nombre: " . $row["datos1"]. " - edad: " . $row["datos2"]. "<br>";
      }
      } else {
      echo "0 resultados";
      }
      $conn->close();
 
 
 ?>
='editor_line'>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 139
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Buscador multiple no realiza bien la consulta

Publicado por towi62 (79 intervenciones) el 05/08/2020 00:16:47
muchas gracias por su atencion este tema ya lo resolvi, gracias a ustedes, ya queda cerrado, buena semana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar