Ver Mensaje Individual
  #3 (permalink)  
Antiguo 06/07/2010, 15:58
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con actualizacion de registrosen una Base de Datos

Vamos por partes, y no te molestes por lo que te digo: Es habitual que un post no se responda cuando sea el tema o la forma de presentarlo no estimula el interés de los foristas. No tiene nada de malo ni de bueno. Simplemente que nadie se entusiasmó con el asunto, a mi entender porque los temas de votaciones, noticias, o el funcionamiento de un programa, la mayoría de las veces tiene que ver con el programa, y no con la base de datos.
Tal vez te parezca que no, pero el caso es que casi todo tu problema es de programación, y programación no es el tema de este foro. Para eso están los de PHP, ASP, VB, etc.

Volviendo a tu problema, hay, sí, algunos defectos en las sentencias de SQL, pero no son defectos sintácticos: Son errores de lógica.
Caso 1: Estás usando aparentemente el mismo nombre para la tabla que para un campo de la misma:
Cita:
insert into voto (voto) values ('$voto')
Esto puede producir resultados erráticos porque MySQL puede confundir cuando invocas a la tabla de cuando invocas al campo, y eso simplemente porque el parser hace una interpretación jerárquica de los nombres, y la tabla está más arriba en esa jerarquía...
No uses los mismos nombres para los diferentes objetos de la base, ni aunque MySQL te los acepte.
Sugerencia: cuando sean identificadores, ponle un sufijo:

Código MySQL:
Ver original
  1. insert into voto (voto_id) values ('$voto')
Obviamente, esto implica que deberás reformar las tablas...

Caso 2: Estás indicando operaciones sin verificar lo que estás poniendo en las condiciones del WHERE:
Código MySQL:
Ver original
  1. UPDATE voto SET voto=voto+1 WHERE Id_voto=Id_voto;
Esto le dice a MySQL que incfremente en 1 en campo si el id_voto es igual a si mismo... O sea, siempre.
Siempre un número va a ser igual a si mismo. El el principio de reflexibilidad de lógica. A = A.
Ese WHERE no tiene sentido, y además lo que hace es que te incremente todos los registros de votaciones. TODOS. Porque en todos se cumple esa condición.

Algo parecido pasa con esto que pusiste en el segundo post:
Código MySQL:
Ver original
  1. update voto set voto=voto+1
A nivel de lógica, es exactamente igual que el anterior, porque la actualización del acumulador se realizará en todos los registros disponibles...

¿Cuál es la solución?
Simple: Debes indicar una condición lógica coherente. El IdVoto debe ser igual al valor de una variable obtenida previamente, en la cual conservas el IdVoto que corresponde a la noticia que estás votando...
Pero eso es tema de programación. Consulta esos detalles en el Foro de PHP.

Caso 3: No estás recuperando un identificador válido.
En este código:
Código php:
Ver original
  1. <?php
  2. $conexion = mysql_connect ("localhost", "admin", "") or die (mysql_error());
  3.  
  4. if ($_POST['voto'])
  5. {
  6. $voto = mysql_query ("insert into voto (voto) values ('$voto')");
  7. $consulta = mysql_query ($voto, $conexion);
  8. $sumavotos = mysql_query ("update voto set voto=voto+1");
  9. $consulta = mysql_query ($sumavotos, $conexion);
  10. header ("location: index.php");
  11. mysql_close ($conexion);
  12. }
  13. ?>
No estás realmente recuperando el valor del último id autoincremental generado en el INSERT. Para hacerlo deberías haber usado mysql_insert_id():
Código PHP:
Ver original
  1. <?php
  2. $query = sprintf( "INSERT INTO `users`"
  3.     ."(`id`    ,`username`)"
  4.     ."VALUES"
  5.     ."(UUID(),'%s'           )",
  6.   );
  7.  
  8. if( !mysql_query($query) )
  9. {/*insert failed*/}
  10.  
  11. ?>

Espero que estos detalles te orienten, pero si el problema es realmente de PHP, te recomiendo postear la duda en el foro correcto, porque allí recibirás mejor asesorameitno sobre ese lenguaje.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)