Foros del Web » Programando para Internet » PHP »

Ranking en PHP+SQL

Estas en el tema de Ranking en PHP+SQL en el foro de PHP en Foros del Web. Tengo el siguiente codigo que funciona muy bien. Archivo css (rank.css) Código HTML: .rank ul { list-style: none; margin: 3px; padding: 0px; width: 125px; height: ...
  #1 (permalink)  
Antiguo 06/03/2010, 14:53
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 5 meses
Puntos: 6
Ranking en PHP+SQL

Tengo el siguiente codigo que funciona muy bien.

Archivo css (rank.css)
Código HTML:
.rank ul {
	list-style: none;
	margin: 3px;
	padding: 0px;
	width: 125px;
	height: 25px;
	position: relative;
	background: url(rating.gif) top left repeat-x;
	margin-left:0px;
}
.rank li {
	padding: 0px;
	margin: 0px;	
	float: left;	
}
.rank li.current-rating {
	background: url(rating.gif) left bottom;
	position: absolute;
	height: 25px;
	display: block;
	text-indent: -9000px;
	z-index: 1;
}
.rank li a {
	display: block;
	width: 25px;
	height: 25px;
	text-decoration: none;
	text-indent: -9000px;
	z-index: 20;
	position: absolute;
	padding: 0px;
	background-image: none;
}
.rank li a:hover {
	background: url(rating.gif) left center;
	z-index: 1;
	left: 0px;
}
.rank a.star-1 {left: 0px;}
.rank a.star-1:hover {width: 25px;}
.rank a.star-2 {left: 25px;}
.rank a.star-2:hover {width: 50px;}
.rank a.star-3 {left: 50px;}
.rank a.star-3:hover {width: 75px;}
.rank a.star-4 {left: 75px;}
.rank a.star-4:hover {width: 100px;}
.rank a.star-5 {left: 100px;}
.rank a.star-5:hover {width: 125px;}	
		
Código HTML:
CREATE TABLE `votos_usuarios` (
  `id` INT NOT NULL default '0',
  `ip` char(15) NOT NULL default '',
  `dataCreate` date NOT NULL default '0000-00-00'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `rank` (
  `id` INT NOT NULL default '0',
  `media` FLOAT NOT NULL default '0',
  `votos` INT NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ranking (rank.php)



Código PHP:

<?php
  
//funcion para conectar con la base de datos
  
function conectar(){
    
// Conexión a la base de datos
    
$dbhost='localhost';
    
$dbusername='user'//nombre del usuario
    
$dbuserpass='clave'//password o contraseña del usuario
    
$dbname='myDB';//nombre de la base de datos        
    
    
$link mysql_connect($dbhost$dbusername,$dbuserpass);
    
mysql_select_db($dbname$link);
    return 
$link;
  }

  
$id $_GET['id_pagina'];//pagina, apartado o noticia que se quiere votar
  
  
if($id!=""){
    
$link conectar();//conectamos a la base de datos
    
$voto $_GET['v'];//voto del usuario    
        
    //obtenemos la IP del usuario
    
if($_SERVER){
      if(
$_SERVER[HTTP_X_FORWARDED_FOR]){
        
$realip $_SERVER["HTTP_X_FORWARDED_FOR"];
      }elseif(
$_SERVER["HTTP_CLIENT_IP"]){
        
$realip $_SERVER["HTTP_CLIENT_IP"];
      }else{
        
$realip $_SERVER["REMOTE_ADDR"];
      }
    }else{
      if(
getenv"HTTP_X_FORWARDED_FOR")){
        
$realip getenv"HTTP_X_FORWARDED_FOR");
      }elseif(
getenv"HTTP_CLIENT_IP")){
        
$realip getenv"HTTP_CLIENT_IP" );
      }else{
        
$realip getenv"REMOTE_ADDR" );
      }
    }                    
                                                        
    
$fecha date('Y-m-d');
    
//actualizamos la tabla de votos realizadas por los usuarios y borramos lo que sean del dia anterior
    
