Foros del Web » Programando para Internet » PHP »

Problema con caracter "?" en cadena ...

Estas en el tema de Problema con caracter "?" en cadena ... en el foro de PHP en Foros del Web. Hola una vez más. Estoy haciendo un sistema de mensajes, donde por medio de la pregunta es el link que envio, ejemplo "Cuantas horas tiene ...
  #1 (permalink)  
Antiguo 30/09/2007, 10:16
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 20 años, 4 meses
Puntos: 0
Problema con caracter "?" en cadena ...

Hola una vez más.
Estoy haciendo un sistema de mensajes, donde por medio de la pregunta es el link que envio, ejemplo "Cuantas horas tiene un dia??". Entonces, mi link seria "preguntas.php?ir=cuantas_horas_tiene_un_dia?? " ... el problema que cuando obtengo esa variable por GET, los "??" desaparecen ..

Entonces quisiera saber como por GET obtener esos caracteres, o como por medio de la URL mandarle un caracter ASCII para que GET lo pueda interpretar.

Espero haberme explicado.
  #2 (permalink)  
Antiguo 01/10/2007, 11:23
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 16 años, 7 meses
Puntos: 2
Re: Problema con caracter "?" en cadena ...

Si estás construyendo el enlace desde PHP, parece que lo que buscas es la función urlencode(), que reemplaza algunos caracteres con secuencias de escape que son interpretadas correctamente por el servidor web, y luego recibidas en tu aplicación de forma transparente. Un pequeño ejemplo:

Código PHP:
<?php
$pregunta 
'¿Cuántas horas tiene un día?';
$enlace 'preguntas.php?ir=' urlencode ($pregunta);

echo 
"<a href=\"$enlace\">Pregunta</a>";

// preguntas.php recibirá la frase en $_GET['ir'] correctamente
?>
  #3 (permalink)  
Antiguo 10/10/2007, 11:00
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 20 años, 4 meses
Puntos: 0
Re: Problema con caracter "?" en cadena ...

Perfecto brother, veo que el codigo es "%3F".
Ahora el problema esta en que la variable aun no me toma ese valor ...

Si envio por ejemplo "preguntas.php?ir=hola+como+estas". El valor de la variable es "hola".
Si de igual manera envio "%3F%3F"; el valor de la variable es "".

Y lo obtengo de la siguiente manera:
Código PHP:
$pregunta $_GET['ir'];
echo 
"$pregunta"
  #4 (permalink)  
Antiguo 10/10/2007, 16:06
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 16 años, 7 meses
Puntos: 2
Re: Problema con caracter "?" en cadena ...

Cita:
Iniciado por ThunderFx Ver Mensaje
Ahora el problema esta en que la variable aun no me toma ese valor ...

Si envio por ejemplo "preguntas.php?ir=hola+como+estas". El valor de la variable es "hola".
Si de igual manera envio "%3F%3F"; el valor de la variable es "".
Eso es un poco extraño. Quizás sucede algo con el navegador o con el servidor web, que causa que la cadena query sea recibida incorrectamente en PHP, pero la verdad no recuerdo haber visto algo así antes.

Probablemente no sea nada fuera de lo ordinario, pero para tratar de encontrar el problema, te preguntaría lo siguiente:

¿Qué navegador usas?
¿Qué servidor web usas?

También, ¿qué salida recibes si colocas lo siguiente en el siguiente script?

Código PHP:
$pregunta $_GET['ir'];
var_dump ($pregunta);

echo 
"<p>***</p>";

var_dump ($_GET); 
  #5 (permalink)  
Antiguo 10/10/2007, 17:17
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 20 años, 4 meses
Puntos: 0
Re: Problema con caracter "?" en cadena ...

Despues de haber posteado una larga respuesta, encontre el problema.
El problema esta que el htaccess me imagino que no manda esos caracteres.

Código PHP:
RewriteRule ^categorias/([a-z_a-z]+)/([a-z_a-z]+)/([a-z_a-z]+)  inicio.php?go=categorias&seccion=$1&sub=$2&preg=$[NC,L
Quiero pensar que el NC o L, evitan que esos caracteres ("?") sean enviados o hay que agregar alguna función para que sean tomados en cuenta.
Espero alguien me pueda ayudar a la solucion del problema, he estado buscando en google pero no le encuentro.

Gracias.
  #6 (permalink)  
Antiguo 10/10/2007, 17:43
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 16 años, 7 meses
Puntos: 2
Re: Problema con caracter "?" en cadena ...

Cita:
Iniciado por ThunderFx Ver Mensaje
El problema esta que el htaccess me imagino que no manda esos caracteres.
Ahhh, eso lo explica todo... :)

