Foros del Web » Programando para Internet » PHP »

Hacer busqueda en base a un campo tipo array creado en HTML

Estas en el tema de Hacer busqueda en base a un campo tipo array creado en HTML en el foro de PHP en Foros del Web. Saludos de nuevo, Realmente no se si el titulo de mi post es el mas adecuado, pero sorry es que no supe como ponerle de ...
  #1 (permalink)  
Antiguo 15/11/2011, 16:56
Avatar de genaro_belen  
Fecha de Ingreso: diciembre-2010
Ubicación: Santo Domingo, RD
Mensajes: 94
Antigüedad: 13 años, 5 meses
Puntos: 3
Pregunta Hacer busqueda en base a un campo tipo array creado en HTML

Saludos de nuevo,

Realmente no se si el titulo de mi post es el mas adecuado, pero sorry es que no supe como ponerle de la forma mas adecuada para que me entiendan.
Quizas si conociera bien la forma de preguntar esto ya lo hubiera encontrado en google ya que creo que es algo basico, pero so rry no he podido resolverlo.

Tengo el siguiente formulario, lo puse resumido, faltan algunos campos.

Código HTML:
<form method="get" action="">
<input type="text" name='valor'>
<label><input type="checkbox" name='brand[]' value="Nexen">Nexen</label>
<label><input type="checkbox" name='brand[]' value="Kumho">Kumho</label>
<label><input type="checkbox" name='brand[]' value="Falken">Falken</label>
<label><input type="checkbox" name='brand[]' value="Aurora">Aurora</label>
</form> 

Aqui va mi pregunta:
Como puedo decirle en la busqueda que me muestre todos los registros que cumplan con la siguiente condicion, osea que el valor en el text sea igual a x numero y que el checkbox que este seleccionado sea solo Aurora, o Falken, o quisiera que si lo seleccionan todos busque en la tabla los que cumplan con esa condicion.

El problema es que si en el campo valor escribo 17 y selecciono Nexen, cuando me lo envia por get, puedo ver que me envia en la url lo siguiente, "busqueda.php?valor=17&brand[]=Nexen" y si selecciono mas de un checkbox entonces aparece lo siguiente "busqueda.php?valor=17&brand[]=Nexen&brand[]=Falken&brand[]=Aurora" entonces no me arroja ningun resultado.

Espero que con esta informacion le sea posible ayudarme, yo seguire investigando pero espero me ayuden...

Gracias x todo...
  #2 (permalink)  
Antiguo 15/11/2011, 16:59
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Hacer busqueda en base a un campo tipo array creado en HTML

Sería interesante ver la forma en que haces la consulta, ya que el código HTML que usas es el correcto.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 15/11/2011, 17:16
Avatar de genaro_belen  
Fecha de Ingreso: diciembre-2010
Ubicación: Santo Domingo, RD
Mensajes: 94
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Hacer busqueda en base a un campo tipo array creado en HTML

Ok, aqui va el codigo...

