> Manuales > Taller de PHP

Sistema creado en PHP y MySQL para implementar la posibilidad de que los usuarios puedan votar una página web.

El proceso es similar o mejor dicho el mismo empleado para sacar cualquier promedio, por ejemplo (El promedio de notas de un estudiante).

PTOS ACUMULADOS / TOTAL DE ACUMULACIONES

Para ello utilizaremos una tabla de datos:

<? CREATE TABLE `valoraciones` (
    `id_noticia` int(9) NOT NULL default '0',
    `num_votos` int(20) NOT NULL default '0',
    `ptos` int(20) NOT NULL default '0'
) TYPE=MyISAM;
?>


Cabe destacar que no es necesario utilizar una tabla de datos individual, siempre y cuando se cuente con una tabla general de artículos o contenidos y obviamente se dispongan al menos de los dos últimos campos de esta tabla, para el funcionamiento del script.

Este sistema trabaja con 1 solo registro por artículo o contenido, donde el campo id_noticia, se refiere al identificador de nuestra noticia o contenido, num_votos; el total de votos realizados entorno a ese contenido y ptos la suma de todos los votos:

Por ejemplo:

id_noticia= 00001 - nuestra primera noticia
num_votos= 3 - solo tres votos en esta noticia.
Ptos= 15 - es probable que los tres hayan votado por 5 puntos.

Entonces lógicamente la valoración media es de 5 ptos.

Código Fuente:

<?
#####CONEXIÓN A MYSQL
@mysql_connect('localhost','usuario','pass')or die ('Ha fallado la conexión: '.mysql_error());
@mysql_select_db('base_de_datos')or die ('Error al seleccionar la BD: '.mysql_error());
////end conexión
$SSQL_=mysql_query("SELECT * FROM valoraciones WHERE id_noticia='".$_GET[id]."'")or die(mysql_error());
$array_d=mysql_fetch_array($SSQL_);
$valoracioN_total=@round($array_d[ptos]/$array_d[num_votos],2);

if(isset($_POST[valor])){
   if(mysql_num_rows($SSQL_)==0){
   @mysql_query("INSERT INTO valoraciones VALUES('".$_GET[id]."','1','".$_POST[valor]."')")or die ('ERROR AL INSERTAR REGISTRO: '.mysql_error());
   }else{
   @mysql_query("UPDATE valoraciones SET num_votos=num_votos+1,ptos=ptos+".$_POST[valor]." WHERE id_noticia='".$_GET[id]."'")or die ('ERROR AL MODIFICAR REGISTRO: '.mysql_error());
   }
   header('Location:'.$REQUEST_URI);
   exit;
}

echo '<strong>Valoración Media : '.$valoracioN_total.'</strong> <div style="background-color:#EFEFEF; width:50px"><img width="'.($valoracioN_total*5).'" height="6" style="background-color: #000099"></div> <br>Total de votos: '.$array_d[num_votos];

?><hr>
<form action="<? echo $REQUEST_URI;?>" method="post">
Nueva valoración:
<select name="valor" id="valor">
<? for ($i=1; $i<=10 ; $i++) echo '<option value="'.$i.'">'.$i.'</option>';?>
</select>
<input type="submit" value="Votar por este artículo">
</form>


Explicando:

Primero que nada, como de costumbre creamos la conexión al servidor de mysql; donde debemos aportar nuestros datos de acceso reales.

Seleccionamos la base de datos sobre la cual trabaremos.

Y generamos una petición al servidor Mysql mysql_query(); donde solicitamos los registros almacenados previamente por cada contenido o artículo.

Le asignamos a la variable $array_d, la matriz devuelta por mysql_fetch_array(), para luego agrupar en la variable $valoracioN_total; el valor devuelto por la división entre $array_d[ptos] y $array_d[num_votos], redondeamos el valor con 2 decimales round(), le colocamos el @ al comienzo de la función para evitar que se muestren posibles errores por si acaso la división es entre 0 (cero).

Finalmente iniciamos una condición para comprobar si ($_POST[valor]) esta definida, es decir si se esta procesando el formulario para insertar nuevas valoraciones. Si la condición evalúa TRUE entonces ejecutamos una serie de instrucciones, siendo la primera una nueva condición:

if(mysql_num_rows($SSQL_)==0):

Para comprobar si aún no hay ningún registro o valoración e insertar uno nuevo.
@mysql_query("INSERT INTO…

De lo contrario ( else) quiere decir en esta ocasión que ya ha votado al menos 1 persona y por ende no podemos hacer un nuevo registro, si no más bien una modificación del ya existente.

@mysql_query("UPDATE valoraciones…

Posteriormente sin importar cual de las dos rutinas halla seleccionado el script, realiza una redirección header(Location: … ) a .$REQUEST_URI, que es exactamente la misma URL , para que el usuario vea los datos actualizados. Es decir su voto agregado a la lista.

Finalmente imprimimos el resultado, con un grafico y agregamos el formulario que se utilizara para una próxima votación.

Ya quedaría de parte de ustedes modificarlo un poco (si desean) para que el usuario pueda votar solo 1 vez.

Emmanuel García De Caro

Webmaster de Blasten.com

Manual