2011-02-02 41 views
16

Estoy construyendo un sitio web que incluye una página de inicio de sesión. Necesito redirigir al usuario a su página de perfil una vez que haya iniciado sesión correctamente, pero no sé cómo hacerlo en PHP (es mi primer sitio).Cómo redirigir a otra página usando PHP

He buscado en Internet y me han dicho que la función header() debería funcionar, pero solo funcionará si no he generado ninguna información antes de usarla.

Ese es el problema. He publicado un montón de información (incluido el HTML para construir la página de inicio de sesión). Entonces, ¿cómo redirijo al usuario de una página a la siguiente?

¿Qué opciones tengo? Además, ¿cuál es la mejor práctica en estos casos?

Gracias!

EDIT: Aquí está toda mi página login.php

<?php 

session_start(); 

echo "<!DOCTYPE html> 
    <html> 
    <head> 
     <meta charset='utf-8'> 
     <title>Sprout</title> 
    <link rel='stylesheet' href='stylesheet.css' type='text/css'> 
    </head> 
<body> 
    <div class='box'> 
    <form action='login.php' method='post'> 
     Name<br /> <input type='text' name='username' class='form'/><br /> 
     Password<br /> <input type='password' name='password' class='form'/> 
     <input type='submit' value='Login' class='button' /> 
    </form> 
    </div> 
</body> 
    </html>"; 

if ($_SERVER['REQUEST_METHOD'] == 'POST') 
{ 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 

    $dbhost = "localhost"; 
    $dbuser = "root"; 
    $dbpass = "root"; 

    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Error connecting to database"); 

    $dbname = "database"; 

    mysql_select_db($dbname); 

    $query = "SELECT username FROM users WHERE username = '$username' AND password = '$password'"; 

    $result = mysql_query($query) or die ("Failed Query of " . $query); 


    while($row = mysql_fetch_assoc($result)) 
    { 
      $_SESSION["user"] = $username; 
    } 
} 
?> 
+0

Estoy un poco confundido aquí, básicamente, la función de encabezado es lo que estás buscando, pero creo que la estás usando mal aquí, entonces la página html es la página de inicio de sesión, y hay forma de que el usuario inicie sesión en, cuando haces clic en enviar, o inicias sesión o lo que sea, ¿qué sucede, a dónde vas? – mcbeav

+0

la función de encabezado debe estar atascada en su secuencia de comandos de inicio de sesión. renunciar a algún código o más detalles para que pueda ayudarlo más. – mcbeav

+0

por cierto, ¿escribiste el guión para iniciar sesión o estás utilizando uno prefabricado? es importante. – mcbeav

Respuesta

12

Ese es el problema. He publicado un montón de información (incluido el HTML para construir la página de inicio de sesión). Entonces, ¿cómo redirijo al usuario de una página a la siguiente?

Esto significa que su diseño de la aplicación está bastante roto. No debería estar produciendo mientras se ejecuta su lógica comercial. Vaya a usar un motor de plantillas (como Smarty) o agréguelo usando output buffering). (! No una buena embargo)

Otra opción sería la salida de JavaScript para redirigir:

<script type="text/javascript">location.href = 'newurl';</script> 
+0

Lo que he hecho es sacar todo mi HTML para construir la página de inicio de sesión, luego mi lógica se ejecuta después. Es solo un formulario que creé con un campo de nombre de usuario y contraseña. El usuario lo ingresa y hace clic en iniciar sesión, y tengo una publicación en el mismo archivo login.php, donde ejecuto la lógica para ver si de hecho son o no un usuario. y luego redirigirlos a su perfil. Si no es así como debería estructurarlo, ¿cuál es la mejor práctica? – jasonaburton

+0

aquí hay un pseudocódigo: if (formulario enviado) {manejar datos y redirigir + salir si tiene éxito} mostrar formulario; si se ha enviado, rellene con los valores enviados – ThiefMaster

+0

