Ver Mensaje Individual
  #10 (permalink)  
Antiguo 07/03/2010, 10:14
koruitch
 
Fecha de Ingreso: marzo-2010
Mensajes: 41
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ranking en PHP+SQL

4- Archivo PHP para actualizar el ranking (rank.php)
Con la base de datos, tablas y registros creados solo nos queda como actualizar los registros. El archivo rank.php se encargará de actualizarlos.
Código PHP:
Ver original
  1. <?php
  2.  //funcion para conectar con la base de datos
  3.  function conectar(){
  4.   // Conexión a la base de datos
  5.   $dbhost='localhost';
  6.   $dbusername='root'; //nombre del usuario
  7.   $dbuserpass='aki vuestra clave de mysql'; //password o contraseña del usuario  
  8.   $dbname='bd_rank';//nombre de la base de datos
  9.   $link = mysql_connect($dbhost, $dbusername,$dbuserpass);
  10.   mysql_select_db($dbname, $link);
  11.    
  12.   return $link;
  13.  }
  14.  
  15.  $id = $_GET['id'];//pagina, apartado o noticia que se quiere votar
  16.  
  17.  if($id!=""){
  18.   $voto = $_GET['v'];//voto del usuario
  19.   $link = conectar();//conectamos a la base de datos  
  20.  
  21.   //obtenemos la IP del usuario
  22.   if ($_SERVER) {
  23.    if ( $_SERVER[HTTP_X_FORWARDED_FOR] ) {
  24.     $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  25.    } elseif ( $_SERVER["HTTP_CLIENT_IP"] ) {
  26.     $realip = $_SERVER["HTTP_CLIENT_IP"];
  27.    } else {
  28.     $realip = $_SERVER["REMOTE_ADDR"];
  29.    }
  30.   } else {
  31.    if ( getenv( "HTTP_X_FORWARDED_FOR" ) ) {
  32.     $realip = getenv( "HTTP_X_FORWARDED_FOR" );
  33.    } elseif ( getenv( "HTTP_CLIENT_IP" ) ) {
  34.     $realip = getenv( "HTTP_CLIENT_IP" );
  35.    } else {
  36.     $realip = getenv( "REMOTE_ADDR" );
  37.    }
  38.   }    
  39.              
  40.   $fecha = date('Y-m-d');
  41.   //actualizamos la tabla de votos realizadas por los usuarios y borramos lo que sean del dia anterior
  42.   $result = mysql_query("DELETE FROM votos_usuarios WHERE dataCreate <> '".$fecha."'",$link);
  43.  
  44.   //comprobamos que este usuario ya no haya realizado un voto (identificacion por IP)
  45.   $result = mysql_query("SELECT *FROM votos_usuarios WHERE ip = '".$realip."' and id = $id",$link);        
  46.   $row = mysql_fetch_row($result);
  47.  
  48.   //el usuario no ha votado para este apartado
  49.   if($row[0]==""){
  50.    $result = mysql_query("SELECT votos,media FROM rank WHERE id =$id",$link);
  51.    $row = mysql_fetch_row($result);
  52.  
  53.    $auxmedia = $row[1];  
  54.    $votos =$row[0] + 1;  
  55.    $media = (($row[0] * $auxmedia) + $voto)/ $votos;  
  56.    //actualizamos el voto      
  57.    $result = mysql_query("UPDATE rank SET votos= $votos, media= $media WHERE id= $id",$link);    
  58.    mysql_query("INSERT INTO votos_usuarios(id,ip,dataCreate)VALUES($id,'".$realip."','".$fecha."')",$link);  
  59.    echo "voto realizado";
  60.   }else{ //el usuario ya ha votado para este apartado
  61.    echo "Usted ya ha votado";
  62.   }
  63.  }
  64. ?>

tendreis cambiar la clave y si es necesario el nombre de usuario de mysql al principio del codigo donde esta indicado,mas tarde os dire k haremos con todos estos archivos.En este archivo PHP hay una única funcion conectar() que realizará la conección a la base de datos y también contiene el código para actualizar el las tablas del ranking.


5- Actualizando los votos(rank.js)
Ahora el último paso realizar la llamada desde la página principal al archivo PHP para actualizar los datos. Basicamente se podria hacer de dos formas, la primera seria realizar una página extra donde se pasaran los valores, ID de la página y el valor del voto por el método POST o el método GET y utilizar la misma página, pero en este caso utilizaremos AJAX y para ello el archivo rank.js que lo único que hará es enviar los datos al archivo php y actualizar la página principal.

