Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] agregar datos a un arreglo json

Estas en el tema de agregar datos a un arreglo json en el foro de PHP en Foros del Web. Que tal, buen día! Bueno pues tengo un archivo php que realiza una consulta mysql y los resultados se meten en un arreglo que es ...
  #1 (permalink)  
Antiguo 13/02/2013, 08:38
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 10 meses
Puntos: 23
agregar datos a un arreglo json

Que tal, buen día!

Bueno pues tengo un archivo php que realiza una consulta mysql y los resultados se meten en un arreglo que es devuelto en json, aquí el código:

Código PHP:
Ver original
  1. require_once("../JSON.php");
  2. include('../conexion.php');
  3. $con_db = conexion();
  4.  
  5. $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
  6. $rows = isset($_POST['rows']) ? intval($_POST['rows']) : 10;
  7. $offset = ($page-1)*$rows;
  8. $result = array();
  9.  
  10. $q = isset($_POST['q']) ? strval($_POST['q']) : '';
  11.    
  12. $rs = mysql_query("select count(*) from tabla");
  13. $row = mysql_fetch_row($rs);//or die(mysql_error())
  14. $result["total"] = $row[0];
  15. $rs = mysql_query("select * from t_tabla where campo LIKE '%$q%' limit $offset,$rows");
  16.  
  17. $json = new Services_JSON;
  18.  
  19. $items = array();
  20. while($row = mysql_fetch_object($rs)){
  21.     array_push($items, $row);
  22. }
  23. $result["rows"] = $items;
  24.  
  25. echo $json->encode($result);

Hasta ahí todo bien, pero necesito tomar algunos registros de esa consulta y realizar otras consultas y despues agregar en el json devuelto tambien los resultados de las otras consultas, algo así:

Código PHP:
Ver original
  1. require_once("../JSON.php");
  2. include('../conexion.php');
  3. $con_db = conexion();
  4.  
  5. $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
  6. $rows = isset($_POST['rows']) ? intval($_POST['rows']) : 10;
  7. $offset = ($page-1)*$rows;
  8. $result = array();
  9.  
  10. $q = isset($_POST['q']) ? strval($_POST['q']) : '';
  11.    
  12. $rs = mysql_query("select count(*) from tabla");
  13. $row = mysql_fetch_row($rs);//or die(mysql_error())
  14. $result["total"] = $row[0];
  15. $rs = mysql_query("select * from t_tabla where campo LIKE '%$q%' limit $offset,$rows");
  16.  
  17. $items = array();
  18.  
  19. while($fila = mysql_fetch_array($rs,MYSQL_ASSOC)){ //uso un fetch_array para obtener los registros
  20.     $nombre_1 = @mysql_result(mysql_query("select nombre from tabla_1 where clave='".$fila['clave_1']."'"), 0);
  21.     $nombre_2 = @mysql_result(mysql_query("select nombre from tabla_2 where clave='".$fila['clave_2']."'"), 0);
  22.     $nombre_3 = @mysql_result(mysql_query("select nombre from tabla_3 where clave='".$fila['clave_3']."'"), 0);
  23. }
  24.  
  25. while($row = mysql_fetch_object($rs)){
  26.     array_push($items, $row); //fusionar aquí "nombre1:".$nombre_1.", nombre2:".$nombre_2.", nombre3:".$nombre_3
  27. }
  28. $result["rows"] = $items;
  29.  
  30. $json = new Services_JSON;
  31.  
  32. echo $json->encode($result);

Pues como notan, de la primer consulta saco con un fetch_array los valores que necesito para hacer las otras 3 consultas, hago un echo a las variables $nombre_1, $nombre_2 y $nombre_3 y si veo los valores correspondientes.

Lo que ya no se es como podria fusionar los valores de $row y las variables de modo que queden como si hubieran sido resultado de la misma consulta para el arreglo json.

agregar esto por ejemplo; "nombre1:".$nombre_1.", nombre2:".$nombre_2.", nombre3:".$nombre_3

:S

Algun ejemplo o idea de como podria lograr la salida del json con estos valores?

Gracias!

Última edición por catpaw; 13/02/2013 a las 08:44
  #2 (permalink)  
Antiguo 13/02/2013, 13:30
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 7 meses
Puntos: 2237
Respuesta: agregar datos a un arreglo json