Código PHP:
Ver original
  1. $valor = $_GET['valor'];
  2. //$marca = $_GET['brand'];  -- aqui tambien hay una ? xq se supone que si tengo en el form un array, no creo que sea la mejor forma de llamarlo ahi...
  3.  
  4. $busqueda = "SELECT * FROM products WHERE pd_valor=$valor AND marca=$marca";
  5. $resultados = mysql_query($busqueda, $enlace);
  6. while($campo = mysql_fetch_array($resultados)
  7.          {
  8.                echo "Aqui voy a mostrar los resultados";
  9.          }

Este es el codigo que tengo en php...

Gracias por tu ayuda y pronta respuesta...
  #4 (permalink)  
Antiguo 15/11/2011, 17:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Hacer busqueda en base a un campo tipo array creado en HTML

Lo que tendrías que hacer es sí rescatar $_GET['brand'] y como es un array, escapar los valores y realizar un IN de SQL:
Código PHP:
Ver original
  1. $marcas = $_GET['brand']; // Es un array
  2. $aMarcas = array();
  3. foreach ($marcas as $marca) {
  4.       $aMarcas[] = "'" . makeSafe($marca) . "'";
  5. }
  6.  
  7. $buscarMarcas = implode(',', $aMarcas);
  8. $busqueda = "SELECT * FROM products WHERE pd_valor=$valor AND marca IN ($buscarMarcas)";

Ojo la función makeSafe es para que la crees, y la idea es escapar el valor correctamente, lee sobre SQL Inyection.

Saludos.
  #5 (permalink)  
Antiguo 15/11/2011, 17:45
Avatar de genaro_belen  
Fecha de Ingreso: diciembre-2010
Ubicación: Santo Domingo, RD
Mensajes: 94
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Hacer busqueda en base a un campo tipo array creado en HTML

Ok, voy a meterle mano a esto a ver si me resulta, de verdad se ve bien el codigo voy a investigar sobre SQL inyection...

Gracias
  #6 (permalink)  
Antiguo 15/11/2011, 18:08
Avatar de Antonio_España  
Fecha de Ingreso: mayo-2007
Mensajes: 58
Antigüedad: 17 años
Puntos: 4
De acuerdo Respuesta: Hacer busqueda en base a un campo tipo array creado en HTML

Entiendo lo que te ocurre.
Ahora relatare el planteamiento de tu codigo, porque el problema es el diseño.

Cuando pones una eleccion (puse text=1 y seleccione Nexen), nos sale:
array(2) { ["valor"]=> string(1) "1" ["brand"]=> array(1) { [0]=> string(5) "Nexen" } }

y ordenandolo, lo vemos mas claro:
Código:
array(2) 
{
   ["valor"]=> string(1) "1" 
   ["brand"]=> array(1) 
   { 
      [0]=> string(5) "Nexen" 
   } 
}
Como ves, no se esta creando un apareamiento ideal.
Tienes el valor almacenado en un sitio, y el nombre, almacenado en otro.
El nombre, Nexen, no conserva el valor 1, sino que lo hace $_GET en su indice[0].

En otras palabras, tu buscas guardar parejas clave/valor, clave "Nexen", valor "1":
Nexen = 1

cosa que no esta pasando aqui. Por eso cuando seleccionas varias checkbox, (las marco todas con valor 1), obtenemos esto:
Código:
array(2) 
{ 
   ["valor"]=> string(1) "1" 
   ["brand"]=> array(4) 
   { 
      [0]=> string(5) "Nexen" 
      [1]=> string(5) "Kumho" 
      [2]=> string(6) "Falken" 
      [3]=> string(6) "Aurora" 
   } 
}
En otras palabras, valor contiene "1", y brand contiene los nombres.
No tienes la coleccion clave-valor que necesitas para relacionar el valor con el nombre y poder realizar las busquedas en la coleccion.

La solucion mas sencilla es asignar un textbox al lado de cada nombre.

Pero dado que quieres relacionar 1 textbox con todos los nombres, el planteamiento tiene que cambiar.

Te ofrezco una orientacion:
Código:
<form method="get" action="">
<input type="text" name='valor'>
<label><input type="checkbox" name='brand[]' value="Nexen">Nexen</label>
<label><input type="checkbox" name='brand[]' value="Kumho">Kumho</label>
<label><input type="checkbox" name='brand[]' value="Falken">Falken</label>
<label><input type="checkbox" name='brand[]' value="Aurora">Aurora</label>
<input type="submit" value="enviar" />
</form> 
<?
	if ($_GET)
	{
		var_dump($_GET);
		$valor = $_GET['valor'];
		$nombres = $_GET['brand'];

		// Esta variable contendra nuestra coleccion
		// $clave_nombreValor[];

		// Asigno el valor a cada nombre
		foreach ($nombres as $contenido)
		   $clave_nombreValor[$contenido]=$valor;
		   
		echo "<p></p><p>Ahora tenemos:</p>";
		var_dump($clave_nombreValor);
	}
?>
y esto nos da:
Cita:
array(2) { ["valor"]=> string(2) "12" ["brand"]=> array(4) { [0]=> string(5) "Nexen" [1]=> string(5) "Kumho" [2]=> string(6) "Falken" [3]=> string(6) "Aurora" } }


Ahora tenemos:
array(4) { ["Nexen"]=> string(2) "12" ["Kumho"]=> string(2) "12" ["Falken"]=> string(2) "12" ["Aurora"]=> string(2) "12" }
Nos centramos en "Ahora tenemos", para comprobar que efectivamente ahora tenemos nuestra coleccion clave-valor:
Código:
array(4) 
{ 
   ["Nexen"]=> string(2) "12" 
   ["Kumho"]=> string(2) "12" 
   ["Falken"]=> string(2) "12" 
   ["Aurora"]=> string(2) "12" 
}
Espero que te haya servido este ratito tan entretenido que eche para ti.

Un saludo y mucha suerte :)
  #7 (permalink)  
