Foros del Web » Programando para Internet » PHP »

Ayuda con cookies

Estas en el tema de Ayuda con cookies en el foro de PHP en Foros del Web. Utilizo la siguiente encuesta el problema llega cuando entra otra vez a resultados agrega un voto mas, no habia trabajado antes con archivos.txt solo mysql ...
  #1 (permalink)  
Antiguo 22/02/2003, 13:39
Avatar de WyLY  
Fecha de Ingreso: enero-2002
Ubicación: Cancun, México.
Mensajes: 506
Antigüedad: 22 años, 3 meses
Puntos: 6
Ayuda con cookies

Utilizo la siguiente encuesta el problema llega cuando entra otra vez a resultados agrega un voto mas, no habia trabajado antes con archivos.txt solo mysql entonces si me pudieran ayudar se los agradeceria mucho.

saludos y gracias.


Código PHP:
<?
if($submit) {
setcookie("encuesta",$HTTP_COOKIE_VARS["encuesta"],time()+3600*24*7);
}
?>
<?
if(isset($HTTP_COOKIE_VARS["encuesta"]))
{
$archivo="encuesta.txt";
$fp=fopen("$archivo","a+");
$w=fputs($fp,"$voto#");
$fp=fopen("$archivo","r");
$resultado=fread($fpfilesize ($archivo));
$div=explode("#",$resultado);
$total=count($div)-1;
for(
$i=0$i<$total$i++){
if(
$div[$i]=="op1"){
$op1++;
}
if(
$div[$i]=="op2"){
$op2++;
}
if(
$div[$i]=="op3"){
$op3++;
}
if(
$div[$i]=="op4"){
$op4++;
}
if(
$div[$i]=="op5"){
$op5++;
}
if(
$div[$i]=="op6"){
$op6++;
}
if(
$div[$i]=="op7"){
$op7++;
}
}
$grafico1 $op1*100/$total;
$grafico2 $op2*100/$total;
$grafico3 $op3*100/$total;
$grafico4 $op4*100/$total;
$grafico5 $op5*100/$total;
$grafico6 $op6*100/$total;
$grafico7 $op7*100/$total;
$grafico1=round($grafico1);
$grafico2=round($grafico2);
$grafico3=round($grafico3);
$grafico4=round($grafico4);
$grafico5=round($grafico5);
$grafico6=round($grafico6);
$grafico7=round($grafico7);
echo 
'<table width="148" border="0" cellspacing="1" cellpadding="1" align="center" bgcolor="#FF6600">
  <tr> 
    <td>
      <table width="100%" border="0" cellspacing="1" cellpadding="2" bgcolor="#000000">
        <tr>
          <td bgcolor="#FFFFFF">
            <div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><b><img src="imagenes/chidos/guest.gif" width="16" height="15"><font color="#FF0000">Encuesta.</font></b></font></div>
          </td>
        </tr>
      </table>
    </td>
  </tr>
  <tr>
    <td bgcolor="#FFCC00">
      <div align="center">
        <p><font size="1" face="Verdana, Arial, Helvetica, sans-serif"><b>Resultados:</b></font></p>
        <p><font face="tahoma" color="#333333" size="1">Lo Chusco: 
          '
.$grafico1.'
          % <br>
          Letras de Canciones: 
          '
.$grafico2.'
          % <br>
          Articulos &amp; Reportajes: 
          '
.$grafico3.'
          %</font><font face="tahoma" color="#333333" size="1"><br>
          Fotos &amp; Mas Fotos: 
          '
.$grafico4.'
          % <br>
          Para Cancunenses: 
         '
.$grafico5.'
          %<br>
          Todo el Portal: 
          '
.$grafico6.'
          % <br>
          Otras cosas: 
          '
.$grafico7.'
          %</font><font face="Tahoma" color=blue size="2"><br>
          </font><br>
          <font size="1" face="tahoma, arial, verdana">Total de votos: <b> 
          '
.$total.'
          </b> </font> </p>
      </div>
    </td>
  </tr>
</table>'
;
}
else
{
echo 
'<table width="148" border="0" cellspacing="1" cellpadding="1" align="center" bgcolor="#FF6600">
  <tr> 
    <td> 
      <table width="100%" border="0" cellspacing="1" cellpadding="2" bgcolor="#000000">
        <tr> 
          <td bgcolor="#FFFFFF"> 
            <div align="center"><font size="2" face="Arial, Helvetica, sans-serif"><b><img src="imagenes/chidos/guest.gif" width="16" height="15"><font color="#FF0000">Encuesta.</font></b></font></div>
          </td>
        </tr>
      </table>
    </td>
  </tr>
  <tr> 
    <td bgcolor="#FFCC00"> 
      <div align="center"> 
        <p><font size="1" face="Verdana, Arial, Helvetica, sans-serif"><b>&iquest;Que 
          es lo que mas te gusta de portal cancun?</b></font></p>
        <table width="95%" border="0" cellspacing="0" cellpadding="2" class=bitch>
          <tr>
            <td height="18" bgcolor="#FFCC00"><font face="tahoma" color="#333333" size="1"> 
              </font>
    <form method="post" action="'
.$php_self.'">
                <p><font face="tahoma" color="#333333" size="1"> 
                  <input type="radio" name="voto" value="op1">
                  Lo Chusco.<br>
                  <input type="radio" name="voto" value="op2">
                  Letras de Canciones.<br>
                  <input type="radio" name="voto" value="op3">
                  Articulos &amp; Reportajes</font><font face="tahoma" color="#333333" size="1">.<br>
                  <input type="radio" name="voto" value="op4">
                  Entretenimiento.<br>
                  <input type="radio" name="voto" value="op5">
                  Para Cancunenses<br>
                  <input type="radio" name="voto" value="op6" checked>
                  Todo el Portal.<br>
                  <input type="radio" name="voto" value="op7">
                  Otras cosas.</font> </p>
                <p align="center"> 
                  <input type="submit" name="submit" value="[Votar]">
                </p>
              </form>
              
            </td>
          </tr>
        </table>
        
      </div>
    </td>
  </tr>
</table>'
;
}
?>
__________________
I do techy stuff for a living and practice MMA with my dog... He always wins.
  #2 (permalink)  