Código PHP:
Ver original
  1. // Armas el array
  2. $nombres = array(
  3.     'nombre1' => $nombre1,
  4.    // y así le sigues con los que faltan
  5. );
  6.  
  7. // Si lo quieres como parte de $row, entonces
  8. $row = array_merge($row, $nombres);
  9.  
  10. // Y después lo agregas a $items dentro del while
  11. array_push($items, $row);

Si lo quieres en alguna otra parte, dinos dónde y muestra la estructura de tu array, para poder sugerir algo.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 14/02/2013, 08:40
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 10 meses
Puntos: 23
Respuesta: agregar datos a un arreglo json

Hola triby, no estoy segura de como aplicar las lineas que me sugieres, tratare de explicar mejor mi caso:

Actualmente así recibo los datos del json:

Código:
{"total":"41",
"rows":
[
{"matricula":"0078190","nombre":"TROLLENCIO","sexo":"M","clave_1":"1234","clave_2":"5678","clave_3":"9101","fecha_nacim":"12.10.1960"},
{"matricula":"0035910","nombre":"FUKENCIA","sexo":"F","clave_1":"0879","clave_2":"6541","clave_3":"7894","fecha_nacim":"01.05.1980"},
{...}
]
}
Como podran notar para cada fila ({}) tengo los campos clave_1, clave_2, clave_3 necesito el nombre de esas claves, los cuales los tengo en otras tablas y los puedo obtener de otras consultas, al obtenerlos debo fucionarlos en su fila correspondiente, entonces lo que necesito recibir es:

Código:
{"total":"41",
"rows":
[
{"matricula":"0078190","nombre":"TROLLENCIO","sexo":"M","clave_1":"1234","nombre1":"EL NOMBRE DE CLAVE 1","clave_2":"5678","nombre2":"EL NOMBRE DE CLAVE 2","clave_3":"9101","nombre3":"EL NOMBRE DE CLAVE 3","fecha_nacim":"12.10.1960"},
{"matricula":"0035910","nombre":"FUKENCIA","sexo":"F","clave_1":"0879","nombre1":"EL NOMBRE DE CLAVE 1","clave_2":"6541","nombre2":"EL NOMBRE DE CLAVE 2","clave_3":"7894","nombre3":"EL NOMBRE DE CLAVE 3","fecha_nacim":"01.05.1980"},
{...}
]
}
Segun yo iba a agregar esto, para traer los nombres de las otras tablas:

Código PHP:
while($fila mysql_fetch_array($rs,MYSQL_ASSOC)){ //uso un fetch_array para obtener los registros
    
$nombre_1 = @mysql_result(mysql_query("select nombre from tabla_1 where clave='".$fila['clave_1']."'"), 0);
    
$nombre_2 = @mysql_result(mysql_query("select nombre from tabla_2 where clave='".$fila['clave_2']."'"), 0);
    
$nombre_3 = @mysql_result(mysql_query("select nombre from tabla_3 where clave='".$fila['clave_3']."'"), 0);

Pero no me funciona, necesito hacerlo en el mismo ciclo, pero como es un mysql_fetch_object no puedo llamar el arreglo $fila['clave_1']

Bueno aqui ya no se como solucionar esto, es que cada nombre de clave debe corresponder con su clave por cada fila o por cada pasada

Como podría dentro del mismo ciclo:

while($row = mysql_fetch_object($rs)){
array_push($items, $row);
}

realizar las consultas que necesito y fucionar esos campos resultantes?

Gracias
  #4 (permalink)  
Antiguo 14/02/2013, 09:13
Avatar de informacionsys  
Fecha de Ingreso: mayo-2011
Ubicación: Bogota D.C
Mensajes: 793
Antigüedad: 12 años, 10 meses
Puntos: 76
Respuesta: agregar datos a un arreglo json

hola

te doy un ejemplo de lo que pienso que buscas
Código PHP:
Ver original
  1. // obtener claves , me imagino no se
  2. $query1 = sprintf("select * from t_tabla where campo LIKE '%s' limit  %s %s","%".$q."%",$offset,$rows);
  3. $resultSet = mysql_query($query1,$db);
  4.  
  5. //recorrer resultado
  6.  
  7. while($recordSet = mysql_fetch_object($resultSet))
  8. {  
  9.  
  10.     //claves
  11.     $clave1 = $recordSet->clave1;
  12.     $clave2 = $recordSet->clave2;
  13.  
  14.     //consultamos la informacion de la clave 1
  15.     $resultSetClave1 = InfoClaves($clave1);
  16.  
  17.     //consultamos la informacion de la clave 2
  18.     $resultSetClave2 = InfoClaves($clave2);
  19.  
  20.     //creas el arreglo normal
  21.     $datos = array("matricula"=>$recordSet->matricula,
  22.                    "nombre"=>$recordSet->nombre,
  23.                    "sexo"=>$recordSet->sexo,
  24.                    "clave1"=>$clave1,
  25.                    "infoclave1"=>$resultSetClave1["infoclave"],// obtienes el nombre o cualquier dato que necesites de dicha clave1
  26.                    "clave2"=>$clave2,
  27.                    "infoclave2"=>$resultSetClave2["infoclave"]// obtienes el nombre o cualquier dato que necesites de dicha clave2
  28.                   );
  29.  
  30.     $salida[] = $datos;
  31. }
  32.  
  33. //retornar json
  34. $json_salida = array("numrows"=>$salida);
  35.  
  36. echo json_encode($json_salida);
  37.  
  38. function InfoClaves($clave)
  39. {
  40.     global $db;
  41.     $queryclave = sprintf("SELECT * FROM table_claves WHERE clave ='%s'",$clave);//query para consultar info de una clave
  42.     $resultSet = mysql_query($queryclave,$db);
  43.     $numrows = mysql_num_rows($resultSet);// numero de registros
  44.  
  45.     //creamos un arreglo
  46.     $output["numreg"] = $numrows;// cantidad de registros
  47.     $output["infoclave"] = mysql_fetch_object($resultSet);// informacion de la clave
  48.  
  49.     return $output;
  50.  
  51. }


si te fijas yo cree una indice infoclave para almacenar todos los datos que tiene la clave consultada

Código PHP:
Ver original
  1. "infoclave1"=>$resultSetClave1["infoclave"]

pero como tu deseas solo el nombre de la clave podria funcionar hacer esto

Código PHP:
Ver original
  1. "infoclave1"=>$resultSetClave1["infoclave"]->nombre_clave// nombre_clave obvio es el campo de la tabla de claves no jjeje

Última edición por informacionsys; 14/02/2013 a las 09:21
  #5 (permalink)  
Antiguo 14/02/2013, 13:18
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 7 meses
Puntos: 2237
Respuesta: agregar datos a un arreglo json

Y porqué no usas JOIN?

Código PHP:
Ver original
  1. $query = "select t.*,  t1.clave as nombre1, t2.clave as nombre2, t3.clave as nombre3";
  2. $query .= " from t_tabla t";
  3. $query .= "JOIN tabla_1 t1 on t1.clave = t.clave_1";
  4. $query .= "JOIN tabla_2 t2 on t2.clave = t.clave_2";
  5. $query .= "JOIN tabla_3 t3 on t3.clave = t.clave_3";
  6. $query .= " where campo LIKE '%$q%' limit $offset,$rows";

Ejecutando esa consulta se agregarán los campos nombre1, nombre2 y nombre3 al registro.

En caso de que clave_1, _2 o _3 puedan tener un valor que no exista en la tabla correspondiente, deberás usar LEFT JOIN en lugar de JOIN, prueba un poco y nos dices si lo logras.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 14/02/2013, 20:45
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 10 meses
Puntos: 23
Respuesta: agregar datos a un arreglo json

Hola informacionsys gracias por tu ejemplo, en cuanto tenga un chance lo pruebo

No se me habia atrevido a hacer una consultota, jeje aunque creo que es mas practico así que cambiar radicalmente el código que ya tengo.

Triby probe con la consulta pero tengo problemas (la tabla que consulto tiene 41 registros),

- me sale el total de registros (31) de la tabla, lo que es correcto ya que hay registros que no cumplen con el where.
- pero me sale repetido el segundo registro las 31 veces..

:S

Cambie por el LEFT JOIN y así me sale repetido el primer registro las 31 veces.

De hecho no se usar mucho left join-join por eso mi primer opcion era obtener los valores en consultas sepadas, pero creo que lo correcto es hacer todo en la misma consulta no?

lo que si se es que se supone que no deberia haber campos vacios o que no existan en las tablas, pero no tengo idea por que se esta ejecutando con este resultado la consulta, que crees que podra ser?

consulta:
Código MySQL:
Ver original
  1. $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
  2. $rows = isset($_POST['rows']) ? intval($_POST['rows']) : 10;
  3. $offset = ($page-1)*$rows;
  4. $result = array();
  5.  
  6. $q = isset($_POST['q']) ? strval($_POST['q']) : '';
  7.    
  8. $rs = mysql_query("select count(*) from t_usuarios where status='' and (nombre LIKE '%$q%' OR matricula LIKE '%$q%')");
  9. $row = mysql_fetch_row($rs);//or die(mysql_error())
  10. $result["total"] = $row[0];
  11.  
  12. $query = "select t_u.*, t_edo.nombre as nestado, t_ciu.nombre as nciudad, t_mun.nombre_municipio as nmunicipio";
  13. $query .= " from t_usuarios t_u";
  14. $query .= " LEFT JOIN t_estados t_edo on t_edo.estado = t_u.estado";
  15. $query .= " LEFT JOIN t_estados t_ciu on t_ciu.ciudad = t_u.ciudad";
  16. $query .= " LEFT JOIN t_municipio t_mun on t_mun.municipio = t_u.municipio";
  17. $query .= " where t_u.status='' and (t_u.nombre LIKE '%$q%' OR t_u.matricula LIKE '%$q%') limit $offset,$rows";
  18.  
  19. $rs = mysql_query($query);

gracias por la ayuda
  #7 (permalink)  
Antiguo 14/02/2013, 22:53
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 7 meses
Puntos: 2237
Respuesta: agregar datos a un arreglo json

Imprime la consulta ( echo query; ) y pruébala en PhpMyAdmin, si funciona, entonces nos muestras el resto del código, si no, habrá que preguntar en BDD -> MySQL

Agrego:

Tienes ciudades y estados en la misma tabla o es un error?

$query .= " LEFT JOIN t_estados t_edo on t_edo.estado = t_u.estado";
$query .= " LEFT JOIN t_estados t_ciu on t_ciu.ciudad = t_u.ciudad";


Suponiendo que sean en la misma tabla, ese JOIN quedaría así:

$query .= " LEFT JOIN t_estados t_edo on t_edo.estado = t_u.estado AND t_edo.ciudad = t_u.ciudad";

Por supuesto, sin olvidar cambiar t_ciu.ciudad por t_edo.ciudad en la lista de campos.
__________________
- León, Guanajuato
- GV-Foto
  #8 (permalink)  
Antiguo 15/02/2013, 09:00
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 10 meses
Puntos: 23
Respuesta: agregar datos a un arreglo json

Hola triby ya hice las correcciones, efectivamente ciudades y estados estan en la misma tabla t_estados

En fin creo que ese era el detalle que estaba causando las repeticiones, asi deje la consulta y parece que ya funciona:

Código MySQL:
Ver original
  1. $query = "select t_u.*, t_edo.nombre as nestado, t_edo.nombre as nciudad, t_mun.nombre_municipio as nmunicipio";
  2. $query .= " from t_usuarios t_u";
  3. $query .= " LEFT JOIN t_estados t_edo on t_edo.estado = t_u.estado AND t_edo.ciudad = t_u.ciudad";
  4. $query .= " LEFT JOIN t_municipio t_mun on t_mun.municipio = t_u.municipio";
  5. $query .= " where t_u.status='' and (t_u.nombre LIKE '%$q%' OR t_u.matricula LIKE '%$q%') limit $offset,$rows";

Pero tengo un problema, que estoy conciente que es porque la tabla esta mal diseñada per aclaro que yo no la hice, aun así, me tengo que adaptar a lo que ya tienen :/

mira esta es la tabla (datos ejemplo):

t_estados

Código:
+----------+---------+-----------+
|  estado  | ciudad  | nombre    |
+--------- +---------+-----------+
|  001     |         | Veracruz  |    
+--------- +---------+-----------+
|  001     |   0001  |  Xalapa   | 
+--------- +---------+-----------+
|  001     |   0002  |  Cordoba  | 
+--------- +---------+-----------+
|  002     |         | Tamulipas | 
+--------- +---------+-----------+
|  002     |   0003  | Tampico   | 
+--------- +---------+-----------+
|  002     |   0004  | Reynosa   | 
+--------- +---------+-----------+
Podrás notar que un estado se identifica teniendo vacio el campo ciudad y el problemon es que ambos campos estado y ciudad comparten el campo nombre.

Entonces en mi consulta yo tengo asi:

t_edo.nombre as nestado, t_edo.nombre as nciudad

lo que me da como resultado que nestado y nciudad sean iguales, es decir tengan el mismo valor (el de la ciudad)...

osea me sale por ejemplo:

{"matricula":"0078190","nombre":"TROLLENCIO","sexo ":"M","estado":"001","ciudad":"0001","municipio":"9101","nestado":"Xalapa","nciudad":"Xalapa","nmunicipio":"lo que sea","fecha_nacim":"12.10.1960"},

como podria especificar en la consulta que el estado es el que tiene el campo ciudad vacio? y eso se haria en el select? o en el where?

Gracias

Última edición por catpaw; 15/02/2013 a las 09:07
  #9 (permalink)  
Antiguo 15/02/2013, 09:11
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 7 meses
Puntos: 2237
Respuesta: agregar datos a un arreglo json

Creo que hay que regresar al JOIN anterior:

Código PHP:
Ver original
  1. $query = "select t_u.*, t_edo.nombre as nestado, t_ciu.nombre as nciudad, t_mun.nombre_municipio as nmunicipio";
  2. $query .= " from t_usuarios t_u";
  3. $query .= " LEFT JOIN t_estados t_edo on t_edo.estado = t_u.estado AND t_edo.ciudad = ''"; // Agregamos ciudad (vacía)
  4. $query .= " LEFT JOIN t_estados t_ciu on t_ciu.ciudad = t_u.ciudad AND t_ciu.estado = t_u.estado";  // Agregamos estado
  5. $query .= " LEFT JOIN t_municipio t_mun on t_mun.municipio = t_u.municipio";
  6. $query .= " where t_u.status='' and (t_u.nombre LIKE '%$q%' OR t_u.matricula LIKE '%$q%') limit $offset,$rows";

Con eso ya no debería repetir datos.
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 15/02/2013, 09:27
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 10 meses
Puntos: 23
Respuesta: agregar datos a un arreglo json

Perfecto Triby ya quedo!!

Muchas gracias, siempre me sacas de apuros!!

  #11 (permalink)  
Antiguo 24/04/2013, 08:36
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 10 meses
Puntos: 23
Respuesta: agregar datos a un arreglo json

Hola para comentarles que la consulta anda bien, pero tengo un incoveniente:

Código PHP:
Ver original
  1. $query = "select t_u.*, t_edo.nombre as nestado, t_ciu.nombre as nciudad, t_mun.nombre_municipio as nmunicipio";
  2. $query .= " from t_usuarios t_u";
  3. $query .= " LEFT JOIN t_estados t_edo on t_edo.estado = t_u.estado AND t_edo.ciudad = ''"; // Agregamos ciudad (vacía)
  4. $query .= " LEFT JOIN t_estados t_ciu on t_ciu.ciudad = t_u.ciudad AND t_ciu.estado = t_u.estado";  // Agregamos estado
  5. $query .= " LEFT JOIN t_municipio t_mun on t_mun.municipio = t_u.municipio";
  6. $query .= " where t_u.status='' and (t_u.nombre LIKE '%$q%' OR t_u.matricula LIKE '%$q%') limit $offset,$rows";

Esta consulta la ocupo en un autocomplete, por lo que cada vez que se escribe un letra en el campo de texto supongo que se dispara esta consulta y busca conincidencias.

El problema creo yo que al tener 3 left join tal vez se hace un poco pesado para el servidor mandar cada vez al base y cuando voy obteniendo los resultados en el autocomplete como que se traba un poco. Por ejemplo si escribo rapido como que no resulta eficiente.

Como podria optimizar esta consulta?
  #12 (permalink)  
Antiguo 24/04/2013, 10:54
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 7 meses
Puntos: 2237
Respuesta: agregar datos a un arreglo json

Qué índices tienes en las tablas?, a veces eso puede ayudar un poco (un mucho).
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: json, mysql, registro, resultados, select, sql, tabla, variables
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




La zona horaria es GMT -6. Ahora son las 12:56.