Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Recorrer array para una consulta, solo asigna el último valor.

Estas en el tema de Recorrer array para una consulta, solo asigna el último valor. en el foro de PHP en Foros del Web. Mi problema es el siguiente, a ver si alguien me puede ayudar pues no doy con ello. Desde una aplicación Android envío una variable del ...
  #1 (permalink)  
Antiguo 11/10/2015, 09:21
 
Fecha de Ingreso: mayo-2014
Mensajes: 45
Antigüedad: 10 años, 6 meses
Puntos: 0
Recorrer array para una consulta, solo asigna el último valor.

Mi problema es el siguiente, a ver si alguien me puede ayudar pues no doy con ello.
Desde una aplicación Android envío una variable del tipo Array. Esta la recibo como un String.
En concreto la variable contiene una serie de tipos de establecimientos, Restaurante, Bar, Bar-Restaurante, etc. Esta es: $tiposfin=$_POST['subTiposFin'];
En Android tiene el formato: [Restaurante, Bar, Bar-Restaurante,…] y en el mismo formato de cadena la recibo en php.
Lo que hago, es convertirla en un array, primero eliminando los corchetes:
$reemplazar1=str_replace("[", "", $tiposfin);
$reemplazar2=str_replace("]", "", $reemplazar1);
Y después convertirla en un array:
$tipos=explode(',', $reemplazar2);
El problema surge a la hora de recorrer el array para la consulta, tanto con for, foreach o while.
La consulta que me interesa es:
for ($y=0; $y<count($tipos); $y++) {
$result = mysql_query("select id_cliente, nombre, tipo, precio, icono1, localidad FROM restauracion WHERE tipo = $tipos");
}
Pero para saber que valores me está pasando, en la tabla en el campo ‘nombre’ utilizo:
for($i=0;$i<count($tipos);$i++) {
$sql = mysql_query("UPDATE restauracion SET nombre = '$tipos[$i]' WHERE tipo = 'Cómida para llevar'");
}
Y entonces el problema es el siguiente, si el array tiene tres valores p.e. (Restaurante, Bar, Bar-Restaurante), sólo devuelve el último, en este caso Bar-Restaurante. No se a que se puede deber.
  #2 (permalink)  
Antiguo 11/10/2015, 10:32
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Si usas un valor que construyes dentro del loop fuera de él siempre será el último, eso es completamente lógico, porque usas el valor cuando el loop ya ha finalizado.

Es obvio que para usar el valor que se genera dentro del loop debes hacer tus operaciones también ahí dentro, de otra forma siempre seguirás leyendo el último valor, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 11/10/2015, 13:17
 
Fecha de Ingreso: mayo-2014
Mensajes: 45
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Lo primero gracias por tu respuesta, lo segundo la situación ha cambiado, me explico. Si utilizo este script de ejemplo para ver si funciona:
$kk=array('Comida rápida','Comida para llevar');
foreach ($kk as $valor) {
$sql = mysql_query("UPDATE restauracion SET nombre = 'Pedroche' WHERE tipo = '$valor'");
}
Funciona perfectamente, pero si utilizo:
foreach ($tipos as $valor) {
$sql = mysql_query("UPDATE restauracion SET nombre = 'Pedroche' WHERE tipo = '$valor'");
}
Y pasándole como parámetros desde Android también 'Comida rápida' y 'Comida para llevar' solo me actualiza el primer valor: 'Comida rápida'.
Ahora he utilizado foreach. En cuanto a tu respuesta la miraré despacio, pues no la entiendo.
Gracias de nuevo por tu atención.
  #4 (permalink)  
Antiguo 11/10/2015, 13:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Entonces el array $tipos que creas cuando lo recibes desde Android no es correcto.

¿Podrías hacer un var_dump() de $tipos cuando recibas los datos?

¿Qué muestra?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 12/10/2015, 06:09
 
Fecha de Ingreso: mayo-2014
Mensajes: 45
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Disculpa la tardanza pero he estado aclarándome un poco con php para hacer un var_dump(). Te cuento, he hecho lo siguiente:
$tiposfin=$_POST['subTiposFin'];
$reemplazar1=str_replace("[", "", $tiposfin);
$reemplazar2=str_replace("]", "", $reemplazar1);
$tipos=explode(',', $reemplazar2);

