Foros del Web » Programando para Internet » PHP »

Formulario no procesa datos

Estas en el tema de Formulario no procesa datos en el foro de PHP en Foros del Web. Hola. Como siempre traigo una de las más sencillas dudas... Pero para mí es complejísima . El problema es el siguinte: Tengo un archivo (perfil.php, ...
  #1 (permalink)  
Antiguo 26/08/2009, 08:28
 
Fecha de Ingreso: julio-2009
Mensajes: 52
Antigüedad: 15 años, 4 meses
Puntos: 3
Formulario no procesa datos

Hola.
Como siempre traigo una de las más sencillas dudas... Pero para mí es complejísima .
El problema es el siguinte: Tengo un archivo (perfil.php, por ejemplo) en el que hay 3 includes (footer, header y menu). Dentro del header, cargo unos archivos necesarios, que ejecutan determinadas funciones.

En el cuerpo del perfil.php, hay un formulario. Cuando tú entras a perfil.php, te sale el formulario, mientras que si entras en perfil.php recibiendo datos (por post, al pinchar el botón de enviar del form), se ejecuta el formulario. Hasta aquí todo correcto.

El problema es que cuando ejecutas el formulario con todos los includes dentro, me redirige al index y no procesa el formulario. Sin embargo, si lo dejo sin includes, el formulario es procesador correctamente. He revisado el código de todos los includes y a mi parecer está todo correcto; Si supiera por que se produce esa redirección podría saber dónde buscar y qué código cambiar en caso de fallo.. ¿Alguien sabe por qué es?

Muchas gracias de antemano y saludos!!
  #2 (permalink)  
Antiguo 26/08/2009, 09:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Formulario no procesa datos

Pues es difícil adivinar la causa, menos sin ver el código o al menos un ejemplo de lo que haces, ya que PHP por si solo no redirige, es tu código el que lo hace redirigir, pero repito sin poder ver la parte afectada es complicado adivinar.

Saludos.
  #3 (permalink)  
Antiguo 26/08/2009, 09:23
 
Fecha de Ingreso: julio-2009
Mensajes: 52
Antigüedad: 15 años, 4 meses
Puntos: 3
Respuesta: Formulario no procesa datos

Hola.
El código es bastante largo, voy a poner los trozos que yo creo que son problematicos.

En el archivo cperfil.php, donde tengoo el formulario, antes de nada tengo colocado esto:
Código PHP:
<?
ob_clean
();
ob_start();
session_start();
include_once(
"class/db.class.php");
include_once(
"inc/comp.login.inc.php");
$con = new bd();
include_once(
"class/runtimes.class.php");
$u = new limitar;
?>
El archivo db.class.php es una clase para conexion con MySQL y no da problemas de ningún tipo.

El archivo comp.login.inc.php tiene esto:
Código PHP:
<?
session_start
();
// Comprobador de login. Incluido en todas las paginas que requieran de seguridad.

$c = new bd();

// Buscamos en la base de datos un usuario que corresponda con los datos entregados
$user=mysql_query("SELECT id FROM usuarios_perfil WHERE id='".$_SESSION['id']."' && cookie='".$_SESSION['random']."'");
$r=mysql_fetch_array($user);

    
// Cargamos salud y carcel del usuario.
    
$carga=mysql_query("SELECT salud,carcel FROM usuarios_jugador WHERE id='".$_SESSION['id']."'");
    
$d=mysql_fetch_array($carga);

if (!
$r["id"] || $_SESSION["random"] != $_COOKIE["Crimob"]) {
    
header("Location: logout.php");
    
} else {
    
// Comprobamos que el usuario no esté en la cárcel. Dentro de cargador.class.php se realizan las acciones correspondientes a cada caso.
    
if ($d["salud"] == 0) {
        
header("Location: dead.php?s=death");
    }
    
    
// Comprobamos que el usuario no esté muerto (salud=0). Dentro de cargador.class.php se realizan las acciones correspondientes a cada caso.
    
if ($d["carcel"] != 0) {
        
header("Location: carcel.php?a=prison");
    }
}                                                                                                                                                                                                                                                                                                                
?>
Y el archivo runtimes.class.php, entre otras muchas cosas, tiene esto:
Código PHP:
//-----------------------------------------------------------------------------------------------------------------
// Método cambiar el perfil de un usuario. Puede cambiar el avatar, el email y la contraseña.
function changePerfil() {
    
    
// Conectamos con BD.
    
$c = new bd();
    
    
// Escapamos los caracteres que nos llegan.
    
$email=$c->e($_POST["email"]);
    
$an_passwd=$c->e($_POST["antigua_passwd"]);
    
$avatar=$c->e($_POST["avatar"]);
    
$npasswd=md5($c->e($_POST["npasswd"]));
    
    
// Buscamos la contraseña del usuario.
    
$user=mysql_query("SELECT passwd FROM usuarios_perfil WHERE id='".$_SESSION['id']."'");
    
$u=mysql_fetch_array($user);
    
    
// Si el campo contraseña antigua está en blanco, quiere decir que no quiere cambiar la contraseña.
    
if ($an_passwd == "" ) {
        
$query=mysql_query("UPDATE usuarios_perfil SET email='$email', avatar='$avatar' WHERE id='".$_SESSION['id']."'");
        
// generamos los mensajes.
        
$this->titulo="Correcto";
        
$this->mensaje="Perfil actualizado con éxito";
    } elseif (
md5($an_passwd) != $u["passwd"]) {
        
$this->titulo="Error";
        
$this->mensaje="La contraseña antigua no es correcta. Si no quieres cambiarla, déjala en blanco.";
    } else {
        
$query=mysql_query("UPDATE usuarios_perfil SET email='$email', avatar='$avatar', passwd='$npasswd' WHERE id='".$_SESSION['id']."'");
        
// generamos los mensajes.
        
$this->titulo="Correcto";
        
$this->mensaje="Perfil actualizado con éxito";
    }
    
    
// Liberamos memoria y cerramos conexiones.
    
$c->l($query);
    
$c->close();
    

Por supuesto todos los objetos están definidos y llamados correctamente dentro de cada archivo. Luego, dentro de cperfil.php, está header.php,menu.php y footer.php. Lo mas importante de cada uno es:

header.php
Código PHP:
<?
include_once("class/cargador.class.php");
$datos = new cargador();
?>
Y dentro de cargador un método de la clase cargador que carga determinados datos y los almacena en diferentes atributos de esa clase.


menu.php tiene un simple if:
Código PHP:
<?
if ($_SESSION['id']) { 
?>
Con su else debajo y tal...

Y footer.php no dispone de código php, es todo html.

Espero haber aclarado un poco mi problema, pido disculpas.
Saludos y muchas gracias!!
  #4 (permalink)  
Antiguo 26/08/2009, 09:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Formulario no procesa datos

Pues si como indicas en ese código que ves no se ve el problema, debes de revisar bien en todas las partes donde haya redirects (header("Location..) para que veas en que parte te redirige al index.php, y entonces veas el porque, es probable que te falte algún parámetro para enviar dentro del formulario para que no haga ese redirect.

Saludos.
  #5 (permalink)  
Antiguo 26/08/2009, 09:45
 
Fecha de Ingreso: julio-2009
Mensajes: 52
Antigüedad: 15 años, 4 meses
Puntos: 3
Hola de nuevo.
He estado probando diferente código y la cosa cambia de estar logueado a no estarlo.

Vereis... Si no estoy logueado, me funcionan los formularios bien (el de registro, que es el que puedo probar). En cambio, si estoy logueado, voy al formulario de registro y al pinchar sobre el botón no me deja hacer nada. Igual ocurre con un formulario que sí funciona en otro archivo (copy & paste a éste) y en éstas condiciones (logueado y con esa estructura de includes), no me funciona.

Creo que el problema está en los includes y la forma de realizarlos...

Saludos.

Hola.
Ya lo solucione, era problema de sessions. Que mala leche tengo encima ahora mismo....!!!

Gracias, GatorV.
Saludos!!

Última edición por GatorV; 26/08/2009 a las 13:06
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 22:36.