$result mysql_query("DELETE FROM votos_usuarios WHERE dataCreate <> '".$fecha."'",$link);
    
    
//comprobamos que este usuario ya no haya realizado un voto (identificacion por IP)
    
$result mysql_query("SELECT *FROM votos_usuarios WHERE ip = '".$realip."' and id = $id",$link);                                
    
$row mysql_fetch_row($result);
        
    
//el usuario no ha votado para este apartado
    
if($row[0]==""){    
      
$result mysql_query("SELECT votos,media FROM ".$tabla[$tipo]." WHERE id =$id",$link);
      
$row mysql_fetch_row($result);
        
      
$auxmedia $row[1];        
      
$votos =$row[0] + 1;            
      
$media = (($row[0] * $auxmedia) + $voto)/ $votos;            
      
//actualizamos el voto                            
      
$result mysql_query("UPDATE rank SET votos= $votos, media= $media WHERE id= $id",$link);                
      
mysql_query("INSERT INTO rank(id,ip,dataCreate)VALUES($id,'".$realip."','".$fecha."')",$link);            
      echo 
"voto realizado";
    }else{ 
//el usuario ya ha votado para este apartado
      
echo "Usted ya ha votado";    
    }
  }
?>
votos(rank.js)


Código HTML:

function objetoAjax(){
  var xmlhttp=false;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
    try{
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }catch(E){
      xmlhttp = false;
    }
  }

  if(!xmlhttp && typeof XMLHttpRequest!='undefined'){
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}

function sendDatos(datos, resultado,borrar){	
  divResultado = document.getElementById(resultado);			
  if(divResultado.innerHTML=='' || borrar){
    ajax = objetoAjax();
    if(datos!=""){
      divResultado.innerHTML = "<span style='color:#ff0000;'>Loading...</span>";		
      ajax.open("GET", datos);
      ajax.onreadystatechange=function(){
        if(ajax.readyState==4){
          divResultado.innerHTML = ajax.responseText
        }
      }
      ajax.send(null);
    }else divResultado.innerHTML ="";
  }
}

(index.php)

Código PHP:
<?php
  
include("rank/rank.php");
        
  
$link conectar();
  
$result mysql_query("SELECT id,votos,media FROM rank where id=1",$link);
  
$row mysql_fetch_row($result);
  if(
$row){        
    echo 
'<div class="rank">';
    echo 
'<ul>';
    echo 
'<li class="current-rating" style="width:'.($row[2] * 25).'px;">Currently '.$row[2].'/5 Stars.</li>';
    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>';
    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>';
    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>';
    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>';
    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>';
    echo 
'</ul>';
    echo 
'Rated <strong>'.$row[2].'</strong>/5 estrellas ('.$row[1].' votos)';
    echo 
'<span id="page'.$row[0].'" style="color:#ff0000;"></span>';
    echo 
'</div>';
  }
?>

Descargar




Mi pregunta es la siguiente
Ejemplo:
Tengo en mi web donde pasan por el catalogo hacen clic a la foto que le agrada y hacer el voto, "fotos.php" ejemplo:

misfotosweb.com/fotos.php?id=1

y cuando quiero hacer una votacion de la foto me dice que ya he votado /fotos.php?id=1

como hago para que cuando yo haga clic a la estrella recien pueda votar

Algo asi sale

aqui esta el ejemplo pero esta con rank.php

sistema de votos

pero yo estoy usando de esta forma:
misfotosweb.com/fotos.php?id=1
  #2 (permalink)  
Antiguo 06/03/2010, 17:03
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años
Puntos: 127
Respuesta: Ranking en PHP+SQL

no estas implementando bien el codigo
te falta en el index.php muuuucha informacion por ejemplo no incluyes el .js y ese es el que tiene la magia.

por que no tomas de ejemplo el codigo de la pagina que colocas alli
deberias de leer un poco mas la pagina.
http://www.plantillaswebgratis.info/recursos/rank.php
  #3 (permalink)  
Antiguo 06/03/2010, 17:17
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años
Puntos: 127
Respuesta: Ranking en PHP+SQL

