Как перенаправить на другую страницу с помощью PHP
Я создаю сайт, который включает страницу входа. Мне нужно перенаправить пользователя на страницу своего профиля после успешного входа в систему, но я не знаю, как это сделать в PHP (это мой первый сайт).
Я искал в Интернете и мне сказали, что функция header() должна делать трюк, но она будет работать, только если я не вывел никакой информации перед ее использованием.
Это проблема. Я выпустил кучу информации (включая HTML для создания самой страницы входа в систему).
Итак, как мне перенаправить пользователя с одной страницы на другую?
Какие у меня есть варианты? Также, какова наилучшая практика в этих случаях?
EDIT: Здесь моя вся страница 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;
}
}
?>
Ответы
Ответ 1
Это проблема. Я выпустил кучу информации (включая HTML для создания самой страницы входа в систему). Итак, как мне перенаправить пользователя с одной страницы на другую?
Это означает, что ваш дизайн приложения довольно сломан. Вы не должны выполнять вывод, пока работает ваша бизнес-логика. Используйте механизм шаблонов (например, Smarty) или ускорите его с помощью буферизации вывода).
Другая опция (не очень хорошая!) будет выводить JavaScript для перенаправления:
<script type="text/javascript">location.href = 'newurl';</script>
Ответ 2
Вы можете использовать функцию, похожую на:
function redirect($url) {
ob_start();
header('Location: '.$url);
ob_end_flush();
die();
}
Следует отметить, что вы всегда должны использовать либо ob_flush()
, либо ob_start()
в начале ваших функций header('location: ...');
, и вы всегда должны следовать им с помощью функции die()
или exit()
, чтобы предотвратить дальнейшее выполнение кода.
Здесь приведено более подробное руководство, чем любые другие ответы: http://www.exchangecore.com/blog/how-redirect-using-php/
В этом руководстве приводятся причины использования функций die()
/exit()
в ваших перенаправлениях, а также когда использовать ob_flush()
vs ob_start()
и некоторые потенциальные ошибки, оставленные другими ответами в этой точке.
Ответ 3
Вы можете условно перенаправить на некоторую страницу в php файл....
if (/*Condition to redirect*/){
//You need to redirect
header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();
}
else{
// do some
}
Ответ 4
header
не будет работать для всех
Используйте ниже простой код
<?php
echo "<script> location.href='new_url'; </script>";
exit;
?>
Ответ 5
Предполагая, что вы используете файлы cookie для входа в систему, просто вызовите его после вашего вызова setcookie
- в конце концов, вы должны вызывать его перед любым выходом.
В любом случае, вы можете проверить наличие имени кнопки отправки формы в начале script, выполнить свою логику и затем вывести материал:
if(isset($_POST['mySubmit'])) {
// the form was submitted
// ...
// perform your logic
// redirect if login was successful
header('Location: /somewhere');
}
// output your stuff here
Ответ 6
Вы можете использовать ob_start();
, прежде чем отправлять какой-либо вывод. Это скажет PHP, чтобы сохранить все выходные данные в буфере до окончания выполнения script, поэтому вы все равно можете изменить заголовок.
Обычно я не использую буферизацию вывода, для простых проектов я сохраняю всю логику в первой части моего script, затем выводя все HTML
.
Ответ 7
Самый простой способ заключается в том, что ваш script проверяет данные входа в форму, расположенные сверху, script перед любым выходом.
Если логин действителен, вы будете перенаправлять с помощью функции "header".
Даже если вы используете "ob_start()", иногда бывает, что вы пропускаете одно пробельное пространство, которое приводит к выходу. Но вы увидите инструкцию в своих журналах ошибок.
<?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();
?>
Ответ 8
Несмотря на то, что он не защищен, (без обид или чего-либо еще), просто вставьте функцию заголовка после установки переменной сеанса
while($row = mysql_fetch_assoc($result))
{
$_SESSION["user"] = $username;
}
header('Location: /profile.php');
Ответ 9
Действие клика BUTTON
if(isset($_POST['save_btn']))
{
//write some of your code here, if necessary
echo'<script> window.location="B.php"; </script> ';
}
Ответ 10
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]
Ответ 11
----------
<?php
echo '<div style="text-align:center;padding-top:200px;">Go New Page</div>';
$gourl='http://stackoverflow.com';
echo '<META HTTP-EQUIV="Refresh" Content="2; URL='.$gourl.'">';
exit;
?>
----------