Я пытаюсь изменить страницу, когда пользователь нажимает кнопку входа в систему. Когда в настоящее время нажата кнопка входа в систему, страница только что обновилась, пользователь не перенаправляется на новую страницу. Я создал сеанс перед любым кодом для страницы. Мне интересно, связано ли это с расположением моей команды заголовка.
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Login</title>
</head>
<body>
<form action="" method="post">
<br>Name: <input type="text" name="NameTextBox"><br>
<br>What grade are you currently in?: <input type="number" name="GradeTextBox"><br>
<br><button name="Login" type="submit">Login</button></br>
</form>
<?php
if (isset($_POST["Login"])) {
$_SESSION["start"] = $_SERVER['REQUEST_TIME'];
//echo "This session is beginning at ".$_SESSION["start"]."<br /><br />";
}
if(isset($_POST["Login"])){
if($NameTextBox = "Phydeaux"){
//echo"Good Name!";
PassLogin();
}
elseif($NameTextBox = "Rover"){
//echo"Good Name!";
PassLogin();
}
elseif($NameTextBox = "Spot"){
//echo"Good Name!";
PassLogin();
}
else{
echo"You cannot login!";
}
}
function PassLogin()
{
//print '<script type="text/javascript">';
//print 'alert("Running PassLogin Function")';
//print '</script>';
$_SESSION["ReadingGrade"] = "Fail";
$_SESSION["WritingGrade"] = "Fail";
$_SESSION["MathGrade"] = "Fail";
$_SESSION["Grade"] = $GradeTextBox;
$_SESSION["Name"] = $NameTextBox;
Header('Location: Reading.php');
}
if (isset($_POST["Login"])){
//echo "Login has been pressed";
}
?>
</body>
</html>
С этим кодом существует несколько синтаксовых и технических проблем. В дополнение к тому, что сказал AlexP, вы должны заметить, что вы не можете отправлять заголовки, когда вы уже отправили некоторый вывод. Заголовки должны быть отправлены до выхода, по той же причине, что и в начале session_start()
.
При этом вы также должны сделать скрипт входа в систему перед частью HTML, где находится session_start()
, поэтому ваш заголовок перенаправления в Reading.php
может работать. Или вы можете решить, что, поместив ob_start()
в начало страницы, он будет буферизовать вывод, чтобы он не отправлялся до завершения скрипта, таким образом вы можете вызвать header()
где хотите.
И говоря о заголовке, функция header()
, а не Header()
. В PHP нет встроенной функции с именем Header()
. Названия функций чувствительны к регистру.
Кроме того, вы не должны использовать action=""
в своей <form>
. Просто подавите этот атрибут, чтобы он опубликовал его на одной странице, это заставит ваш код работать независимо от имени вашего php файла. Если вы используете action=""
он будет отправлять сообщение index.php
вместо login.php
.
Я также заметил, что вы используете Reading.php
(с заглавной буквы) и login.php
. Я предлагаю вам нормализовать все имена файлов в нижнем регистре, потому что, если нет, у вас могут возникнуть проблемы при переносе этого кода на другие системы. Для Windows чтение, чтение, чтение и повторное включение - одно и то же, к Linux это не так.
Вы не можете изменить информацию заголовка, уже выведя свой HTML. Переместите HTML под заголовком заголовка PHP.
В документации говорится:
header() должен быть вызван до отправки любого фактического вывода либо с помощью обычных тегов HTML, пустых строк в файле, либо из PHP
Кроме того, вы назначаете строковое значение, когда используете $NameTextBox = "Phydeaux"
, а не условно проверяете его.
Вместо этого вы должны использовать ==
double equals
if(isset($_POST["Login"])){
$NameTextBox = $_POST['NameTextBox']; // $NameTextBox is now the posted value
if($NameTextBox == "Phydeaux"){ // double equals checks the value of the variable
<form action="" method="post">
Куда пойдет ваше сообщение?
Я предлагаю вам следующее:
1- Напишите свои PHP-коды на другой странице и назвали "login.php"
2- Напишите действие формы: <form action="login.php" method="post">