mi amigo no le as instalado o mintado en tu web bien.
mira esto lo realice deacuerdo a los pasos de la pagina y esta ok
ejemplo

como ves esta ok quisa sete paso un punto
  #4 (permalink)  
Antiguo 06/03/2010, 17:37
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 5 meses
Puntos: 6
Respuesta: Ranking en PHP+SQL

Hola enlinea

Esta igual al tutorial de esa web, si me funciona todo bien, en ningun momento he dicho que no funciona, lo que pasa es lo siguiente


OJO Aqui no esta el script ranking, pero si estan las fotos
misfotosweb.com/index.php


Aqui esta el script incorporado, y funciona, pero como esta por "id" pues se actualiza sin hacer la votacion.

misfotosweb.com/fotos.php?id=1

y cuando quiero hacer una votacion de la foto me dice que ya he votado /fotos.php?id=1

espero me haya dejado entender
  #5 (permalink)  
Antiguo 06/03/2010, 18:48
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años
Puntos: 127
Respuesta: Ranking en PHP+SQL

aber si entiendo tu foto es el id¿?

osea el id que tu usas es para la foto¿? y no para el voto¿?
  #6 (permalink)  
Antiguo 06/03/2010, 19:06
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 5 meses
Puntos: 6
Respuesta: Ranking en PHP+SQL

Cita:
Iniciado por enlinea777 Ver Mensaje
aber si entiendo tu foto es el id¿?

osea el id que tu usas es para la foto¿? y no para el voto¿?
uso el id de la foto, como te digo lo he ingresado al sistema de fotos, funciona todo, pero dice siempre que ya he votado claro por que esta por id, pero si lo pongo en el rating en el index ahi funciona pero no es lo que necesito ya que es mejor votar cuando se vea la foto si te gusta la foto pues votas, en este caso es asi
aqui me muestra la foto numero 1

foto.php?id=1

y asu vez ya hace un voto, es lo que yo no quiero que se haga, mas bien que el voto sea cuando yo seleccione o marque el numero de estrella

creo que esta por el update o insert la verdad nose donde esta el problema para que solo vote cuando se seleccione,

NOTA: estoy usando tal y como esta ahi el codigo y lo incremente al sistema de fotos, repito funciona bien, pero al seleccionar la foto 1 por ejemplo me da ya un voto sin haber seleccionado.
  #7 (permalink)  
Antiguo 06/03/2010, 20:19
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años
Puntos: 127
Respuesta: Ranking en PHP+SQL

ok el error esta en que no has visto todo el codigo.
lo mejor es que cambies el nombre de la variable de la foto por otro que ni sea id por que este esta por defecto para el ranqueador, o tambien podrias cambiar el rank.php donde recoge las veriables por id u cambiarlo por uid por ejemplo y a las estrellas osea a los link de la pagina index tambien cambiarle el para metro id por uid.
algo asi :

index.php


Código PHP:
<?php
        
include("rank/rank.php");
        
        
$link conectar();
        
$result mysql_query("SELECT id,votos,media FROM rank where id=1",$link);
        
$row mysql_fetch_row($result);
        if(
$row){        
            echo 
'<div class="rank">';
            echo 
'<ul>';
            echo 
'<li class="current-rating" style="width:'.($row[2] * 25).'px;">Currently '.$row[2].'/5 Stars.</li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=1\',\'page'.$row[0].'\',true)" title="dar 1 estrella de 5" class="star-1">1</a></li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=2\',\'page'.$row[0].'\',true)" title="dar 2 estrellas de 5" class="star-2">2</a></li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=3\',\'page'.$row[0].'\',true)" title="dar 3 estrellas de 5" class="star-3">3</a></li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=4\',\'page'.$row[0].'\',true)"  title="dar 4 estrellas de 5" class="star-4">4</a></li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=5\',\'page'.$row[0].'\',true)" title="dar 5 estrellas de 5" class="star-5">5</a></li>';
            echo 
'</ul>';
            echo 
'Rated <strong>'.$row[2].'</strong>/5 estrellas ('.$row[1].' votos)';
            echo 
'<span id="page'.$row[0].'" style="color:#ff0000;"></span>';
            echo 
'</div>';
        }
    
