Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Update con suma

Estas en el tema de Update con suma en el foro de PHP en Foros del Web. Buenas noches, estoy intentado desarrollar un pequeño panel de actualización para la web de un amigo. Me pidió que en un formulario, rellenando una cantidad ...
  #1 (permalink)  
Antiguo 04/01/2016, 18:56
 
Fecha de Ingreso: julio-2015
Mensajes: 67
Antigüedad: 8 años, 9 meses
Puntos: 5
Update con suma

Buenas noches, estoy intentado desarrollar un pequeño panel de actualización para la web de un amigo.

Me pidió que en un formulario, rellenando una cantidad de campos con las actualizaciones, estos se sumaran a los puntos que ya tenía el usuario, hasta aquí todo bien.

El problema está en que el Update se ejecuta siempre, por lo tanto siempre está sumando los puntos que aparecen en el campo input del form.

El código que tengo es el siguiente:

Código PHP:
Ver original
  1. $qy = "SELECT * FROM clasificaciones";
  2. $qry = mysqli_query($con, $qy);
  3. while($rows = mysqli_fetch_assoc($qry)){
  4.     $pts = $rows['puntos'];
  5.     $pj = $rows['partidos_jugados'];
  6.     $pg = $rows['partidos_ganados'];
  7.     $pp = $rows['partidos_perdidos'];
  8.     $um = $rows['unidades_matadas'];
  9.     $up = $rows['unidades_perdidas'];
  10.     $ea = $rows['edifios_arrasados'];
  11.     $ep = $rows['edificios_perdidos'];
  12.     $ct = $rows['catillos_totales'];
  13.     $rc = $rows['reliquias_capturadas'];
  14.     $pa = $rows['poblacion_aldeanos'];
  15.     $pt = $rows['puntuacion_total'];
  16.     echo $pts;
  17. }
  18.  
  19. if(isset($_POST['guardar'])){
  20.     $id = $_POST['id'];
  21.  
  22.     for($i=0; $i<count($id); $i++){
  23.         $ptos = $_POST['puntos'][$i];
  24.         $p_j = $_POST['pj'][$i];
  25.         $p_g = $_POST['pg'][$i];
  26.         $p_p = $_POST['pp'][$i];
  27.         $u_m = $_POST['um'][$i];
  28.         $u_p = $_POST['up'][$i];
  29.         $e_a = $_POST['ea'][$i];
  30.         $e_p = $_POST['ep'][$i];
  31.         $c_t = $_POST['ct'][$i];
  32.         $r_c = $_POST['rc'][$i];
  33.         $p_a = $_POST['pa'][$i];
  34.         $p_t = $_POST['pt'][$i];
  35.  
  36.         echo "<br>";
  37.  
  38. $update = "UPDATE clasificaciones SET
  39. puntos=$pts+$ptos,
  40. partidos_jugados=$pj+$p_j,
  41. partidos_ganados=$pg+$p_g,
  42. partidos_perdidos=$pp+$p_p,
  43. unidades_matadas=$um+$u_m,
  44. unidades_perdidas=$up+$u_p,
  45. edifios_arrasados=$ea+$e_a,
  46. edificios_perdidos=$ep+$e_p,
  47. catillos_totales=$ct+$c_t,
  48. reliquias_capturadas=$rc+$r_c,
  49. poblacion_aldeanos=$pa+$p_a,
  50. puntuacion_total=$pt+$p_t
  51. WHERE id=$id[$i]";
  52.        
  53. $updt = mysqli_query($con, $update);
  54.  
  55. echo $update;
  56.     }
  57. }

Para realizar la suma lo que he hecho ha sido realizar una consulta a la BD, metiendo los resultados en variables que luego utilizo en el Update junto a las que vienen del formulario.

Más tarde me di cuenta de que en realidad la consulta da lo mismo, basta con poner en el Update SET puntos = puntos + $pts, es algo a modificar también, pero ahora me urge mucho más el tema de la suma.

Le he dado mil vueltas a la cabeza, y no encuentro la forma de solucionar esto.

Un saludo y gracias
  #2 (permalink)  
Antiguo 04/01/2016, 19:11
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Update con suma