¿Cómo puedo redireccionar? Dado que el formulario se repite en la misma página, no puedo usar el encabezado() – jasonaburton

2

Suponiendo que estés utilizando cookies para iniciar sesión, simplemente llamarlo después de su llamada setcookie - después de todo, debe estar llamando que uno antes de cualquier salida también.

De todos modos, en general, se puede comprobar la presencia de presentar el nombre del botón de su forma al comienzo de la secuencia de comandos, haga su lógica, y luego cosas salida:

if(isset($_POST['mySubmit'])) { 
    // the form was submitted 

    // ... 
    // perform your logic 

    // redirect if login was successful 
    header('Location: /somewhere'); 
} 

// output your stuff here 
2

usted podría utilizar ob_start(); antes de enviar cualquier salida. Esto le dirá a PHP que mantenga todo el resultado en un búfer hasta que finalice la ejecución del script, por lo que aún puede cambiar el encabezado.

Normalmente no utilizo el almacenamiento en búferes de salida, para proyectos simples guardo toda la lógica en la primera parte de la secuencia de comandos, luego imprimo todos HTML.

+1

Como dijo ThiefMaster, es mejor no generar nada hasta muy tarde en el proceso (y solo si es realmente necesario), pero el almacenamiento en búfer de salida sigue siendo bueno para garantizar que realmente no se envíe nada antes de que todos los encabezados estén fuera. Incluso puede descartar todo el contenido del buffer de salida si luego descubre algún problema mientras genera su salida usando 'ob_clean()'/'ob_end_clean()'. – Archimedix

+0

El almacenamiento en búfer de salida iba a ser mi segundo intento, pero se ha resuelto. ¡Gracias por la ayuda, no obstante! – jasonaburton

0

Aunque no es seguro, (sin ofender ni nada), sólo se adhieren a la función de cabecera después de establecer la variable de sesión

while($row = mysql_fetch_assoc($result)) 
    { 
      $_SESSION["user"] = $username; 
    } 
header('Location: /profile.php'); 
+0

esto debería funcionar, solo debería redirigir si se realizó la consulta. – mcbeav

+0

Ninguno tomado. Soy nuevo en esto. Es una experiencia de aprendizaje para mí. – jasonaburton

+0

He intentado ponerlo después de la sesión, pero la función de encabezado no funcionará después de haber superado algo en la página (el HTML). – jasonaburton

1

El enfoque más simple es que el script valida los datos de inicio de sesión forma publicado "en la parte superior "de la secuencia de comandos antes de cualquier salida.

Si el inicio de sesión es válido, lo redirigirá utilizando la función "encabezado".

Incluso si usa "ob_start()" a veces sucede que omite un solo espacio en blanco que da como resultado la salida. Pero verá una declaración en sus registros de errores a continuación.

<?php 
ob_start(); 
if (FORMPOST) { 
    if (POSTED_DATA_VALID) { 
     header("Location: https://www.yoursite.com/profile/"); 
     ob_end_flush(); 
     exit; 
    } 
} 
/** YOUR LOGINBOX OUTPUT, ERROR MESSAGES ... **/ 
ob_end_flush(); 
?> 
0

En la acción haga click en

if(isset($_POST['save_btn'])) 
    { 
     //write some of your code here, if necessary 
     echo'<script> window.location="B.php"; </script> '; 
    } 
14

Se podría utilizar una función similar a:

function redirect($url) { 
    ob_start(); 
    header('Location: '.$url); 
    ob_end_flush(); 
    die(); 
} 

A tener en cuenta, siempre se debe utilizar ya sea ob_flush() o ob_start() al comienzo de su header('location: ...'); funciones, y siempre debe seguirlos con una función die() o exit() para evitar más código ex ecución.

Ésta es una guía más detallada que cualquiera de las otras respuestas han mencionado: http://www.exchangecore.com/blog/how-redirect-using-php/

Esta guía incluye razones para el uso die()/exit() funciones en sus redirecciones, así como cuándo utilizar ob_flush() vs ob_start(), y un cierto potencial errores que las otras respuestas han omitido en este punto.

