Foros del Web » Programando para Internet » PHP »

sistema de valoraciones

Estas en el tema de sistema de valoraciones en el foro de PHP en Foros del Web. tengo un sistema de esos para valorar noticias, descargas, etc. pero yo lo uso para valorar perfiles de usuario (con foto) aki les pongo los ...
  #1 (permalink)  
Antiguo 04/06/2005, 10:40
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 12 años, 10 meses
Puntos: 4
sistema de valoraciones

tengo un sistema de esos para valorar noticias, descargas, etc. pero yo lo uso para valorar perfiles de usuario (con foto) aki les pongo los datos de la tabla mysql y el script php

esta es la tabla

Código PHP:
    CREATE TABLE `valoraciones` (
    `
id_userint(9NOT NULL default '0',
    `
num_votosint(20NOT NULL default '0',
    `
ptosint(20NOT NULL default '0'
    
TYPE=MyISAM

y este es el script

Código PHP:
    <?
    
#####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_user='".$_GET[id]."'")or die(mysql_error());
    
$array_d=mysql_fetch_array($SSQL_);
    
$valoracioN_total[email protected]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_user='".$_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">
    </form>

a ese codigo le kito las lineas ke conectan a la BD y lo meto dentro de un archivo al ke llamo perfil.php pk ahi ya tengo incluido el config y hasta ahi todo bien, los votos funcionan muy bien pero kisiera una cosa mas, pues ke solo se admita un voto por persona creo ke para eso se debe restringir las ip o algo asi, pero no conozco mucho de eso, ah y hay un pekeño problema y es ke una vez ke envio el voto me regresa a la misma web del perfil pero me la muestra cortada, o sea el resto de contenido ke hay debajo del form de votacion (en el caso d mi web: comentarios) y si le doy actualizar sigue = y los votos se siguen incrementando creo ke el problema esta en esa variable $REQUEST_URI, please ayudame con eso como puedo mejorarlo

PD.: una cosa mas kisiera ke en la pagina principal de la web osea en mi index.php (o home.php en mi caso pk el index es un intro flash) poner un enlace del perfil con mayores votaciones o puntuaciones :)

un saludo :)
  #2 (permalink)  
Antiguo 04/06/2005, 13:01
Avatar de Pazosele  
Fecha de Ingreso: marzo-2005
Ubicación: BCN - España
Mensajes: 200
Antigüedad: 12 años, 9 meses
Puntos: 0
para restringir el envio masivo, tienes 2 opciones..

1_) restringiendo IP, con lo cuan no se podran enviardatos del mismo ordenador mas de una vez. Para hacerlo, te creas un campo IP en la tabla y listos.
Inconveniente: si la peña te vota desde un ciber, mas de una persona podria votardesde el mismo sitio.. con lo cual.. no aseguras que todo el mundo pueda votar. Lo mismo si las IP son dinamicas. La misma persona si desconecta i conecta, te podra votar muchas veces.

Puedes bloquearla durante un tiempo, no dejar que vote la misma ip, si no han pasado 20 minutos.. o el tiempo que quieras. En este caso tampoco aseguras al 100% que no te voten 2 veces, ya que si un tio seespera la media ora y welbe a votar.. pues ya la has liado..

2_) con cookies. este caso seria lo mismo que restringir las ip durante un tiempo, con el inconveniente de que hay gente / navegadores que no las aceptan.



RESUMIENDO: te recomiendo el primer punto, teniendo en cuenta que hagas el bloqueo temporal o el permanente, nunca aseguraras el 100% de efectividad.. asi que valora lo que mas te interesq y elije.



Para lo dellink en inicio con la mas votada, simplemente haz un

Código:
SELECT max(campoVOTOSoloquesea)
y se lo asignas al link :P

UN SALUDO!
__________________
Share our Knowledge!
Adura Vita!
  #3 (permalink)  
Antiguo 04/06/2005, 20:00
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 12 años, 10 meses
Puntos: 4
gracias por el consejo, pero yo soy un poco lerdo en esto del php me podrian explicar como hacerlo please

gracias :)
  #4 (permalink)  
Antiguo 05/06/2005, 00:32
Avatar de CORE
Usuario no validado
 
Fecha de Ingreso: abril-2002
Ubicación: Merida
Mensajes: 2.165
Antigüedad: 15 años, 8 meses
Puntos: 3
mis conocmientos en php son minimos pero creo que me salio algo

Código PHP:
mysql_query("UPDATE chicas SET califica=califica+$voto, votos_totales=votos_totales+1,rank=$res1 WHERE id='$id'");//suma el voto saca + los votos totales suma visitas+votos=rank
setcookie("fecha",$REMOTE_ADDR,time()+172800"/");// esta cookie dura 2 dias, tiene por nombre fecha y como valor la variable $fecha 
despues mediante cookies

Código PHP:
<?php 
if(isset($fecha))//si la cookie existe
{
echo 
"Nada puedes votar una vez";
}
else
{
echo 
"<h3 class=\"inftitle\" style=\"margin:35px 0; font-size:16px; padding:5px\">Del 1 al 10 que calificaci&oacute;n le das a ".$row_Recordset1['nombre']."</h3>
<form name=\"votar\" id=\"votar\" method=\"post\" action=\"voto.php?id="
.$id."\" style=\"margin-top:55px;\">
      <fieldset style=\"width:65%; margin:0 auto; padding:30px;\"><legend>Votos</legend>
      <input name=\"voto\" type=\"radio\" value=\"1\" />1 
      <input name=\"voto\" type=\"radio\" value=\"2\" />2
      <input name=\"voto\" type=\"radio\" value=\"3\" />3
      <input name=\"voto\" type=\"radio\" value=\"4\" />4
     <input name=\"voto\" type=\"radio\" value=\"5\" />5
     <input name=\"voto\" type=\"radio\" value=\"6\" />6
      <input name=\"voto\" type=\"radio\" value=\"7\" />7
      <input name=\"voto\" type=\"radio\" value=\"8\" />8
      <input name=\"voto\" type=\"radio\" value=\"9\" />9  
    <input name=\"voto\" type=\"radio\" value=\"10\" />10
<input type=\"submit\" name=\"Submit\" value=\"Votar por "
.$row_Recordset1['nombre']."\" style=\"margin:10px auto; display:block\" />
</fieldset></form>    
<p class=\"desc\" style=\"text-align:center\">Se honesto con tu calificacion, si recibiste una buena atencion recomienda ese servicio<br />
  Solo podras votar una vez, Si se reciben mas de 5 votos por dia  se restan los votos de un mes
        </p>"
;

?>
se que es algo sensillo pero me funciona

saludos
  #5 (permalink)  
Antiguo 05/06/2005, 05:48
Avatar de Pazosele  
Fecha de Ingreso: marzo-2005
Ubicación: BCN - España
Mensajes: 200
Antigüedad: 12 años, 9 meses
Puntos: 0
Información Por Ip

El unico problema de las cookies, es que hay gente que no las acepta.

Para hacerlo por IP create un campo en una tabla que se llame IP y otro que se llame fecha (si no lo tienes ya)

Cuando te contesten, guarda los datos y guarda tambien la IP y la fecha y hora en que te han contestado


Código PHP:
//para saber la IP usa
$ip=$_SERVER['REMOTE_ADDR'];
//para saber la fecha usa
$fecha=(date("d/m/Y H:i:s")); 
por ejemplo

luego haces el select de los registros que el campo IP sea igua ala ip que tiene el usuario que quiere contestar.
si no hay ninguna, dejas contestar, si hay alguna miras si la fecha actual es (por ejemplo) 10 minutos mas que la guardada en la BDD. Si es asi dejas kontestar, sino no.

no tiene mas.

solo añadir que para poder sumar tiempo (en segundos) lo mas facil es que pases las fechas a TIMESTAMP y una vez asi le sumes el tiempo durante ql que no se pueda contestar (minutos, horas o dias o lo que quieras, pero en segundos), las compares.

si no sabes hacer algo de lo que te digo, me lo dices y te espliko komo es

un saludo

despues compara si la fecha actual es mas grande que la fecha guardada
__________________
Share our Knowledge!
Adura Vita!

Última edición por Pazosele; 05/06/2005 a las 05:54
  #6 (permalink)  
Antiguo 05/06/2005, 05:52
 
Fecha de Ingreso: diciembre-2003
Mensajes: 218
Antigüedad: 14 años
Puntos: 0
Yo tambien usaria el sistema de control por IP's pero no de esa forma, he tenido problemas con los proxys cache transparentes, osea q me devolvia la ip del proxy y no la ip real del equipo. Si quieres usa esta funcion.

Código PHP:
function DevIP()
{
     if(
getenv(HTTP_X_FORWARDED_FOR)) { $getip getenv(HTTP_X_FORWARDED_FOR); }
    elseif(
getenv(HTTP_CLIENT_IP)) { $getip getenv(HTTP_CLIENT_IP); }
    else { 
$getip $REMOTE_ADDR; }
    
$ip split(" "$getip);
    
$devip $ip[1]." (".$ip[0].")";
    return 
$devip;

Un saludo.
__________________
SymbianForever
SymbianForever.com, todo sobre y para tu symbian
aNieto2K | Themes para WordPress
De todo un poco
  #7 (permalink)  
Antiguo 05/06/2005, 13:06
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 12 años, 10 meses
Puntos: 4
ok, gracias a todos por la ayuda y consejos, voy a ponerme a ello ahora mismo y ya les contare :)

Un saludo
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 18:48.