Es que sumar puede ser un error de concepto
Como tienes el formulario?
En tu formulario, deberías pasar el valor de puntos actuales en la bd como value por defecto, para si se quiere modificar lo o no.
  #3 (permalink)  
Antiguo 04/01/2016, 19:18
 
Fecha de Ingreso: julio-2015
Mensajes: 67
Antigüedad: 8 años, 9 meses
Puntos: 5
Respuesta: Update con suma

El formulario es el siguiente:
Código PHP:
Ver original
  1. <tr>
  2.                 <input type="hidden" name="id[<? echo $cont; ?>]" value="<? echo $id; ?>"/>
  3.                 <td><input type="text" name="usuario[<? echo $cont; ?>]" value="<? echo $usuario; ?>" readonly /></td>
  4.                 <td><input type="number" name="puntos[<? echo $cont; ?>]" value="<? echo $puntos; ?>"/></td>
  5.                 <td><input type="number" name="pj[<? echo $cont; ?>]" value="<? echo $pj; ?>"/></td>
  6.                 <td><input type="number" name="pg[<? echo $cont; ?>]" value="<? echo $pg; ?>"/></td>
  7.                 <td><input type="number" name="pp[<? echo $cont; ?>]" value="<? echo $pp; ?>"/></td>
  8.                 <td><input type="number" name="um[<? echo $cont; ?>]" value="<? echo $um; ?>"/></td>
  9.                 <td><input type="number" name="up[<? echo $cont; ?>]" value="<? echo $up; ?>"/></td>
  10.                 <td><input type="number" name="ea[<? echo $cont; ?>]" value="<? echo $ea; ?>"/></td>
  11.                 <td><input type="number" name="ep[<? echo $cont; ?>]" value="<? echo $ep; ?>"/></td>
  12.                 <td><input type="number" name="ct[<? echo $cont; ?>]" value="<? echo $ct; ?>"/></td>
  13.                 <td><input type="number" name="rc[<? echo $cont; ?>]" value="<? echo $rc; ?>"/></td>
  14.                 <td><input type="number" name="pa[<? echo $cont; ?>]" value="<? echo $pa; ?>"/></td>
  15.                 <td><input type="number" name="pt[<? echo $cont; ?>]" value="<? echo $pt; ?>"/></td>
  16.             </tr>