Antiguo 16/11/2011, 13:16
Avatar de genaro_belen  
Fecha de Ingreso: diciembre-2010
Ubicación: Santo Domingo, RD
Mensajes: 94
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Hacer busqueda en base a un campo tipo array creado en HTML

Eso que dices ahi puede que sea la solucion, pero es un poco confuso...
  #8 (permalink)  
Antiguo 19/11/2011, 04:23
Avatar de Antonio_España  
Fecha de Ingreso: mayo-2007
Mensajes: 58
Antigüedad: 17 años
Puntos: 4
Respuesta: Hacer busqueda en base a un campo tipo array creado en HTML

Dime que es lo que te confunde y con gusto, te lo explico :)
__________________
Aprendiz autodidacta
  #9 (permalink)  
Antiguo 19/11/2011, 04:54
Avatar de Antonio_España  
Fecha de Ingreso: mayo-2007
Mensajes: 58
Antigüedad: 17 años
Puntos: 4
Respuesta: Hacer busqueda en base a un campo tipo array creado en HTML

Cita:
Saludos,
Realmente te agradezco tu respuesta, gracias por ella.

Tengo una duda, y es como tratar cada valor del array nombres de forma individual de manera que yo pueda compararlo con un IN en la base de datos...

Osea compararlo con un campo x en la base de datos mediante la consulta IN() de sql...

http://www.forosdelweb.com/f18/hacer...o-html-958128/

Gracias
No es dificil.
Un array guarda sus datos mediante un indice, siendo la primera posicion el numero cero.

Supongamos que tenemos este $_GET, que ya estamos viendo que se trata de un array:
Código PHP:
Ver original
  1. array(2)
  2. {
  3.    ["valor"]=> string(1) "1"
  4.    ["brand"]=> array(4)
  5.    {
  6.       [0]=> string(5) "Nexen"
  7.       [1]=> string(5) "Kumho"
  8.       [2]=> string(6) "Falken"
  9.       [3]=> string(6) "Aurora"
  10.    }
  11. }
y ahora tu tienes tu query:
Código PHP:
Ver original
  1. Select * from tabla

y quieres hacer la comparacion de lo obtenido via get y los resultados del query:
Código PHP:
Ver original
  1. $query = mysql_query("Select * from tabla");
  2. while ($a = mysql_fetch_array($query))
  3. {
  4.    // Busco todos los nombres del $_GET para cotejar coincidencias
  5.    foreach ($_GET['brand'] as $nombre)
  6.       if ($a['nombre_de_la_columna_del_query']==$nombre)
  7.       {
  8.          // Hemos encontrado una coincidencia entre los nombres del GET y los nombres de la tabla
  9.          echo "Los datos encontrados en la tabla sobre ".$a['nombre']." son:<br>";
  10.          echo "Dato 1: ".$a['nombre_columna_1']."<br>";
  11.          echo "Dato 2: ".$a['nombre_columna_2']."<br>";
  12.          echo "Dato 3: ".$a['nombre_columna_3']."<br>";
  13.          // etc...
  14.       }
  15. }

Este codigo lo que hace es:
1.- hacer un query a la base de datos
2.- con los datos del query se recorre $_GET['brand'] para comparar cada index de $_GET['brand'] con cada index del query.

Escrito de manera literal, podria ponerse asi:
$array_base_de_datos {"maria","elena","sofia","eva","patricia"} (Por poner algo)
$array_de_brand {"Nexen","Kumho","Falken","Aurora"}


El foreach se lee asi:
Para cada nombre contenido en el array $_GET['brand'] pasar su valor a $nombre
[Bucle:]
comparar $array_base_de_datos[0]
con
todos los valores que tenga $nombre
maria = Nexen?
maria = Kumho?
maria = Falken
etc...
luego pasariamos al indice 1
comparar $array_base_de_datos[1]
elena = Nexen?
elena = Kumho?
elena = Falken
etc...
luego el indice 2, asi hasta recorrer todos los valores contenidos en $_GET['brand']
[Fin de Bucle]

para agilizar el script, si te vale con encontrar una coincidencia, puedes salir del bucle usando break;