Te sugiero que modifiques la regla de ModRewrite de este modo:

Código:
RewriteRule ^categorias/([^/]+)/([^/]+)/([^/]+) inicio.php?go=categorias&seccion=$1&sub=$2&preg=$3 [NC,L]
Esta nueva expresión regular captura esas tres variables, siempre y cuando coincidan con secuencias de caracteres diferentes a la barra hacia adelante (/).

La expresión regular que usas actualmente limita las cadenas a ser secuencias de letras minúsculas o el caracter de subrayado (_), por eso caracteres como el espacio, o el símbolo de interrogación no estaban siendo pasados.
  #7 (permalink)  
Antiguo 15/10/2007, 16:57
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 20 años, 4 meses
Puntos: 0
Re: Problema con caracter "?" en cadena ...

Hola brother, te agradezco mucho la ayuda que me estas brindando.
El problema fue solucionado, pero ahora me pasa algo curioso. Tengo una funcion en un archivo, lo que hace es decirme si esa variable es true o false. Ahora bien, justamente cuando lo visualizo desde la página "categorias/([^/]+)/([^/]+)/([^/]+)" la variable siempre me devuelve true. Pero cuando las visualizo desde las otras, donde en el htaccess lo tengo asi "categorias/([a-z_a-z]+)/([a-z_a-z]+)", la variable me devuelve el valor verdadero.

Conclusion, al visualizar desde "categorias/([^/]+)/([^/]+)/([^/]+)" la variable siempre es true.
Al visualizar desde "categorias/([a-z_a-z]+)/([a-z_a-z]+)" la variable me devuelve el verdadero valor, true o false.

