Загрузка одного php-файла из другого. Нужен пример авторизации.

sfes

Новичок
Загрузка одного php-файла из другого. Нужен пример авторизации.

У меня никак не получается сделать такую простую штуку:
1) пользователь открывает страницу для ввода инеми и пароля: login.php;
2) если он ошибся, то страница остается та же, просто появляется сообщение об ошибке;
3) если ввел правильно, то загружается страница приветствия ok.php.

У меня как раз не получается загрузить эту самую ok.php из login.php.
Я пытаюсь это сделать с помощью строки:
PHP:
 header("Location: ok.php");
Пишет "headers already sent by...".
Это естественно, т.к. по мотивам FAQ http://phpfaq.ru/headers понятно, что ошибка будет возникать, если раньше вызова header был вывод в браузер.

Но мне нужно загрузить ok.php именно в этот момент - после удачной проверки.

Вопрос: как это сделать?
 

rotoZOOM

ACM maniac
то есть удачная проверка у тебя подразумевает какой-то вывод в браузер ?
 

Mozart

Новичок
Не выводи ничего в браузер. Делай проверку до вывода формы и всего остального.
 

impossible

Новичок
по твоей ссылке все написанно:

Многочисленные вопросы на форуме заставляют меня сделать здесь важное замечание:
Эта ошибка появляется не от того, что у вас в скрипте "что то написано выше". А от того, что РНР выводит что-то в браузер. Это не обязательно код. Это может быть сообщение об ошибке. может быть пробел или хтмл тег. Да-да. Для самых талантливых: речь идет о любом символе, отправленном в браузер, а не только о тех, которые браузер отображает неискушенному пользователю. У HTML страниц есть исходный текст. И именно он является результатом работы PHP скрипта, а не красивые буковки с картиночками, как думает очень большое количество людей.
 

sfes

Новичок
черт, да нет, не нужно никакого вывода, просто отобразить ДРУГУЮ станицу.
Я уже не знаю какими словами задать этот простой вопрос.
Лучше выложу код обоих файлов.
Еще раз коротко: есть 2 страницы, первая страница выполняет проверку и если проверка неудалась, то выдает сообщение на ЭТОЙ ЖЕ странице, а если удалась, то загружает ВТОРУЮ страницу (и передает ей параметр - имя пользователя -это я пока выбросил, просто сначала нодо разобраться с загрузкой).

Если ничего непонятно из вопроса, может просто покажите АВТОРИЗАЦИЮ пользователей на вашем сайте, и я сам попытаюсь понять, что я делаю не так.

Код login.php:
PHP:
<?php 
  header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
  header('Cache-Control: no-store, no-cache, must-revalidate'); 
  header('Cache-Control: post-check=0, pre-check=0', FALSE); 
  header('Pragma: no-cache'); 
?> 
<HTML>
<HEAD>
<TITLE>Test Autorization
</TITLE>
</HEAD>
<BODY background="">
<h1>Введи свое имя и пароль!</h1>
<hr>
<blink>Подсказка : name = 1, pass = 1</blink><br>
<?php
		// получаем данные пользователя из массива $_POST и отбрасываем некорректные символы
	$name    = isset($_POST['name'])    ? htmlspecialchars(stripslashes($_POST['name'])) : '';
	$pass 	 = isset($_POST['pass']) 	? htmlspecialchars(stripslashes($_POST['pass'])) : '';
	
	if(isset($_POST['name'],$_POST['pass'])) 
	{
		$error = 0;
		if ($name == '' || $pass == '')
		{
			$error = 1;
		}
		if(!$error) 
		{
			$auth = 0;
			
			//echo 'name='.$name.', pass='.$pass;
			if ($name == '1' && $pass == '1') $auth = 1;
			if ($auth == 1)
			{
				header("Location: ok.php");
				//echo '<hr>Вы вошли.<hr>';
			}
			else
			{
				echo '<hr>Попробуйте снова.<hr>';
			}
		}
	}
?>
<form method="POST" action="">

<table border=0>
  <tr>
		<td width=120> Ваше имя:</td> <td> <input type="text" name="name"> </td>
  </tr>
  <tr> </tr>
  <tr>
		<td width=120> Пароль: </td> <td> <input type="password" name="pass"> </td>
		<td> <input type="submit" name="okbutton" value="  OK  "> </td>
  </tr> 
  <tr> </tr>
  <tr>  
		<td width=120> </td> 
	<!--<td> <A HREF="newuser.php"> Регистрация!</A>-->
  </tr>
  <tr> </tr>