?>
rank.php

Código PHP:
<?php
include('conec.php');
    
$uid $_GET['uid'];//pagina, apartado o noticia que se quiere votar
    
    
if($uid!=""){
        
$voto $_GET['v'];//voto del usuario
        
$link conectar();//conectamos a la base de datos            
        
        //obtenemos la IP del usuario
        
if ($_SERVER) {
            if ( 
$_SERVER[HTTP_X_FORWARDED_FOR] ) {
                
$realip $_SERVER["HTTP_X_FORWARDED_FOR"];
            } elseif ( 
$_SERVER["HTTP_CLIENT_IP"] ) {
                
$realip $_SERVER["HTTP_CLIENT_IP"];
            } else {
                
$realip $_SERVER["REMOTE_ADDR"];
            }
        } else {
            if ( 
getenv"HTTP_X_FORWARDED_FOR" ) ) {
                
$realip getenv"HTTP_X_FORWARDED_FOR" );
            } elseif ( 
getenv"HTTP_CLIENT_IP" ) ) {
                
$realip getenv"HTTP_CLIENT_IP" );
            } else {
                
$realip getenv"REMOTE_ADDR" );
            }
        }                    
                                                        
        
$fecha date('Y-m-d');
        
//actualizamos la tabla de votos realizadas por los usuarios y borramos lo que sean del dia anterior
        
$result mysql_query("DELETE FROM votos_usuarios WHERE dataCreate <> '".$fecha."'",$link);
    
        
//comprobamos que este usuario ya no haya realizado un voto (identificacion por IP)
        
$result mysql_query("SELECT *FROM votos_usuarios WHERE ip = '".$realip."' and id = $uid",$link);                                
        
$row mysql_fetch_row($result);
        
        
//el usuario no ha votado para este apartado
        
if($row[0]==""){    
            
$result mysql_query("SELECT votos,media FROM rank WHERE id =$uid",$link);
            
$row mysql_fetch_row($result);
        
            
$auxmedia $row[1];        
            
$votos =$row[0] + 1;            
            
$media = (($row[0] * $auxmedia) + $voto)/ $votos;            
            
//actualizamos el voto                            
            
$result mysql_query("UPDATE rank SET votos= $votos, media= $media WHERE id= $uid",$link);                
            
mysql_query("INSERT INTO votos_usuarios(id,ip,dataCreate)VALUES($uid,'".$realip."','".$fecha."')",$link);            
            echo 
"voto realizado";
        }else{ 
//el usuario ya ha votado para este apartado
            
echo "Usted ya ha votado";    
        }
    }
?>
  #8 (permalink)  
Antiguo 06/03/2010, 21:13
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 5 meses
Puntos: 6
Respuesta: Ranking en PHP+SQL

Cita:
Iniciado por enlinea777 Ver Mensaje
ok el error esta en que no has visto todo el codigo.
lo mejor es que cambies el nombre de la variable de la foto por otro que ni sea id por que este esta por defecto para el ranqueador, o tambien podrias cambiar el rank.php donde recoge las veriables por id u cambiarlo por uid por ejemplo y a las estrellas osea a los link de la pagina index tambien cambiarle el para metro id por uid.
algo asi :

index.php


Código PHP:
<?php
        
include("rank/rank.php");
        
        
$link conectar();
        
$result mysql_query("SELECT id,votos,media FROM rank where id=1",$link);
        