Antiguo 22/02/2003, 14:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Se contabilizan entradas porque solo miras si se ha hecho el "submit" pero no miras a su vez el estado de la cookie ..

Había tambien un problema de estructura .. Si haces el submit has de contabilizar el voto y crear la cookie (si no se ha creado a su vez).

La sintax del setcookie() no era correcta (o no se q pintaba el $HTTP_xxx por medi?).

Te hace falta tambien redireccionar o mejor dicho "hacer una peticion al servidor" para que quede disponible la cookie .. sino, tras el primer voto (en el q se crea la cookie) No presentará los totales de los votos, sino el formulario de votaciones.

Si metes este sistema de votaciones en alguna pagina via include() por ejemplo con mas HTML por delante te va a dar problemas de cabeceras este redireccionamiento via header(). Para solucionarlo usa redirecionamiento javascript o saca ese bloque de código (el condicional: if($submit && !isset($HTTP_COOKIE_VARS["encuesta"])) { ) fuera de ese punto de tu código y ejecutalo antes de tu <html> q pudieras tener ..

Esto es una solución "parche" q funciona (lo comprobé) .. pero tendrias q pensar en que procesos hace tu aplicación:

1) formulario de votacion
2) presentación votos
3) contabilizar votos

Esto son tres partes bien difernciadas que lo puedes controlar si quieres con tu variable "submit".

Por lo demas .. ese monton de if .. yo los haria con switch .. case o un array y un bucle xD ...

Código PHP:
<?
$archivo
="encuesta.txt";

// se mira q se ha hecho el "sumbit"  y no está creada la cookie (esto evita conteos en recargas de pagina xD)
if($submit && !isset($HTTP_COOKIE_VARS["encuesta"])) {

// se contabiliza el voto en el archivo de texto plano...
$fp=fopen("$archivo","a+");
$w=fputs($fp,"$voto#");

// se crea la cookie
setcookie("encuesta",time()+3600*24*7);

// redireccionar a si mismo la pagina .. sino no estará disponible la cookie
header("Location: $PHP_SELF");
exit;
}

