Ver Mensaje Individual
  #9 (permalink)  
Antiguo 19/11/2011, 04:54
Avatar de Antonio_España
Antonio_España
 
Fecha de Ingreso: mayo-2007
Mensajes: 58
Antigüedad: 16 años, 10 meses
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.