Código Javascript:
Ver original
  1. function objetoAjax(){
  2.  var xmlhttp=false;
  3.  try {
  4.   xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  5.  } catch (e) {
  6.   try {
  7.      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  8.   } catch (E) {
  9.    xmlhttp = false;
  10.     }
  11.  }
  12.  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  13.   xmlhttp = new XMLHttpRequest();
  14.  }
  15.  return xmlhttp;
  16. }
  17. function sendDatos(datos, resultado,borrar){
  18.  divResultado = document.getElementById(resultado);  
  19.  if(divResultado.innerHTML=='' || borrar){
  20.   ajax = objetoAjax();
  21.   if(datos!=""){
  22.    divResultado.innerHTML = "<span style='color:#ff0000;'>Loading...</span>";  
  23.    ajax.open("GET", datos);
  24.    ajax.onreadystatechange=function() {
  25.     if (ajax.readyState==4) {
  26.      divResultado.innerHTML = ajax.responseText
  27.     }
  28.    }
  29.    ajax.send(null);
  30.   }else divResultado.innerHTML ="";
  31.  }
  32. }

6- ahora copiamos el siguiente codigo en nuestra pagina donde queremos que salga el sistema de votacion (vuestapagina.php)es importante recordar k la pagina tiene k ser php no html.
Código PHP:
Ver original
  1. <?php
  2.   include("rank/rank.php");
  3.  
  4.   $link = conectar();
  5.   $result = mysql_query("SELECT id,votos,media FROM rank where id=1",$link);
  6.   $row = mysql_fetch_row($result);
  7.   if($row){  
  8.     echo '<div class="rank">';
  9.     echo '<ul>';
  10.     echo '<li class="current-rating" style="width:'.($row[2] * 25).'px;">Currently '.$row[2].'/5 Stars.</li>';
  11.     echo '<li><a href="javascript:sendDatos('rank/rank.php?id='.$row[0].'&v=1','page'.$row[0].'',true)" title="dar 1 estrella de 5" class="star-1">1</a></li>';
  12.     echo '<li><a href="javascript:sendDatos('rank/rank.php?id='.$row[0].'&v=2','page'.$row[0].'',true)" title="dar 2 estrellas de 5" class="star-2">2</a></li>';
  13.     echo '<li><a href="javascript:sendDatos('rank/rank.php?id='.$row[0].'&v=3','page'.$row[0].'',true)" title="dar 3 estrellas de 5" class="star-3">3</a></li>';
  14.     echo '<li><a href="javascript:sendDatos('rank/rank.php?id='.$row[0].'&v=4','page'.$row[0].'',true)"  title="dar 4 estrellas de 5" class="star-4">4</a></li>';
  15.     echo '<li><a href="javascript:sendDatos('rank/rank.php?id='.$row[0].'&v=5','page'.$row[0].'',true)" title="dar 5 estrellas de 5" class="star-5">5</a></li>';
  16.     echo '</ul>';
  17.     echo 'Media <strong>'.$row[2].'</strong>/5 estrellas ('.$row[1].' votos)';
  18.     echo '<span id="page'.$row[0].'" style="color:#ff0000;"></span>';
  19.     echo '</div>';
  20.   }
  21. ?>

El código es similar al del paso 2, donde ahora se llama a la función javascript senDatos(), pasando como parámetro el identificador de la página o sección, la valoración del voto (1-5) y un parametro final que tiene se valer siempre true.

asi es como lo tengo yo creo k e modificao algo por ahi del original.

Bueno con todos esos archivos los ponemos todos juntos con la imagen k tenemos k ponerle el nombre rank.gif los metemos todos en una carpeta
con nombre rank en el mismo directorio k la pagina web las estrellas podeis bajarlas o guardar como de la pagina que puse al inicio en donde esta el manual original.

bueno y ahora mi problema y creo k sera el final del manual el tema es que esto seria para un unico sistema de votacion es decir para votar una unica cosa yo toy creando una web de manuales cada manual esta en una pagina diferente y claro copio el codigo en por ejemplo manual1.php y funciona de maravilla el problema esta cuando creo manual2.php al poner el mismo codigo el sistema de votacion con la misma base de datos me manda la misma informacion,la misma media,los mismos votos no logro encontrar la solucion no tengo muchos conocimientos de php y mysql por eso pido ayuda.no puedo crear una base de datos para cada manual xk son muchisimos.

lo que seria bien seria un codigo que lea el titulo de pagina y envie los datos segun ese titulo asi el codigo seria el mismo para todas las paginas y seguramente para eso abria k modificar la base de datos,no se.bueno haber k me decis.

luego creo que ya seria mas facil crear para la pagina de inicio un top10 como los 10 mas votados.

haber si me podeis ayudar.gracias.

Última edición por koruitch; 07/03/2010 a las 13:03