</table>
</form>
</BODY>
</HTML>
Код ok.php:
PHP:
<HTML>
	<HEAD>
		<TITLE>Test Autorization</TITLE>
	</HEAD>
	<BODY background="">
		<br><br><br>
		<h2>Добро пожаловать!</h2>
		<table border=0>
		<tr>
			<td width=100></td>
		<td>			
		</table>
	</BODY>
</HTML>
 

tashkentchi

Новичок
sfes login.php:
PHP:
<?
/* Функция, к-рая проверяет логин и пароль и возвращает 0 в случае если авторизация успешна, 1 если логин и пароль неправильны, 2 если авторизации еще не было */
function inspection() {
....
}
$flag = inspection();
if ( ! $flag ) {
   header("Location: ok.php");
   return;
}
...
if ( $flag==1 ) print "Error!";
...
?>
 

tashkentchi

Новичок
Здесь не нужно. А функцию написал, чтобы человеку понятно было: откуда, что берется.
 

sfes

Новичок
Всем спасибо - получилось!
Второй свой пост я писал долго, потому и пропустил замечания Mozart и impossible. За что извиняюсь.
Спасибо tashkentchi за функцию, но у меня уже есть такая :), просто я опустил ее, чтобы упростить код.

Единственно, хотел еще уточнить: а какие еще есть способы вызова одной страницы из другой, кроме header и тэга action у form?
 

tashkentchi

Новичок
Еще можешь воспользоваться require или include, если 1) uri не важен и 2) в ok.php нет header-ов и т.п.

-~{}~ 30.05.05 14:48:

Вопрос: если я прямой ссылкой, минуя форму для регистрации, вызову ok.php, он мне тоже "Добро пожаловать!" скажет? Может стоит подумать над безопасностью?
 

arguk

Новичок
<?php

header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
?>

-~{}~ 30.05.05 12:49:

Вместо этого поставь
ob_start();
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
и все у тебя заработает

-~{}~ 30.05.05 12:50:

хех а про безопасность он не спрашивал:)

-~{}~ 30.05.05 12:56:

Ого я и вправду не в тему извините не вномательно смотрел шел)
 

Фанат

oncle terrible
Команда форума
arguk, ты не в тему.

sfes include и require служат для включения пхп-кода, но в твоём случае они неприменимы.
поскольку после обработки формы методом POST в любом случае всегда надо делать редирект.
 

sfes

Новичок
Фанат Понял.

tashkentchi Безопасность я думаю обеспечить использованием сессий - передавать $_SESSION['auth'] = 1.
 

Фанат

oncle terrible
Команда форума
а не слишком ли сложная у тебя проверка пароля?

-~{}~ 30.05.05 13:35:

почему не написать просто
PHP:
if(isset($_POST['name']) {
  $location=$_SERVER['PHP_SELF'].'?oops';
  if ($name == '1' && $pass == '1') {
    $location='ok.php';
    session_start();
    $_SESSION['auth'] = 1;
}
header("Location: ".$location); 
exit;
 

Torio

Guest
sfes
Попробуй, если тебе не надо выводить, что ввели неправильный пароль или не заполнили поле логин, или не заполнили поле пароль, или не заполнили обо поля, или при отсутствии такого логина предлагать его зарегистрировать, то вариант предложенный фанатом оптимальный, по поводу запрета доступа при помощи сессий - я тож так делаю.
Если хочешь полноценную авторизацию со всеми вытекающими, то код Фаната придется немного доработать, ну ты наверное это и сам сможешь ;)

-~{}~ 30.05.05 18:03:

А так (я на авторизацию день потратил) могу если что подсказать. Пиши мыло, в топике долго.
 

Фанат

oncle terrible
Команда форума
я на авторизацию день потратил
Боже мой! ЦЕЛЫЙ ДЕНЬ! Да ты теперь просто профессор в области авторизации.
Я думаю, не стоит в мыло. Советы такого крупного специалиста будет интересно выслушать всем.
 

Torio

Guest
Фанат
Вот ты на меня обозлился!
А как же обед и проч. проч. я в отличие от некоторых не только за компом сижу! Для полноценной авторизации надо бы еще Mecrek со всеми вытекающими. Хочешь, код скину (только не в топик). Если не понравится - ответишь почему. Твой вариант хороший, просто слишко простой (иногда это и нужно).
И не кипятись никогда по пустякам! ;)
 
Сверху