+1

Actualizado con contexto. –

0
firstly create index.php page and just copy paste below code :- 

<form name="frmUser" class="well login-form" id="form" method="post" action="login_check.php" onSubmit="return FormValidation()"> 
    <legend> 
     <icon class="icon-circles"></icon>Restricted Area<icon class="icon-circles-reverse"></icon> 
    </legend> 
    <div class="control-group"> 
     <label class="control-label" for="inputPassword">Username</label> 
     <div class="controls"> 
      <div class="input-prepend"> 
       <span class="add-on"><icon class="icon-user icon-cream"></icon> </span> 
       <input class="input" type="text" name="username" id="username" placeholder="Username" /> 
      </div> 
     </div> 
    </div> 
    <div class="control-group"> 
     <label class="control-label" for="inputPassword">Password</label> 
     <div class="controls"> 
      <div class="input-prepend"> 
       <span class="add-on"><icon class="icon-password icon-cream"></icon> 
       </span> <input class="input" type="password" name="password" id="password" value="" placeholder="Password" /> 
      </div> 
     </div> 
    </div> 
    <div class="control-group signin"> 
     <div class="controls "> 
      <input type="submit" class="btn btn-block" value="Submit" /> 
      <div class="clearfix"> 
       <span class="icon-forgot"></span><a href="#">forgot password</a> 
      </div> 
     </div> 
    </div> 
</form> 



/*------------------after that ----------------------*/ 

create a login_check.php and just copy paste this below code :- 

<?php 
session_start(); 
include('conn.php'); 

<?php 
/* Redirect browser */ 
header("location:index.php"); 

/* Make sure that code below does not get executed when we redirect. */ 
exit; 
?> 


<?php 

if(count($_POST)>0) 
{ 

    $result = mysql_query("SELECT * FROM admin WHERE username='".$_POST["username"]."' and password = '".$_POST["password"]."'"); 
    $row = mysql_fetch_array($result); 

if(is_array($row)) 
{ 
    $_SESSION["user_id"] = $row[user_id]; 
    $_SESSION["username"] = $row[username]; 

    $session_register["user_id"] = $row[user_id]; 
    $session_register["username"] = $row[username]; 
} 
else 
{ 
    $_SESSION['msg']="Invalid Username or Password"; 
    header("location:index.php"); 
} 
} 

if(isset($_SESSION["user_id"])) 
{ 
    header("Location:dashboard.php"); 
} 

?> 




/*-----------------------after that ----------------------*/ 


create a dashboard.php and copy paste this code in starting of dashboard.php 



<?php 
session_start(); 
include('conn.php'); 
include('check_session.php'); 
?> 




/*-----------------------after that-----------------*/ 



create a check_session.php which check your session and copy paste this code :- 


<?php 
    if($_SESSION["user_name"]) 
    { 
?> 
    Welcome <?php echo $_SESSION["user_name"]; ?>. Click here to <a href="logout.php" tite="Logout">Logout.</a> 
<?php 
    } 
    else 
    { 
    header("location:index.php"); 
    } 
?> 





if you have any query so let me know on my mail id [email protected] 
7

Puede redirigir condicionalmente a alguna página dentro de un archivo PHP ....

if { 
//You need to redirect 
header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */ 
exit(); 
} 
else{ 
// do some 
} 
1

header no funcionará para todos

uso por debajo de código simple

<?php 
     echo "<script> location.href='new_url'; </script>"; 
     exit; 
?> 
0

---------- 
 

 

 
<?php 
 
echo '<div style="text-align:center;padding-top:200px;">Go New Page</div>'; 
 
\t \t $gourl='http://stackoverflow.com'; 
 
\t \t echo '<META HTTP-EQUIV="Refresh" Content="2; URL='.$gourl.'">';  
 
\t \t exit; 
 

 
?> 
 

 

 
----------

Cuestiones relacionadas