$row mysql_fetch_row($result);
        if(
$row){        
            echo 
'<div class="rank">';
            echo 
'<ul>';
            echo 
'<li class="current-rating" style="width:'.($row[2] * 25).'px;">Currently '.$row[2].'/5 Stars.</li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=1\',\'page'.$row[0].'\',true)" title="dar 1 estrella de 5" class="star-1">1</a></li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=2\',\'page'.$row[0].'\',true)" title="dar 2 estrellas de 5" class="star-2">2</a></li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=3\',\'page'.$row[0].'\',true)" title="dar 3 estrellas de 5" class="star-3">3</a></li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=4\',\'page'.$row[0].'\',true)"  title="dar 4 estrellas de 5" class="star-4">4</a></li>';
            echo 
'<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=5\',\'page'.$row[0].'\',true)" title="dar 5 estrellas de 5" class="star-5">5</a></li>';
            echo 
'</ul>';
            echo 
'Rated <strong>'.$row[2].'</strong>/5 estrellas ('.$row[1].' votos)';
            echo 
'<span id="page'.$row[0].'" style="color:#ff0000;"></span>';
            echo 
'</div>';
        }
    
?>
rank.php

Código PHP:
<?php
include('conec.php');
    
$uid $_GET['uid'];//pagina, apartado o noticia que se quiere votar
    
    
if($uid!=""){
        
$voto $_GET['v'];//voto del usuario
        
$link conectar();//conectamos a la base de datos            
        
        //obtenemos la IP del usuario
        
if ($_SERVER) {
            if ( 
$_SERVER[HTTP_X_FORWARDED_FOR] ) {
                
$realip $_SERVER["HTTP_X_FORWARDED_FOR"];
            } elseif ( 
$_SERVER["HTTP_CLIENT_IP"] ) {
                
$realip $_SERVER["HTTP_CLIENT_IP"];
            } else {
                
$realip $_SERVER["REMOTE_ADDR"];
            }
        } else {
            if ( 
getenv"HTTP_X_FORWARDED_FOR" ) ) {
                
$realip getenv"HTTP_X_FORWARDED_FOR" );
            } elseif ( 
getenv"HTTP_CLIENT_IP" ) ) {
                
$realip getenv"HTTP_CLIENT_IP" );
            } else {
                
$realip getenv"REMOTE_ADDR" );
            }
        }                    
                                                        
        
$fecha date('Y-m-d');
        
//actualizamos la tabla de votos realizadas por los usuarios y borramos lo que sean del dia anterior
        
$result mysql_query("DELETE FROM votos_usuarios WHERE dataCreate <> '".$fecha."'",$link);
    
        
//comprobamos que este usuario ya no haya realizado un voto (identificacion por IP)
        
$result mysql_query("SELECT *FROM votos_usuarios WHERE ip = '".$realip."' and id = $uid",$link);                                
        
$row mysql_fetch_row($result);
        
        
//el usuario no ha votado para este apartado
        
if($row[0]==""){    
            
$result mysql_query("SELECT votos,media FROM rank WHERE id =$uid",$link);
            
$row mysql_fetch_row($result);
        
            
$auxmedia $row[1];        
            
$votos =$row[0] + 1;            
            
$media = (($row[0] * $auxmedia) + $voto)/ $votos;            
            
//actualizamos el voto                            
            
$result mysql_query("UPDATE rank SET votos= $votos, media= $media WHERE id= $uid",$link);                
            
mysql_query("INSERT INTO votos_usuarios(id,ip,dataCreate)VALUES($uid,'".$realip."','".$fecha."')",$link);            
            echo 
"voto realizado";
        }else{ 
//el usuario ya ha votado para este apartado
            
echo "Usted ya ha votado";    
        }
    }
?>


SI usas de esta forma
Código PHP:
//
// aqui se maneja por id y si te das cuenta esta puesto solo un numero 1 no trabaja con id real 
$result mysql_query("SELECT id,votos,media FROM rank where id=1",$link); 

// entonces seria correcto de esta forma
// aqui si funciona por cada id seleccionado
$result mysql_query("SELECT id,votos,media FROM rank where id='$id'",$link); 

//
// y aqui nose donde relacionas el "ui"
// 
// creo que deberia leer el id para mostrarte el id de cada foto 
// ambos id estan relacionados si voto el id 1 en la tabla rank el id 1 sera uno
// si voto el id 2 en la tabla rank aparece dos eso es obvio
//
echo '<li><a href="javascript:sendDatos(\'rank/rank.php?uid='.$row[0].'&v=1\',\'page'.$row[0].'\',true)" title="dar 1 estrella de 5" class="star-1">1</a></li>';

