Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Problema con actualizacion de registrosen una Base de Datos

Estas en el tema de Problema con actualizacion de registrosen una Base de Datos en el foro de Bases de Datos General en Foros del Web. Caballeros buenas tardes. Mi problema es el siguiente: Estoy desarrollando un sistema que califica noticias, cada noticia se puede calificar por separado, el usuario al ...
  #1 (permalink)  
Antiguo 01/07/2010, 15:19
 
Fecha de Ingreso: junio-2010
Mensajes: 60
Antigüedad: 14 años, 5 meses
Puntos: 0
Problema con actualizacion de registrosen una Base de Datos

Caballeros buenas tardes.

Mi problema es el siguiente:

Estoy desarrollando un sistema que califica noticias, cada noticia se puede calificar por separado, el usuario al hacer click en un boton, envia un voto a la base de datos y se va incrementando la cantidad de votos de la noticia, yo puedo publicar muchas noticias y cada noticia tendra su boton de calificacion.

ya tengo creado un php que se llama voto.php que se activa cada vez que el usuario le da click al boton de votacion, en el archivo voto.php aparece la siguiente sentencia.

$voto = mysql_query ("insert into voto (voto) values ('$voto')");
$consulta = mysql_query ($voto, $conexion);
$sumavotos = mysql_query ("update voto set voto=voto+1 where Id_voto=Id_voto");
$consulta = mysql_query ($sumavotos, $conexion);

la primier consulta ingresa el registro y la segunda va haciendo la actualizacion, en este caso la suma de votos de cada noticia, cabe aclarar que soy nuevo en el tema entonces perdonen si esa codificacion se ve redundante o algo asi.

la tabla voto tiene como clave foranea a Id_voto que se referencia con la tabla noticias con el campo Id_noticias y termina con la sentencia on delete cascade.

cuano yo publico una noticia y la voto esta me va acumulando los votos, hasta ahi todo bien

Pero cuando yo publico otra noticia y la voy a calificar, en vez de generarme otro registro en la tabla voto e irme acumulando los votos de esa nueva noticia en un nuevo registro de la tabla voto, me acumula el voto en el mismo registro de la noticia anterior y no se me generan mas registros.

Alguien me podria ayudar diciendome como hago para que cada noticia genere su propio registro en la tabla voto y cada noticia tenga su calificacion individual?

ESpero haberme explicado bien, si alguien no lo entiende por favor digame que yo mismo a veces me hago bolas.

Muchas gracias por su ayuda.
  #2 (permalink)  
Antiguo 06/07/2010, 14:15
 
Fecha de Ingreso: junio-2010
Mensajes: 60
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Problema con actualizacion de registrosen una Base de Datos

Que pena con ustedes.

Pero me parece injusto que nadie me ayude con este tema, ya lleva mas de 3 dias posteado y nadie me ha dicho nada.

Una vez mas voy a tratar de explicar lo que estoy haciendo y pondre el codigo para ver si me hago entender:

Haber:

Tengo una pagina donde estoy publcando noticias, estas noticias van a poder ser votadas, individualmente claro esta, para eso cree al lado de la noticia un boton que cada vez que se le da click en este, este agrega un voto a la BD este boton llama a una pagina llamada voto.php.

ESto es lo que hace esa pagina:

<?php
session_start();
error_reporting(0);
$conexion = mysql_connect ("localhost", "admin", "") or die (mysql_error());
mysql_select_db ("noos") or die (mysql_error());

if ($_POST['voto'])

{
$voto = mysql_query ("insert into voto (voto) values ('$voto')");
$consulta = mysql_query ($voto, $conexion);
$sumavotos = mysql_query ("update voto set voto=voto+1");
$consulta = mysql_query ($sumavotos, $conexion);
header ("location: index.php");
mysql_close ($conexion);
}



?>

la tabla voto solo consta de dos campos: Id_voto y voto, donde la primaria es Id_voto, esta tabla esta relacionada con la tabla noticias que es donde se almacenan las noticias que yo publico en esta pagina.

la relacion de clave foranea entre la tabla voto y la tabla noticias esta asi: ESto claro esta aparece o se configuro en la tabla voto:

foreign key (Id_voto) references noticias(Id_noticias)
on update cascade

pero resulta y pasa que cuando yo tomo cualquier noticia y le doy click al boton donde se suman los votos, este no me hace nada.

Ya intente poner que en el update quede asi:

update voto set voto=voto+1 where voto=Id_noticia

Se supone que si las dos tablas estan relacionadas el voto debe parar donde esta el Id de la noticia cierto?

osea que si a la noticia con id 2 le doy un voto ahi me acumule un voto a favor a esa noticia cierto?

Pero no, no hace nada, y si dejo en el update que el voto sea igual al Id del voto, entonces me actualiza, pero en todas las noticias y asi no me sirve, yo necesito que me la actualize individualmente, y dependiendo de a que noticia le di el voto.

Por favor ayudenme, no se si con esta explicacion quedo mas claro, o al menos diganme que no entienden, o que no quieren ayudarme, asi buscare ayuda en otra parte, pero por favor no ignoren el post.

Gracias.
  #3 (permalink)  
Antiguo 06/07/2010, 15:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
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)
  #4 (permalink)  
Antiguo 06/07/2010, 16:41
 
Fecha de Ingreso: junio-2010
Mensajes: 60
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Problema con actualizacion de registrosen una Base de Datos

Cita:
Iniciado por gnzsoloyo Ver Mensaje
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:
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 [URL="http://www.forosdelweb.com/f18/"]Foro de PHP[/URL].

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 [URL="http://ar.php.net/manual/es/function.mysql-insert-id.php"]mysql_insert_id()[/URL]:
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.


Hombre pues muchas gracias, la verdad muchas graias por tu ayuda, para mi desde la semana pasada ha sido un tema de quedarme calvo este del voto, y la verdad me he sentido muy perdido, pero la verdad tu ayuda me ha servido para darme cuenta de los errores que estoy cometiendo.

Muchas gracias por tu ayuda, e intentare corregir y aplicar lo que me has mostrado, muchas gracias por tu ayuda.

Etiquetas: actualizaciones
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 23:08.