PHP и с чем его едят....

[fly]

Sweet orange
Пух, теория это хорошо, а визуальный пример еще лучше.
PainKiller, спасибо за код, сейчас проверю:)
 

[fly]

Sweet orange
Знатоки, почему скрипт работает только при закоментированном else?
PHP:
<?php // ФОРМА АВТОРИЗАЦИИ
$name = trim($_POST['email']);
$password = trim($_POST['password']);
if (isset($name) AND isset($password)) {
$data=file("data/users.dat");
for ($i=0; $i<count($data); $i++) {
$dat=explode("|", $data[$i]);
if ($name==trim($dat[0]) && md5($password)==trim($dat[1])) {
echo "<h2>Добрый день <b>$dat[3]</b><br />ВЫ АВТОРИЗОВАНЫ</h2>"; 
echo "</td>"; 
include ("bottom.html"); exit; }
// else { echo "<h2>Вход невозможен. Проверьте верно ли введены данные.</h2>"; 
// echo "</td>"; 
// include ("bottom.html"); exit; }
}
}
?>
Когда раскоментирую, то всегда пишет Вход невозможен. Проверьте верно ли введены данные., и не пропускает авторизацию. Кто-нибудь может объяснить?
 
Останнє редагування модератором:

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
Б-гомерзкий язык =)
 

bllem

New Member
Знатоки, почему скрипт работает только при закоментированном else?


Когда раскоментирую, то всегда пишет Вход невозможен. Проверьте верно ли введены данные., и не пропускает авторизацию. Кто-нибудь может объяснить?
эм. А exit в цикле, это нормально?
 

Тагрим

Поняшка
Знатоки, почему скрипт работает только при закоментированном else?
PHP:
<?php // ФОРМА АВТОРИЗАЦИИ
$name = trim($_POST['email']);
$password = trim($_POST['password']);
if (isset($name) AND isset($password)) {
$data=file("data/users.dat");
for ($i=0; $i<count($data); $i++) {
$dat=explode("|", $data[$i]);
if ($name==trim($dat[0]) && md5($password)==trim($dat[1])) {
echo "<h2>Добрый день <b>$dat[3]</b><br />ВЫ АВТОРИЗОВАНЫ</h2>"; 
echo "</td>"; 
include ("bottom.html"); exit; }
// else { echo "<h2>Вход невозможен. Проверьте верно ли введены данные.</h2>"; 
// echo "</td>"; 
// include ("bottom.html"); exit; }
}
}
?>
Когда раскоментирую, то всегда пишет Вход невозможен. Проверьте верно ли введены данные., и не пропускает авторизацию. Кто-нибудь может объяснить?
бллем несомненно праф.

трай зис:

PHP:
<?php
$name   = trim($_POST['email']);
$password = trim($_POST['password']);

if (isset($name) && isset($password)) {
	$data = file("data/users.dat");
	for ($i = 0; $i < count($data); $i++) {
		$dat = explode("|", $data[$i]);
		
		if ($name == trim($dat[0]) && md5($password) == trim($dat[1])) {
			echo "<h2>Добрый день <b>$dat[3]</b><br />ВЫ АВТОРИЗОВАНЫ</h2>"; 
			exit;
		} else {
			echo "<h2>Вход невозможен. Проверьте верно ли введены данные.</h2>"; 
		}
	}
	echo "</td>"; 
	include ("bottom.html");
}
 

[fly]

Sweet orange
ну как бы тоже не то, что нужно. При успешной авторизации, пишет следующее:

Вход невозможен. Проверьте верно ли введены данные.
Вход невозможен. Проверьте верно ли введены данные.
Добрый день stas
ВЫ АВТОРИЗОВАНЫ

А при не успешной:

Вход невозможен. Проверьте верно ли введены данные.
Вход невозможен. Проверьте верно ли введены данные.
Вход невозможен. Проверьте верно ли введены данные..

Пишет три подряд, потому что в базе есть три пользователя. Когда их там 4е, то и строк выводит тоже 4е!
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
Сделай через мускуль и не парься)
 

dreamer

Member
PHP:
<?php
$name     = trim($_POST['email']);
$password = trim($_POST['password']);

if (isset($name) && isset($password)) {
	$data = file("data/users.dat");
	$logged_in_as = null;
	
	for ($i = 0; $i < count($data); $i++) {
		list($username, $userpass) = explode("|", $data[$i]);
		
		if ($name == trim($username) 
		    && md5($password) == trim($userpass)) {
			
			$logged_in_as = $name;
			break;
		} 
	}
	if ($logged_in_as) 
	    echo "<h2>Добрый день <b>$dat[3]</b><br />ВЫ АВТОРИЗОВАНЫ</h2>"; 
    else
        echo "<h2>Вход невозможен. Проверьте верно ли введены данные.</h2>";
}
 

[fly]

Sweet orange
PainKiller, да я и не программист, чтобы оперировать сразу несколькими способами. Хотел понять почему этот скрипт не правильно работает.
dreamer, спасибо, вроде все работает. А можешь кратко прокомментировать изменения, чтобы внести для меня ясность:)
И еще, как теперь вывести имя пользователя в приветствие?
 
Останнє редагування:

Пух

كنت بلهاء
Модератор
Вот код Тагрима.
PHP:
<?php 
$name   = trim($_POST['email']); 
$password = trim($_POST['password']); 

if (isset($name) && isset($password)) { 
    $data = file("data/users.dat"); 
    for ($i = 0; $i < count($data); $i++) { 
        $dat = explode("|", $data[$i]); 
         
        if ($name == trim($dat[0]) && md5($password) == trim($dat[1])) { 
            echo "<h2>Добрый день <b>$dat[3]</b><br />ВЫ АВТОРИЗОВАНЫ</h2>";  
            exit; 
        } else { 
            echo "<h2>Вход невозможен. Проверьте верно ли введены данные.</h2>";  
        } 
    } 
    echo "</td>";  
    include ("bottom.html"); 
}
Тут считывается строка с файла. Если логин и пароль совпали с теми, что ввел пользователь - пишет "Добрый день" и выходит с цикла. Если нет - пишет "Вход не возможен" и переходит на следующую строку.
То есть, будет писать "вход не возможен" пока не найдет нужную строчку в файле (или вообще до конца файла, если такой комбинации логина / пароля не существует).
Проблема в том, что для каждого найденного пользователя в базе будет писать либо "добрый день" либо "вход не возможен", а этого делать не нужно.

А делать нужно было по-другому. Описать переменную (флаг) и задать ему стартовое значение (у dreamer флаг - переменная $logged_in_as, начальное значение - null) . Искать в файле совпадение логина и пароля с теми, которые ввел пользователь. Если совпадение найдено, то назначить флагу нужно присвоить какое-то значение (dreamer присваивает $logged_in_as = $name) и выйти с цикла (т.к. дальше искать нету смысла, все уже найдено), если не найдено - считать другую строчку.
После цикла проверить флаг. if ($logged_in_as) перейдет на ветку ИСТИНА тогда, когда в переменной $logged_in_as будет не null (то есть в цикле было произведено присваивание), иначе - переход на ветку ЛОЖЬ.
Как-то так.
 
Останнє редагування:
Зверху