Código PHP:
Ver original
  1. if ($a['nombre_de_la_columna_del_query']==$nombre)
  2.       {
  3.          // Hemos encontrado una coincidencia entre los nombres del GET y los nombres de la tabla
  4.          echo "Los datos encontrados en la tabla sobre ".$a['nombre']." son:<br>";
  5.          echo "Dato 1: ".$a['nombre_columna_1']."<br>";
  6.          echo "Dato 2: ".$a['nombre_columna_2']."<br>";
  7.          echo "Dato 3: ".$a['nombre_columna_3']."<br>";
  8.          // etc...
  9.         break; // Una coincidencia fue suficiente, salgo del bucle.
  10.       }

Se me olvido comentar la clausula IN.

La clausula IN sirve para encontrar coincidencias en un campo dado.

Select * from table where nombre in ("pepe","juan","felipe","jose");

lo que hace es seleccionar todos los campos de la tabla cuyo nombre sea alguno de los contenidos en IN, pero dado que $_GET es un array, el query no se construye de manera correcta (quizas un dia si, te adelantas a tu tiempo ^^).

Lo que propones seria algo como esto:
Código PHP:
Ver original
  1. <?
  2.     $datos = array
  3.     (
  4.        "Nexen" =>  "12" ,
  5.        "Kumho" =>  "12" ,
  6.        "Falken" =>  "12" ,
  7.        "Aurora" =>  "12",
  8.        "admin" => "12"
  9.     );
  10.    
  11.     mysql_connect("127.0.0.1","root","") or die ("pos no...");
  12.     mysql_select_db("aion_login") or die ("pos tampoco...");
  13.     $query = "Select * from account_data where name in (".$datos.")";
  14.     echo $query."<br>";
  15.     while ($a = mysql_fetch_array($query))
  16.     {
  17.         echo $a['name'];
  18.     }
  19.     echo "FIN";
  20. ?>

que produce la siguiente salida:
Código:
Select * from account_data where name in (Array)
FIN
En lugar de los valores de $datos, lo que tenemos en el query es el tipo, no lo que queremos procesar, por eso no puedes usar IN si quieres cotejar los datos que contiene un array. Tu idea, desde luego, es buena, pero aun, no existe desarrollo :)

Para terminar, cai en la cuenta que podemos hacer una funcion que nos edite el query para usar IN, hice el codigo de esta manera:
Código PHP:
Ver original
  1. <?
  2.     function getArrayValue($datos)
  3.     {
  4.         $texto = "";
  5.         foreach($datos as $nombres => $valor)
  6.            $texto .= "'".$nombres."' ,";
  7.            
  8.         $texto = substr($texto,0,(strlen($texto)-1));
  9.         return $texto;
  10.     }
  11.    
  12.     // Lo que nos vendria por $_GET despues de haber aplicado el arreglo  #6 de este foro
  13.     $datos = array
  14.     (
  15.        "Nexen" =>  "12" ,
  16.        "Kumho" =>  "12" ,
  17.        "Falken" =>  "12" ,
  18.        "Aurora" =>  "12",
  19.        "admin" => "12"
  20.     );
  21.    
  22.     mysql_connect("127.0.0.1","root","") or die ("pos no...");
  23.     mysql_select_db("aion_login") or die ("pos tampoco...");
  24.     $query = "Select * from account_data where name in (".getArrayValue($datos).")";
  25.     echo $query."<br>";
  26.     //$query = "Select * from account_data where name in (".$datos.")";
  27.     $query = mysql_query($query);
  28.    
  29.     while ($a = mysql_fetch_array($query))
  30.     {
  31.         echo "Nombres encontrados =".$a['name']."<br>";
  32.         foreach ($datos as $valor => $contenido)
  33.             if ($a['name']==$valor)
  34.                 echo "Coincidencia de ".$valor."!!<br>";
  35.     }
  36.     echo "<br>FIN";
  37.    
  38. ?>
en mi base de datos solamente tengo el nombre "admin" (una base de datos muy sosa), asi que cuando se recorre el array y encuentra admin, que tambien existe en la base de datos, se anuncia.

Creo que poco queda por añadir, espero que te sirvan tantos ejemplos xD
Ah, es muy importante saber, lo que arroja la consola :)
Cita:
Select * from account_data where name in ('Nexen' ,'Kumho' ,'Falken' ,'Aurora' ,'admin' )
Nombres encontrados =admin
Coincidencia de admin!!

FIN
__________________
Aprendiz autodidacta

Última edición por Antonio_España; 19/11/2011 a las 05:54 Razón: Explicacion de la clausula IN, problema resuelto con elegancia.

Etiquetas: creado, formulario, html, registro, tabla, tipo, busquedas, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 01:05.