ob_start();
var_dump($tipos);
$contents=ob_get_contents();
ob_end_clean();
$fichero=fopen('test.log','w');
fwrite($fichero,$contents);
fclose($fichero);
He seleccionado todas las opciones en la aplicación de Android y el test.log da lo siguiente:
array(6) {
[0]=>
string(11) "Restaurante"
[1]=>
string(4) " Bar"
[2]=>
string(16) " Bar-Restaurante"
[3]=>
string(15) " Comida rápida"
[4]=>
string(19) " Comida para llevar"
[5]=>
string(21) " Evento gastronómico"
}
Y otra vez gracias llevo más de una semana dándole vueltas y veo que uno de los problemas es lo mal que me defiendo en php.
  #6 (permalink)  
Antiguo 12/10/2015, 17:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Pues sí te está entregando un array, pero ¿ya notaste que tienen espacios al inicio algunos valores? ¿no será que eso arruina lo que haces más adelante?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 13/10/2015, 02:15
 
Fecha de Ingreso: mayo-2014
Mensajes: 45
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Sí, pero lo solucioné con $tipos=explode(', ', $reemplazar2); dejando un espacio detrás de la coma y antes de la última comilla. El problema es, por lo que he mirado en foros, lo que me dijiste al principio:
Si usas un valor que construyes dentro del loop fuera de él siempre será el último, eso es completamente lógico, porque usas el valor cuando el loop ya ha finalizado.
Pero no se hacerlo, he hecho varias pruebas y no doy con ello, mira a ver si puedes ayudarme, te lo agradecería mucho.
  #8 (permalink)  
Antiguo 13/10/2015, 06:22
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Sería bueno que muestres todo el código con los cambios que has hecho.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 13/10/2015, 14:23
 
Fecha de Ingreso: junio-2014
Mensajes: 14
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Cita:
Iniciado por jlopezisern Ver Mensaje
Mi problema es el siguiente, a ver si alguien me puede ayudar pues no doy con ello.
Desde una aplicación Android envío una variable del tipo Array. Esta la recibo como un String.
En concreto la variable contiene una serie de tipos de establecimientos, Restaurante, Bar, Bar-Restaurante, etc. Esta es: $tiposfin=$_POST['subTiposFin'];
En Android tiene el formato: [Restaurante, Bar, Bar-Restaurante,…] y en el mismo formato de cadena la recibo en php.
Lo que hago, es convertirla en un array, primero eliminando los corchetes:
$reemplazar1=str_replace("[", "", $tiposfin);
$reemplazar2=str_replace("]", "", $reemplazar1);
Y después convertirla en un array:
$tipos=explode(',', $reemplazar2);
El problema surge a la hora de recorrer el array para la consulta, tanto con for, foreach o while.
La consulta que me interesa es:
for ($y=0; $y<count($tipos); $y++) {
$result = mysql_query("select id_cliente, nombre, tipo, precio, icono1, localidad FROM restauracion WHERE tipo = $tipos");
}
Pero para saber que valores me está pasando, en la tabla en el campo ‘nombre’ utilizo:
for($i=0;$i<count($tipos);$i++) {
$sql = mysql_query("UPDATE restauracion SET nombre = '$tipos[$i]' WHERE tipo = 'Cómida para llevar'");
}
Y entonces el problema es el siguiente, si el array tiene tres valores p.e. (Restaurante, Bar, Bar-Restaurante), sólo devuelve el último, en este caso Bar-Restaurante. No se a que se puede deber.
Estaba buscando info porque tenia un problema parecido al tuyopero al final lo solucione. De todas formas he leido tu primer post y a mi parecer la consulta que realizas dentro del for esta mal no?.

Es decir, esta es tu consulta...

for ($y=0; $y<count($tipos); $y++) {
$result = mysql_query("select id_cliente, nombre, tipo, precio, icono1, localidad FROM restauracion WHERE tipo = $tipos");
}

Hay un fallo a mi parecer justo cuando llamas a la variable dentro del for... no le indicas que repetición es que la que quieres consultar, solo le mandas el array entero. tu consulta no debria ser.

for ($y=0; $y<count($tipos); $y++) {
$result = mysql_query("select id_cliente, nombre, tipo, precio, icono1, localidad FROM restauracion WHERE tipo = $tipos[$y]");
}
  #10 (permalink)  
Antiguo 14/10/2015, 03:21
 
Fecha de Ingreso: mayo-2014
Mensajes: 45
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Si llevas razón, como estoy haciendo pruebas se me ha pasado ese error. De todas formas con:
for($i=0; $i<$longtipos; $i++){
$result = mysql_query("select id_cliente, nombre, tipo, precio, icono1, localidad FROM restauracion WHERE tipo = '$tipos[$i]'");
}