Aqui el codigo
security.php
Código PHP:
$loginCorrecto false;
if(isset(
$HTTP_COOKIE_VARS["Nick"]) && isset($HTTP_COOKIE_VARS["Pass"])){
$loginCorrecto true;
} else {
    
setcookie("Nick","x",time()-3600);
    
setcookie("Pass","x",time()-3600);

Entonces en el archivo donde pido el valor hago lo siguiente:
Código PHP:
include("security.php");
  if(
$loginCorrecto){
    echo 
"correcto";
    } else {
    echo 
"incorrecto";
    } 
  #8 (permalink)  
Antiguo 15/10/2007, 20:59
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 16 años, 7 meses
Puntos: 2
Re: Problema con caracter "?" en cadena ...

Ese problema de las cookies probablemente tenga que ver con la ruta en la que se están definiendo. En alguna parte de tu código deben haber llamados a setcookie() que establecen los valores de 'Nick' y 'Pass' cuando, me imagino yo, un usuario inicia una sesión.

Sin conocer cómo luce el código que maneja tus sesiones, es difícil darte una ayuda más precisa, pero verifica si estás usando el cuarto parámetro de la función setcookie() al definir inicialmente las cookies, y prueba usando una ruta como '/'. Es decir al crear las cookies, setcookie() luciría algo así:

Código PHP:
// Aquí realizas toda la operación de inicio de sesión
// Supongamos que finalmente tienes el nick del usuario en $nick,
// la contraseña en $pass y el tiempo de vida de la cookie en $tiempo, entonces:

setcookie ('Nick'$nicktime () + $tiempo'/');
setcookie ('Pass'$passtime () + $tiempo'/'); 
  #9 (permalink)  
Antiguo 16/10/2007, 14:39
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 20 años, 4 meses
Puntos: 0
Re: Problema con caracter "?" en cadena ...

huuuu realmente no entiendo que es lo que pasa!!
brother, agradezco realmente el interes que tienes en ayudarme, muchas gracias... comenzemos con toda la explicación del script ... solamente en esa pagina la cookie como que fantagoricamente vuelve a existir

Tengo un archivo principal que es inicio.php, en el tengo los includes:
Código PHP:
<?
ob_start
();
?>
.... codigo html ...
        <div id="incluir">
    <?
    
switch($go)
    {
    default:
    echo 
"x";
    break; case 
"preguntar":
    include(
'preguntar.php');
    break; case 
"registrar":
    include(
'registrar.php');
    break; case 
"login":
    include(
'login.php');
    break; case 
"categorias":
    include(
'preguntas.php');
    }
    
?>
    </div>
... </html>
<? ob_end_flush(); ?>
Ahora bien, el archivo donde al visualizarme la variable toma el valor es en preguntas.php, que lo miro desde la direccion (.htaccess) "RewriteRule ^categorias/([^/]+)/([^/]+)/([^/]+) inicio.php?go=categorias&seccion=$1&sub=$2&preg=$3 [NC,L]" ....

preguntas.php
Código PHP:
<?
include("security.php");
// Pequeña funcion para que pueda ver si el login es correcto o no, en este caso de la URL del htacess, $user y $contrasena toman el valor de la cookie que se al registrar la misma.
  
if($loginCorrecto){
    echo 
"$user y $contrasena";
    } else {
    echo 
"in";
    }
Ahora de igual manera visualizo el mismo archivo preguntas.php pero desde otra direccion del htacess, que es la siguiente:
RewriteRule ^categorias/([a-z_a-z]+)/([a-z_a-z]+) inicio.php?go=categorias&seccion=$1&sub=$2 [NC]
<-- Aquí, la variable de $user deja de existir y la funcion no se válida...

Ahora aqui pongo el archivo de security.php
Código PHP:
<?
include("conexion.php");
$loginCorrecto false;

if(isset(
$HTTP_COOKIE_VARS["Nick"]) && isset($HTTP_COOKIE_VARS["Pass"])){

   
$result mysql_query("SELECT * FROM usuarios WHERE usuario='".$HTTP_COOKIE_VARS["Nick"]."' AND contrasena='".$HTTP_COOKIE_VARS["Pass"]."'");

   if(
$row mysql_fetch_array($result)){

    
setcookie("Nick",$HTTP_COOKIE_VARS["Nick"],time()+7776000,'/');
    
setcookie("Pass",$HTTP_COOKIE_VARS["Pass"],time()+7776000,'/');
    
$user $HTTP_COOKIE_VARS["Nick"];
    
$contrasena $HTTP_COOKIE_VARS["Pass"];
    
$loginCorrecto true;

   } else {
    
setcookie("Nick","x",time()-3600);
    
setcookie("Pass","x",time()-3600);
   }
}

?>
Ahora bien, para dar una conclusión en general, lo que esta pasando que en esa direccion ^categorias/([^/]+)/([^/]+)/([^/]+) inicio.php?go=categorias&seccion=$1&sub=$2&preg=$3 [NC,L]" las variables de user y contrasena toman el valor de la cookie, cuando en teoria las cookies deberian estar destruidas, en su caso tener otro valor que es el que asignamos al salir.php.

salir.php
Código PHP:
<?
include("security.php");

    
$u $HTTP_COOKIE_VARS["Nick"];
    
$p $HTTP_COOKIE_VARS["Pass"];

echo 
"u: $user  p: $p";

    
setcookie("Nick","x",time()-3600,'/');
    
setcookie("Pass","x",time()-3600,'/');

    
$newu $HTTP_COOKIE_VARS["Nick"];
    
$newp $HTTP_COOKIE_VARS["Pass"];

echo 
"newu: $newu  newp: $newp";

?>
Curiosamente en el archivo de salir.php realmente ninguna variable toma valor, osea tienen valor de nada "" ... lo que trato de hacer ahi es que primero me imprima las variables con el valor actual y luego que me imprima los nuevos valores, pero ahi curiosamente ninguna variable toma valor.

Espero puedas ayudarme brother, estoy tratando de solucionar el problema y no le encuentro salida. De verdad muchas gracias.
  #10 (permalink)  
Antiguo 16/10/2007, 15:33
 
Fecha de Ingreso: septiembre-2007
Mensajes: 52
Antigüedad: 16 años, 7 meses
Puntos: 2
Re: Problema con caracter "?" en cadena ...

Cita:
Iniciado por ThunderFx Ver Mensaje
brother, agradezco realmente el interes que tienes en ayudarme, muchas gracias...
Ni lo menciones :). Para mí es un gusto ayudar en lo que pueda, y ya que has hecho un esfuerzo por hacerte entender y publicar el código que tienes, no puedo hacer menos que corresponder echando un vistazo a ver qué pistas nuevas encontramos.

Bueno, respecto al problema, empiezo a sospechar que se trata de un efecto secundario del flujo de código en ciertos escenarios. Es decir, cada componente de tu aplicación (security.php, inicio.php, etc.) puede lucir correcto por separado, pero al mezclarlos y seguir el hilo de ejecución (por ejemplo, cuando el usuario visita una URL de la forma categorias/([^/]+)/([^/]+)/([^/]+)), probablemente hay llamados a setcookie() que sobrescriben valores previos, y el comportamiento empieza a ser un poco difícil de determinar ya que hay una mezcla de cosas que afectan el resultado final (valores de ruta de cookies y el comportamiento del navegador si recibe más de una cabecera 'Set-Cookie' para un mismo valor).