if(isset(
$HTTP_COOKIE_VARS["encuesta"]))
{
$fp=fopen("$archivo","r");
$resultado=fread($fpfilesize ($archivo));
$div=explode("#",$resultado);
$total=count($div)-1;

// resto de tu script
Un saludo,

Última edición por Cluster; 22/02/2003 a las 14:58
  #3 (permalink)  
Antiguo 22/02/2003, 15:46
Avatar de WyLY  
Fecha de Ingreso: enero-2002
Ubicación: Cancun, México.
Mensajes: 506
Antigüedad: 22 años, 3 meses
Puntos: 6
Ya esta cluster todo bien solo en el set cookie debio haber quedado a si:

setcookie("encuesta","encuesta",time()+3600*24*7);

entonces si se guarda por que me lo habias pasado a si:

setcookie("encuesta",time()+3600*24*7);

y pues no se me quedaba pero ya con el otro no hay problema.

de nuevo gracias por todo hermano.
__________________
I do techy stuff for a living and practice MMA with my dog... He always wins.
  #4 (permalink)  
Antiguo 22/02/2003, 16:03
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Ok, .. pero no se porqué .. lo usé :
setcookie("encuesta",time()+3600*24*7);

y me funcionó .. jeje bueno me funcionó por que estaba asignado el valor a encuesta de ese time() y solo se hace el "isset" de si existe, pero no de su valor .. .. pero sin tiempo de expiración .. En fin .. se me pasó .. ver el $HTTP_xx ahí lo quité sin mas xDD y la constumbre de no usar cookies jeje ..

Un saludo
  #5 (permalink)  
Antiguo 22/02/2003, 16:16
Avatar de WyLY  
Fecha de Ingreso: enero-2002
Ubicación: Cancun, México.
Mensajes: 506
Antigüedad: 22 años, 3 meses
Puntos: 6
Que raro ahora me sale:
Warning: Cannot add header information - headers already sent by (output started at /usr/local/psa/home/vhosts/portalcancun.com/httpdocs/index.php:8) in /usr/local/psa/home/vhosts/portalcancun.com/httpdocs/encuesta.php on line 6

Warning: Cannot add header information - headers already sent by (output started at /usr/local/psa/home/vhosts/portalcancun.com/httpdocs/index.php:8) in /usr/local/psa/home/vhosts/portalcancun.com/httpdocs/encuesta.php on line 7

esas lineas son en donde insertas el cookie que raro.
__________________
I do techy stuff for a living and practice MMA with my dog... He always wins.
  #6 (permalink)  
Antiguo 22/02/2003, 16:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Estas llamando a este script en un include() en otra página? ..

Asegurate q no tengan ningun espacio o salto de linea antes del <? .. eso es considerado como envio de cabecera .. ademas de por supuesto nada mas de HTML antes ...

Un saludo,
  #7 (permalink)  
Antiguo 22/02/2003, 17:19
Avatar de WyLY  
Fecha de Ingreso: enero-2002
Ubicación: Cancun, México.
Mensajes: 506
Antigüedad: 22 años, 3 meses
Puntos: 6
Si estaba haciendo include pero aunque lo agrregue en la pagina principal me sale error en estas dos lineas.

setcookie("encuesta","encuesta",time()+3600*24*7);
header("Location: $PHP_SELF");

perdon por las molestias y gracias.
__________________
I do techy stuff for a living and practice MMA with my dog... He always wins.
  #8 (permalink)  
Antiguo 22/02/2003, 18:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Ya te avisé q te iva a pasar eso:

Cita:
Si metes este sistema de votaciones en alguna pagina via include() por ejemplo con mas HTML por delante te va a dar problemas de cabeceras este redireccionamiento via header(). Para solucionarlo usa redirecionamiento javascript o saca ese bloque de código (el condicional: if($submit && !isset($HTTP_COOKIE_VARS["encuesta"])) { ) fuera de ese punto de tu código y ejecutalo antes de tu <html> q pudieras tener ..
Tienes que sacar fuera del "include" la parte del código de ese concional que hace el setcookie() y el header .. Ponlo antes de tu HTML de la pagina q lo llamas.

Código PHP:
<?
if($submit && !isset($HTTP_COOKIE_VARS["encuesta"])) {

// se contabiliza el voto en el archivo de texto plano...
$fp=fopen("$archivo","a+");
$w=fputs($fp,"$voto#");

// se crea la cookie
setcookie("encuesta","encuesta",time()+3600*24*7);

// redireccionar a si mismo la pagina .. sino no estará disponible la cookie
header("Location: $PHP_SELF");
exit;
}
?>
<html>
<head>
</head>
<body>
<?
// donde corresponda el include de tu include("encuesta.php"); .. sin el condicional q ya hemos sacado...
?>
</body>
</html>
Hay otra forma de solucionar tu problema con cabeceras sin tocar el "include" de tu encuesta .. Se trata de usar el buffer de salida de PHP (ob_start() funciones y afines ...)

Personalmente creo q es mas recomendable estructurar bien tu código pensando en que se va a usar cabeceras o cookies que en "parchear" usando esas técnicas ...

En realidad lo q tendras q convertir tu "encuesta" en funciones y llamarlas segun las requieras .. una funcion sería la que ya medio se ha hecho al separar ese "condicional" aparte ... otras seria el resto del script prácticamente ..

De esa forma harias tu:

<?
include("encuesta");
include("deotracosas");


encuesta_chekea($parametros);
?>

tu HTML comun ..

<?
encuesta_mostrar($parametros);
?>

resto de HTML .. etc ...

Y de ahí a OOP solo quedaria un paso (. o dos xD)

Un saludo,

Última edición por Cluster; 22/02/2003 a las 18:08
  #9 (permalink)  
Antiguo 22/02/2003, 21:35
Avatar de WyLY  
Fecha de Ingreso: enero-2002
Ubicación: Cancun, México.
Mensajes: 506
Antigüedad: 22 años, 3 meses
Puntos: 6
JEJE ya esta cluster gracias xDDD
__________________
I do techy stuff for a living and practice MMA with my dog... He always wins.
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 10:32.