2014-03-03 2 views
0

Привет, У меня возникли проблемы с некоторыми из моего кода. Даже мой учитель не может мне помочь, и я не знаю, куда еще идти. Когда мой цикл foreach активирован, а пароль и имя пользователя совпадают с строками жесткого кода, он по-прежнему перенаправляется на loginerror.php. Когда я удаляю заголовок («Location: loginerror.php»), он работает нормально. Почему последняя строка моего кода все еще активирована, когда она должна загружать новую страницу?Php не отправляется с заголовками

<?php session_start(); ?> 
<html> 
<header></header> 
<body> 
<form action="login.php" Method="post"> 
Username: <input type="text" name="Username"> </br></br> 
Password: <input type="password" name="Password"> </br></br> 
<input type="submit" value="Login"></br></br> 
</form> 
<?php 


$username=$_POST["Username"]; 
$password=$_POST["Password"]; 
if($username == NULL){print("Enter a Username please");} 
else { 


    $users= array 
    (
"Bourne"=>"postcode", 
    "Unidan"=>"pincode", 
    "yoda"=>"sith" 
    ); 

    foreach($users as $user=>$password_value) 
    { 
    if(($user==$username)&&($password_value==$password)) 
    { 
    $_SESSION['login?']=1; 
    header("Location: calculation.php"); 
    }} 
    $_SESSION['login?']=0; 
    header("Location: loginerror.php"); 
    } 

    ?> 
    </body> 
    </html> 
+4

'' Даже моя учительница не может мне помочь ». - Я очень рекомендую найти лучшего учителя. – David

+1

Ваш учитель не знает ... ваши вызовы header() НЕ будут работать, потому что вы выведете полный html-документ до того, как код header() будет достигнут. –

+0

Те, которые не могут, учат. –

ответ

0

Per на PHP Docs:

Помните, что заголовок() должен быть вызван до любого фактического выпуска продукции отправляется либо обычными тегами HTML, либо пустыми строками в файле, либо с PHP. Это очень распространенная ошибка для чтения кода с включением или требованием, функциями или другой функцией доступа к файлам, а также пробелов или пустых строк, которые выводятся до заголовка ().

Ссылка: Header Documentation

Переместите PHP код в начало файла и он должен решить проблему:

<?php 
    session_start(); 

    $username=$_POST["Username"]; 
    $password=$_POST["Password"]; 
    if ($username == NULL) { 
     print("Enter a Username please"); 
    } else { 
     $users= array("Bourne"=>"postcode", "Unidan"=>"pincode", "yoda"=>"sith"); 

     foreach($users as $user=>$password_value) { 
      if(($user==$username)&&($password_value==$password)) { 
       $_SESSION['login?']=1; 
       header("Location: calculation.php"); 
       // Add this to terminate the script immediately and redirect. 
       exit(); 
      } 
     } 
     $_SESSION['login?']=0; 
     header("Location: loginerror.php"); 
     // Add this to terminate the script immediately and redirect. 
     exit(); 
    } 
?> 
<html> 
<header></header> 
<body> 
    <form action="login.php" Method="post"> 
     Username: <input type="text" name="Username"> </br></br> 
     Password: <input type="password" name="Password"> </br></br> 
     <input type="submit" value="Login"></br></br> 
    </form> 
</body> 
</html> 

Заголовок должен быть послан перед любым выходом, включая Выход HTML.

+0

благодаря всем, что он работает :) – user3376192

0

exit никакой другой код не выполняется после редиректа:

header("Location: calculation.php"); 
exit; 
+0

Вы не можете отправить заголовки после того, как вы уже начали отправлять дополнительный вывод ... – War10ck

+0

Действительно? Вот почему он перенаправляется на 'loginerror.php'? Не сказал, что это отличный код, я отвечал, почему он продолжает перенаправлять на 'loginerror.php'. Скорее всего, буферизация вывода включена в 'php.ini'. – AbraCadaver

+0

Просто добавление 'exit;' решит проблему. 'Headers()' должен выводиться первым ... – War10ck

0

Изменение структуры кода на что-то подобное может помочь вам.

Примечание: это не коррекция кода.

<?php 
session_start(); 

$username=$_POST["Username"]; 
$password=$_POST["Password"]; 
if($username == NULL){ 
    print("Enter a Username please"); 
} 
else { 
     $users= array 
     (
     "Bourne"=>"postcode", 
     "Unidan"=>"pincode", 
     "yoda"=>"sith" 
     ); 

     foreach($users as $user=>$password_value) 
     { 
      if(($user==$username)&&($password_value==$password)) 
      { 
       $_SESSION['login?']=1; 
       header("Location: calculation.php"); 
       exit; 
      } 
     } 
     $_SESSION['login?']=0; 
     header("Location: loginerror.php"); 
     exit; 
} 
?> 
<html> 
<header></header> 
<body> 
<form action="login.php" Method="post"> 
Username: <input type="text" name="Username"> </br></br> 
Password: <input type="password" name="Password"> </br></br> 
<input type="submit" value="Login"></br></br> 
</form> 
</body> 
</html> 
0

Как уже упоминалось ранее. Вы уже выходите перед отправкой заголовков. Вам нужно обернуть это условным или иметь второй скрипт, проверяющий пароль.

Вы можете обернуть код в if/else $ _POST, а также выполнить операцию break в foreach после выполнения условия.

Смежные вопросы