O bien con:
foreach($tipos as $check) {
$result = mysql_query("select id_cliente, nombre, tipo, precio, icono1, localidad FROM restauracion WHERE tipo = '$check'");
}
Me sigue dando el mismo problema, solo me toma el último valor del array, y lo que debe pasar es que conforme va leyendo valores del array os va pisando y al final solo sale el último.
  #11 (permalink)  
Antiguo 14/10/2015, 09:00
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Cita:
Me sigue dando el mismo problema, solo me toma el último valor del array, y lo que debe pasar es que conforme va leyendo valores del array os va pisando y al final solo sale el último.
Ya te lo he dicho desde el principio, seguramente usas el valor fuera del loop, por lo tanto siempre será el último recorrido.

¿Por qué no muestras el 100% del código para entender mejor?

Es decir, por más que muestres el loop que haces no sirve de nada, el problema es todo tu código no sólo el loop.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 14/10/2015, 13:50
 
Fecha de Ingreso: mayo-2014
Mensajes: 45
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Ahí va el código.
<?php
// array JSON response
$response = array();
include_once($_SERVER['DOCUMENT_ROOT'].'/AccesoDatos/conex/db_tablas.php');
$conexion = new DB_CONNECT();
mysql_query("SET NAMES 'UTF8'");

$tiposfin=$_POST['subTiposFin'];
$reemplazar1=str_replace('[','',$tiposfin);
$reemplazar2=str_replace(']','',$reemplazar1);
$tipos=explode(', ', $reemplazar2);
$longtipos=count($tipos);

foreach($tipos as $check) {
$result = mysql_query("select id_cliente, nombre, tipo, precio, icono1, localidad FROM restauracion WHERE tipo = '$check'");
}
if (mysql_num_rows($result) > 0) {
// looping through all results
// products node
$response['restauracion'] = array();
while ($row = mysql_fetch_array($result)) {
$product = array();
$product["id_cliente"] = $row["id_cliente"];
$product["nombre"] = $row["nombre"];
$product["tipo"] = $row["tipo"];
$product["precio"] = $row["precio"];
$product["localidad"] = $row["localidad"];
$product["icono1"] = $row["icono1"];
array_push($response['restauracion'], $product);
}
// success
$response["success"] = 1;
$response["message"] = "Product actualizado.";
// JSON response
echo json_encode($response);
} else {
$response["success"] = 0;
$response["message"] = "No se encuentran products";
// echo no users JSON
echo json_encode($response);
}
?>
  #13 (permalink)  
Antiguo 14/10/2015, 14:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Pues es justo lo que te estoy diciendo, el foreach() que haces es sencillamente inútil, porque fuera de el es que usas $result y por eso es que siempre obtienes el último.

¿Qué no sabes cómo funcionan las estructuras de control?

Código PHP:
Ver original
  1. // MAL
  2. foreach ($foo as $bar) {
  3.   $candy = something_with($bar);
  4. }
  5.  
  6. if ($candy) // ...

Si quieres usar el $result actual de cada vuelta del foreach() entonces debes meter todo tu código dentro del foreach() para que esté al mismo alcance.
Código PHP:
Ver original
  1. // BIEN
  2. foreach ($foo as $bar) {
  3.   $candy = something_with($bar);
  4.  
  5.   if ($candy) // ...
  6. }

¿Ya entiendes cual es tu error?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #14 (permalink)  
Antiguo 15/10/2015, 02:57
 
Fecha de Ingreso: mayo-2014
Mensajes: 45
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Recorrer array para una consulta, solo asigna el último valor.

Si, queda aclarado lo de foreach. De todas formas lo hice de la siguiente manera:
$tiposfin=$_POST['subTiposFin'];
$reemplazar1=str_replace('[','',$tiposfin);
$reemplazar2=str_replace(']','',$reemplazar1);
$tipos=explode(', ', $reemplazar2);
$tipos_trim = implode("','", array_map('trim', $tipos));

$result = mysql_query("select id_cliente, nombre, tipo, precio, icono1, localidad FROM restauracion WHERE tipo IN('$tipos_trim')");

De nuevo muchas gracias por vuestra ayuda, el funcionamiento de los bucles me viene muy bien entenderlo para el futuro.

Etiquetas: mysql, select, sql, tabla, variable
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 21:34.