//
// como te digo de la forma como esta funciona si esta con /index.php
// pero yo estoy usando en cada foto seleccionado
// ejemplo
// foto.php?id=1 
  #9 (permalink)  
Antiguo 07/03/2010, 10:06
 
Fecha de Ingreso: marzo-2010
Mensajes: 41
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Ranking en PHP+SQL

bueno voy a copiar aki el manual del sistema de ranking o votacion por estrellas que del que estais hablando lo copio pero le e arreglao algunos fallos en los nombres de los archivos y en el nombre de la base de datos que seguramente es lo que esta dando problemas luego pongo mi duda el sobre este sistema de votacion ranking.



1- Crear una imágen
Es necesario una imagen con 3 estrellas en diferentes tonalidades. El fondo de la imágen debe ser igual al fondo de la página o capa donde se utilizará al final de este manual dejo el enlace de donde lo saque yo ahi podeis descargaros la imagen o incluso todos
los archivos del manual mismo podeis darle a guardar como en la imagen y con cualquier programa modificais el fondo es muy sencillo la direccion del tutorial original y donde teneis una imagen con las estrellas es http://www.plantillaswebgratis.info/recursos/rank.php . Si se desea modificar el tamaño de la imágen recordar que se deberá cambiar la especificación del tamaño en el archivo css (rating.css).

todos los archivos k creemos ahora se copia en el bock de notas y se guardaran como y el nombre que esta en el titulo.

2- Archivo css (rank.css)

Código CSS:
Ver original
  1. .rank ul {
  2.  list-style: none;
  3.  margin: 3px;
  4.  padding: 0px;
  5.  width: 125px;
  6.  height: 25px;
  7.  position: relative;
  8.  background: url(rank.gif) top left repeat-x;
  9.  margin-left:0px;
  10. }
  11. .rank li {
  12.  padding: 0px;
  13.  margin: 0px;
  14.  float: left;
  15. }
  16. .rank li.current-rating {
  17.  background: url(rank.gif) left bottom;
  18.  position: absolute;
  19.  height: 25px;
  20.  display: block;
  21.  text-indent: -9000px;
  22.  z-index: 1;
  23. }
  24. .rank li a {
  25.  display: block;
  26.  width: 25px;
  27.  height: 25px;
  28.  text-decoration: none;
  29.  text-indent: -9000px;
  30.  z-index: 20;
  31.  position: absolute;
  32.  padding: 0px;
  33.  background-image: none;
  34. }
  35. .rank li a:hover {
  36.  background: url(rank.gif) left center;
  37.  z-index: 1;
  38.  left: 0px;
  39. }
  40. .rank a.star-1 {left: 0px;}
  41. .rank a.star-1:hover {width: 25px;}
  42. .rank a.star-2 {left: 25px;}
  43. .rank a.star-2:hover {width: 50px;}
  44. .rank a.star-3 {left: 50px;}
  45. .rank a.star-3:hover {width: 75px;}
  46. .rank a.star-4 {left: 75px;}
  47. .rank a.star-4:hover {width: 100px;}
  48. .rank a.star-5 {left: 100px;}
  49. .rank a.star-5:hover {width: 125px;}

Código fuente del ejemplo (index.html)

Código HTML:
Ver original
  1. <div class="rank">
  2.   <ul>
  3.     <li class="current-rating" style="width:100px;">Currently 4/5 Stars.</li>
  4.     <li><a href="#" title="dar 1 estrella de 5" class="star-1">1</a></li>
  5.     <li><a href="#" title="dar 2 estrellas de 5" class="star-2">2</a></li>
  6.     <li><a href="#" title="dar 3 estrellas de 5" class="star-3">3</a></li>
  7.     <li><a href="#"  title="dar 4 estrellas de 5" class="star-4">4</a></li>
  8.     <li><a href="#" title="dar 5 estrellas de 5" class="star-5">5</a></li>
  9.   </ul>
  10.   Rated <b>4</b>/5 estrellas (269 votos)
  11. </div>