Me parece que encontrar la fuente del problema no sería difícil, pero necesitaría ver el código de toda la aplicación, porque hasta ahora veo que hay cosas que no has publicado y que son importantes. Por ejemplo, el código en security.php refresca el tiempo de expiración de las cookies si ya existen, pero en alguna parte deben definirse las cookies por primera vez (supongo que en login.php). También, ese archivo salir.php que has mostrado, ¿desde dónde es incluído?

Bueno, habiendo dicho todo esto, hay un par de cosas sobre las que podría darte sugerencias de lo que has mostrado en tu último mensaje:

1. En security.php tienes esta línea:

Código PHP:
$result mysql_query("SELECT * FROM usuarios WHERE usuario='".$HTTP_COOKIE_VARS["Nick"]."' AND contrasena='".$HTTP_COOKIE_VARS["Pass"]."'"); 
Nota que este código es vulnerable al tipo de ataques conocidos como "inyección SQL". para evitar ese tipo de problemas, básicamente asegúrate de validar siempre la entrada que te venga desde afuera (p.ej. $_GET, $_POST, $_COOKIE, etc.).

Te sugiero esta alternativa:

Código PHP:
$sql sprintf ("SELECT * FROM usuarios WHERE usuario='%s'
                 AND contrasena='%s'"
,
                 
mysql_real_escape_string ($_COOKIE['Nick']),
                 
mysql_real_escape_string ($_COOKIE['Pass']));

$result mysql_query($sql); 
2. En este segmento de código:

Código PHP:
    setcookie("Nick","x",time()-3600,'/');
    
setcookie("Pass","x",time()-3600,'/');

    
$newu $HTTP_COOKIE_VARS["Nick"];
    
$newp $HTTP_COOKIE_VARS["Pass"];

    echo 
"newu: $newu  newp: $newp"
Parece que esperaras ver que el valor en $HTTP_COOKIE_VARS["Nick"] cambiara después de llamar a setcookie(), pero ese no es el caso. La función setcookie() no define automáticamente nada en la matriz $HTTP_COOKIE_VARS (o $_COOKIE), éstas matrices se llenan cuando se hace una petición de página, es decir, tendrías que esperar hasta la próxima petición del usuario para ver que en efecto $HTTP_COOKIE_VARS["Nick"] cambió su valor.

Si en realidad necesitas actualizar inmediatamente el valor de $HTTP_COOKIE_VARS, hazlo manualmente:

Código PHP:
// Borrar cookies
setcookie("Nick","x",time()-3600,'/');
setcookie("Pass","x",time()-3600,'/');

unset(
$HTTP_COOKIE_VARS['Nick']);
unset(
$HTTP_COOKIE_VARS['Pass']); 

Finalmente, recuerda limpiar las cookies en tu navegador cada vez que vayas a probar un nuevo cambio en tu código, ya que puede darse el caso de que corrijas todos los problemas, tu código esté perfecto, pero sigas viendo comportamiento extraño debido a cookies viejas :).
  #11 (permalink)  
Antiguo 18/10/2007, 12:40
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 20 años, 4 meses
Puntos: 0
Re: Problema con caracter "?" en cadena ...

Hola brother, muchas gracias por la ayuda.
El archivo salir.php no lo ejecuto en ningun lado mas que el mismo, osea "/salir.php".

Mi objetivo de salir es el siguiente:
// Obtener el valor de las cookies de usuario y contrasena y guardalo en variable ($u y $p)
// Imprimir las variables con su actual valor ($u y $p)

// Borrar las cookies
// Obtener de nuevo las cookies de user y contrasena con su nuevo valor en las variables ($newu, $newp)
// Imprimir dichas variables

Ahora le agregue el unset y realmente no pasa nada, al contrario, si le sigo dando actualizar me devuelve lo mismo.

u: ThunderFX p: 123456
newu: newp:
  #12 (permalink)  
Antiguo 22/10/2007, 18:33
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 20 años, 4 meses
Puntos: 0
Re: Problema con caracter "?" en cadena ...

Alguien puede ayudarme?? help meee
  #13 (permalink)  
Antiguo 30/10/2007, 12:58
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 20 años, 4 meses
Puntos: 0
Re: Problema con caracter "?" en cadena ...

Alguien alguien, porfavor?? no le encuentro la solucion :(
  #14 (permalink)  
Antiguo 30/10/2007, 13:03
 
Fecha de Ingreso: diciembre-2003
Ubicación: Campehce, Mexico
Mensajes: 325
Antigüedad: 20 años, 4 meses
Puntos: 0
Re: Problema con caracter "?" en cadena ...

Alguien alguien, porfavor?? no le encuentro la solucion :(
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 04:11.