PHP, Cookies y switch de hojas de estilo
Buenas!!
tenia en una web que estoy preparando un switch de css en javascript, pero he decidido olvidar el javascript para realizarlo en php y me encuentro con un problema.
este en el switcher:
switchstyle.php
<code><?php
//process any new request
if ($newstyle){
$csstyle=$newstyle;
setcookie("csstyle", $csstyle, time()+360000, "", "", 0);
}
//set to default if not specified
if ( !isset ($csstyle)){
$csstyle="normal";
}
?></code>
En todas las páginas hago el include:
<code> <?php
include("./includes/styleswitch.php");
?> </code>
y meto este link a la hoja de estilo:
<code><link rel="stylesheet" href="<? print $csstyle?>.css" type="text/css" title="default" /></code>
y de esta forma hago la llamada desde un simple enlace:
<code> <a href="<? print $PHP_SELF."?newstyle=normal"?>" title="Normal" ><span class="switchcss">Normal</span></a>
<a href="<? print $PHP_SELF."?newstyle=contraste"?>" title="Alto Contraste" ><span class="switchcss">Alto Contraste</span></a>
<a href="<? print $PHP_SELF."?newstyle=sinestilo"?>" title="Sin Estilo" ><span class="switchcss">Sin Estilo</span></a>
</code>
Ahora viene el problema, en local me funciona correctamente, respetando la cookie del ultimo estilo seleccionado y usando la misma para el resto de la navegación.... pero... cuando lo subo al servidor de pruebas me dice que tururú, siempre vuelve al estilo 'normal' que es la que esta estipulada por defecto.
alguien tiene alguna pista del error?
meddle
prueba:
if ($_GET['newstyle']){...
Hipster
ok meddle, probare en cuanto llegue a casa... gracias
pero...
hay alguna razon por la que no me funcione en servidor y si me funcione en local?
si alguien sabe la respuesta genial... es para ir despejando dudas :D
meddle
la razon mas probable (de ahi el codigo que te he pasado) es que en local tengas el servidor en modo nbo seguro con GLOBALS ON, es de cir, tus variables se pueden llamar por si mismas y no por el entorno en que fueron creadas. Por ejemplo, normalmente se hacia (ahora deberia no hacerse) recoger variables del formulario (POST o GET) simplemente llamando el nombre del campo del formulario. Si los GLOBALS estan en OFF eso no te devuelve nada.
Yo de ti tambien comprobaria que la variable de hoja de estilos toma un valor correcto, para que no te puedan pasar una string maliciosa. Algo como
<code>
$accept = array(
"hoja1",
"hoja2",
"hoja3"
);
// Comprobando si los valores son "aceptables"
if(in_array($_GET['newstyle']), $accept)){
setcookie("idioma", $_GET['newstyle']), time()+31536000, '/', 'tuserver.com', '0');
}
</code>
hartum
yo tengo un truqui para no andar poniendo $_get y esas cosas que son un coñazo. el truqui es poner al principio del php
if ($_GET){extract ($_GET)}
if ($_POST){extract ($_POST)}
y aleeeeeeeee ya puedo usar mis variables tal cual.
meddle
Del manual:
http://es.php.net/extract
<fieldset> Do not use extract() on untrusted data, like user-input ($_GET, ...). If you do, for example, if you want to run old code that relies on register_globals temporarily, make sure you use one of the non-overwriting extract_type values such as EXTR_SKIP and be aware that you should extract $_SERVER, $_SESSION, $_COOKIE, $_POST and $_GET in that order.</fieldset>
meddle
De todas maneras si lo combinas con el apaño mio de antes no deberia haber problema.
Hipster
estoooo.... necesitaria una explicacion pa'tontos :S
he probado con vuestros remedios pero no chuta.
meddle
¿entonces puedes pegar tu codigo?
Hipster
uuffffff.... los efectos de un largo y duro lunes...
lo dejo para mañana. ahora mismo es casi como un reto personal :D asi que prefiero que no me deis mas pistas hasta mañana. si mañana sigo en las mismas ya pegare el codigo (aunque basicamente es lo que ya he copiado), y si no ya os dire como lo he solucionado ;)
dejadme solo!!!! :P
Hipster
ayer estuve toda la tarde probando y ya cuando estaba a punto de cortarme las venas decidi dejarmelas largas y mande un correo al servicio tecnico del hosting.
probe el script en otros hostings al que tengo acceso y funcionaba correctamente, y justo en el que tengo que colgarlo no tira. Ni siquiera tira el que tenia anteriormente en javascript (que tambien creaba cookies). Asi que imagino sera un problema del servidor.
espero respuesta del servicio tecnico...
por lo demas muchas gracias a ambos, me va de perlas vuestras recomendaciones ;)
tokyo
HARTUM
yo tengo un truqui para no andar poniendo $_get y esas cosas que son un coñazo. el truqui es poner al principio del php
if ($_GET){extract ($_GET)}
if ($_POST){extract ($_POST)}
y aleeeeeeeee ya puedo usar mis variables tal cual.
pues nada... que me ha ido perfectamente y te lo agradezco.
<b>víctor b</b> (BCN)
...............................
<a href="http://comiendoentokyo.dotgeek.org/">comiendoentokyo.org</a>
Hipster
joe, me habia olvidado de responder y dar las gracias :oops:
al final mi problema era una autentica chorrada.... habia puesto el include despues del doctype.... y claro... la cookies a tomar por saco
zigotica
te pasa por no haber pegado el codigo cuando te lo pedimos ;)
explicacion: no puedes cambiar cookies una vez enviado el header, que se hace automaticamente al mandar algo al html.
pepevi
HARTUM
if ($_GET){extract ($_GET)}
if ($_POST){extract ($_POST)}
y aleeeeeeeee ya puedo usar mis variables tal cual.
:O Yo esto lo veo peligrosísimo xD
zigotica
pepevi, leete el comentario de meddle justo anterior al de hartum, donde explico como evitar codigo malicioso usando un vector de valores validos.