con este archivo solo podras probar el efecto de las estrellas sin necesidad de la base de datos pero no
es el codigo final para la web solo es de prueba.

3- Creamos la Base de datos, tablas y registros
Ahora ya tenemos el aspecto gráfico de nuestro sistema de votos por estrellas, pero aún no realiza ninguna votación. Necesitamos almacenar las votaciones de los usuarios y para ello lo primero que deberemos hacer es una base de datos como se indica aqui abajo.
3.1- Crear la base de datos con el nombre bd_rank y entramos a ella con use.
abrimos la consola de mysql y ponermos:

Código MySQL:
Ver original
  1. create database bd_rank;
  2. use bd_rank
3.2-se puede crear nombre y usuario para esta base de datos yo en mi caso no pongo.
3.3-se crean las tablas y registros necesarios:

Código MySQL:
Ver original
  1. CREATE TABLE `votos_usuarios` (
  2.   `id` INT NOT NULL default '0',
  3.   `ip` char(15) NOT NULL default '',
  4.   `dataCreate` date NOT NULL default '0000-00-00'
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  6. CREATE TABLE `rank` (
  7.   `id` INT NOT NULL default '0',
  8.   `media` FLOAT NOT NULL default '0',
  9.   `votos` INT NOT NULL default '0'
  10. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  11. INSERT INTO `rank` (`id`, `media`, `votos`) VALUES (1,0,0),(2,0,0);

Tabla rank: Esta tabla almacena el ranking de la página, sección o noticia que se reankea. Esta tabla contiene 3 campos. (id, media, votos), el primer identifica la página o sección que se quiere rankear, el campo media, contiene la media de votos (1 al 5) y el campo votos, el total de votos recibidos.
Tabla votos_usuarios: Esta tabla almacena temporalmente el identificador de la página o sección votada, el identificador del usuario (IP del ordenador del usuario) y la fecha en que se voto. Esta contiene datos temporales porque cada vez que un usuario realice un voto, comprobará los regístros y eliminará los que esan diferentes a la fecha actual y evitará que un mismo usuario vote a una misma página o sección más de una vez.

Última edición por koruitch; 07/03/2010 a las 10:23
  #10 (permalink)  
Antiguo 07/03/2010, 10:14
 
Fecha de Ingreso: marzo-2010
Mensajes: 41
Antigüedad: 14 años, 1 mes
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
  #11 (permalink)  
Antiguo 07/03/2010, 19:20
 
Fecha de Ingreso: noviembre-2004
Ubicación: NULL
Mensajes: 652
Antigüedad: 19 años, 5 meses
Puntos: 6
Respuesta: Ranking en PHP+SQL

el problema esta en el ID

aqui solo estas usando id=1
Código PHP:
// 
$result mysql_query("SELECT id,votos,media FROM rank where id=1",$link);
// 
si usas de esta forma id=$id" estaras usando para cada manual que quieras que se vote
por ejemplo si en manual uno el resultado seria asi
id=1
y el manual dos seria asi

id=2
etc..



Código PHP:
// 
$result mysql_query("SELECT id,votos,media FROM rank where id=$id",$link);
// 
  #12 (permalink)  
Antiguo 07/03/2010, 22:06
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años
Puntos: 127
Respuesta: Ranking en PHP+SQL

haver si dando la misma respuesta mas de una ves este personaje entiende jajajaja
  #13 (permalink)  
Antiguo 08/03/2010, 08:12
 
Fecha de Ingreso: marzo-2010
Mensajes: 41
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Ranking en PHP+SQL

oooo.excelente solo era eso k torpe estaba atascao con eso,muchisimass graciass.

ahora el problema seria como hacer para la pagina principal salga un top 10 como los mas votados.no se como llamar para que me salga.
  #14 (permalink)  
Antiguo 08/03/2010, 22:43
 
Fecha de Ingreso: marzo-2010
Mensajes: 41
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Ranking en PHP+SQL

es muy complicado de hacer para que me devuelva los 10 mas votados?

Etiquetas: ranking
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:58.