A la hora de sumar lo hago sin problema, luego el erro está en que el Update toma siempre el valor que hay en el campo del formulario y lo suma una y otra vez :(

Gracias por la respuesta.
  #4 (permalink)  
Antiguo 04/01/2016, 19:25
 
Fecha de Ingreso: diciembre-2015
Mensajes: 529
Antigüedad: 8 años, 4 meses
Puntos: 39
Respuesta: Update con suma

Es porque la update lo tienes dentro del for, y actualiza tantas veces cuenta el id, prueba sacandolo de ahí.

Edito. Una duda, para qué es el for?
  #5 (permalink)  
Antiguo 04/01/2016, 19:32
 
Fecha de Ingreso: julio-2015
Mensajes: 67
Antigüedad: 8 años, 9 meses
Puntos: 5
Respuesta: Update con suma

Si saco el update del for no me actualizará todos los registros que se modifiquen.

A ver si soy capaz de explicarlo bien, el for lo utilizo dándole un índice a cada registro, para si modifico varios registros en el mismo formulario, dándole únicamente a un submit, se registren todas las actualizaciones.

Es decir, que si modifico 3 filas, se hagan los cambios en las 3 filas, sin tener que ir haciéndolo una por una.

No sé si me expliqué bien.
  #6 (permalink)  
Antiguo 04/01/2016, 19:36
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Update con suma

Es que no deberías de hacer ninguna suma, simplemente actualizar con el valor que recibes del formulario.
  #7 (permalink)  
Antiguo 04/01/2016, 19:45
 
Fecha de Ingreso: diciembre-2015
Mensajes: 529
Antigüedad: 8 años, 4 meses
Puntos: 39
Respuesta: Update con suma

Para lo que necesitas, podrías en ves del for, usar un foreach con las claves primarias. Algo así

Código PHP:
Ver original
  1. foreach($_POST['id'] as $key => $value)
  2. {
  3.  
  4.  
  5. }

Y dentro
Código PHP:
Ver original
  1. $ptos = $_POST['puntos'][$key]; // esto para cada POST
  2.  
  3. $update = "UPDATE clasificaciones SET
  4. puntos=$pts+$ptos,
  5. partidos_jugados=$pj+$p_j,
  6. partidos_ganados=$pg+$p_g,
  7. partidos_perdidos=$pp+$p_p,
  8. unidades_matadas=$um+$u_m,
  9. unidades_perdidas=$up+$u_p,
  10. edifios_arrasados=$ea+$e_a,
  11. edificios_perdidos=$ep+$e_p,
  12. catillos_totales=$ct+$c_t,
  13. reliquias_capturadas=$rc+$r_c,
  14. poblacion_aldeanos=$pa+$p_a,
  15. puntuacion_total=$pt+$p_t
  16. WHERE id=$value";
  #8 (permalink)  
Antiguo 04/01/2016, 19:49
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Update con suma

A ver si me explico. En el el input puntos estas pasando como value los puntos actuales en bd. Y luego es la consulta a esos punto le sumas el valor que envíes. Si lo envías tal cual sin modificar estas es como si multiplicará por 2.

Dos soluciones o no sumar, y escribir en el formulario el valor al que quieres actualizar
Código PHP:
Ver original
  1. $update = "UPDATE clasificaciones SET
  2.    puntos=$ptos,
  3.    partidos_jugados=$pj+$p_j,
  4.    partidos_ganados=$pg+$p_g,
  5.    partidos_perdidos=$pp+$p_p,
  6.    unidades_matadas=$um+$u_m,
  7.    unidades_perdidas=$up+$u_p,
  8.    edifios_arrasados=$ea+$e_a,
  9.    edificios_perdidos=$ep+$e_p,
  10.    catillos_totales=$ct+$c_t,
  11.    reliquias_capturadas=$rc+$r_c,
  12.    poblacion_aldeanos=$pa+$p_a,
  13.    puntuacion_total=$pt+$p_t
  14.    WHERE id=$id[$i]";

O establecer el value del input a 0 para que sume lo que escribas.
Código PHP:
Ver original
  1. <td><input type="number" name="puntos[<? echo $cont; ?>]" value="0" placeholder="<? echo $puntos; ?>"/></td>

Última edición por xerifandtomas; 04/01/2016 a las 20:02
  #9 (permalink)  
Antiguo 04/01/2016, 20:16
 
Fecha de Ingreso: julio-2015
Mensajes: 67
Antigüedad: 8 años, 9 meses
Puntos: 5
Respuesta: Update con suma

Cita:
Iniciado por rodocoyote15 Ver Mensaje
Para lo que necesitas, podrías en ves del for, usar un foreach con las claves primarias.
Gracias, no sé si entiendo bien..eso realmente es similar a lo que tengo yo con el for ¿no? Pero con un foreach por el tema de array.

Cita:
Iniciado por xerifandtomas Ver Mensaje
A ver si me explico. En el el input puntos estas pasando como value los puntos actuales en bd. Y luego es la consulta a esos punto le sumas el valor que envíes. Si lo envías tal cual sin modificar estas es como si multiplicará por 2.

Dos soluciones o no sumar, y escribir en el formulario el valor al que quieres actualizar

O establecer el value del input a 0 para que sume lo que escribas.
Código PHP:
Ver original
  1. <td><input type="number" name="puntos[<? echo $cont; ?>]" value="0" placeholder="<? echo $puntos; ?>"/></td>
Perfecto, ahora sí.. claro, realmente el problema estaba en lo que enviaba todo el rato con value, pensaba que podría existir alguna forma de usar if y else para tratarlo, pudiendo dejar el value como lo tenía.

De la forma que me indicas dio problema también, pero vamos..con quitar el value y dejar únicamente el placeholder funciona perfecto, muestro el valor actual que tiene con él, y luego relleno el campo y lo envío, y ya se hace la suma una única vez, sin repetirse.

Jamás hubiera pensado en eso, jeje.

Código PHP:
Ver original
  1. <td><input type="number" name="puntos[<? echo $cont; ?>]" placeholder="<? echo $puntos; ?> "/></td>

Muchas gracias, me has quitado un gran dolor de cabeza.

Etiquetas: formulario, mysql, select, suma, update, 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 18:16.