Пишу логинку: PHP: <?php $f = file("base.php"); print $f[0] . "and " . $f[1]; foreach($f as $d) { $d = trim($d); list($user, $pass) = split(":", $d); } if(isset($login) && isset($password)) { if($login == $user && $password == $pass) { print "Вошли"; } else { print "Неправильный логин или пароль"; } } else { print <<<HERE <form method = "post"> Логин: <input type = "text" name = "login"><br /> Пароль: <input type = "text" name = "password"><br /> <input type = "submit" value = "Вход"> </form> HERE; } ?> base.php: Code: user:coolpass luzer:badpass Почему логинится только по последней строчке? п.с. спс))
$user, $pass перезаписываються при каждом split(). нужно сделать примерно так: PHP: foreach($f as $d) { $d = trim($d); list($user, $pass) = split(":", $d); if($login == $user && $password == $pass) { print "Вошли"; exit; } else { print "Неправильный логин или пароль"; exit; } } хотя это тоже не самый оптимальный вариант.
делай: Code: user:coolpass: luzer:badpass: и все будет окей) у меня такая же проблемма била) просто ти не учитаваеш символа переноса.. user:coolpass<перенос> и тебе дает пароль: coolpass<перенос> вот и несходитса)
mr.The, при первом же неправильном логине и пассе твой скрипт выйдет просто из выполнения, не проверив все. eLWAux, ты сам пробовал так?) В исходном коде вообще-то trim используется, чтобы переносы убрать, и проблема не в этом. PHP: <?php $login=isset($_POST['login']) && !is_array($_POST['login']) ? $_POST['login'] : ''; $pass=isset($_POST['pass']) && !is_array($_POST['pass']) ? $_POST['pass'] : ''; if(strlen($login)>0 && strlen($password)>0) { $f = array_map('rtrim',file("base.php")); foreach($f as $d) { $tmp=explode(':', $d); if($login === $tmp[0] && $password === $tmp[1]) die("Вошли"); } die('Неправильный логин или пароль.'); } print <<<HERE <form method = "post"> Логин: <input type = "text" name = "login"><br /> Пароль: <input type = "text" name = "password"><br /> <input type = "submit" value = "Вход"> </form> HERE; ?>
ээ... фак. как-то я этот момент пропустил. там можно флаг устанавливать при логине. и потом, после цикла проверять..
тот же код =) PHP: <?php $f = array_map('trim',file("base.php")); if(in_array($f,"{$login}:{$password}")) die("Вошли"); else die('Неправильный логин или пароль.'); ?>
PHP: <? $login='admin'; $pass='adminpass'; $f=file('base.php'); for ($i=0; $i<count($f); $i++) { $a=explode(':',$f[$i]); if ($a[1]==$login && $a[2]==$pass) { die('yeee'); } else { die('fak('); } base.php: Code: :test:pass: :admin:adminpass: :xaxa:xaxaxaax: :eLWAux:admin: пробуй..
Ну вот я сделал такую байду: PHP: <?php $f = file('base.php'); if(isset($login) && isset($password)) { foreach($f as $d) { $d = trim($d); list($user, $pass) = split(":", $d); if($login == $user && $password == $pass) { die('Вошли'); } } print "Неправильный логин или пароль"; } else { print <<<HERE <form method = "post"> Логин: <input type = "text" name = "login"><br /> Пароль: <input type = "text" name = "password"><br /> <input type = "submit" value = "Вход"> </form> HERE; } print "ы"; ?> Но блин, если использовать die(), то мы завершаем скрипт и остальная часть страницы не выполняется (сдесь это "ы" ), без завршения как-нибудь можно обойтись?
вот кто нить напрямую обратиться к base.php и вся ваша хэк логинка летит мимо Делай тогда с .htaccess'ом, а то бред)
Я вот вроде добился своего, код немного смешной, но рабочий PHP: <?php $f = file("base.php"); if(isset($login) && isset($password)) { foreach($f as $d) { $d = trim($d); list($user, $pass) = split(":", $d); if($login == $user && $password == $pass) { print "Вошли"; $good = 1; } else { $bad = 1; } } if ($good == 1 && $bad == 1) { } else { print "Облом"; } } else { print <<<HERE <form method = "post"> Логин: <input type = "text" name = "login"><br /> Пароль: <input type = "text" name = "password"><br /> <input type = "submit" value = "Вход"> </form> HERE; } ?>
а это регистрация, если кому понадобится... PHP: <?php if (isset($login) && isset($password)) { $fp = fopen('base.php', 'a'); fputs($fp, "\r\n" . $login . ':' . $password); fclose($fp); print $login . ", спасибо за регистрацию"; } else { print <<<HERE <form method = "post"> Логин: <input type = "text" name = "login"><br /> Пароль: <input type = "text" name = "password"><br /> <input type = "submit" value = "Регистрация"> </form> HERE; } ?>
Ru}{eeZ меня видимо одного смущает, что с такой регой и страницей логина может быть неограниченное количество строк, с одинаковым логином, но разными паролями, а значит никто из таких пользователей залогиниться не сможет. Включенный Register_globals - зло. Твой скрипт будет рад обрабатывать 10к строк, если к нему будут обращаться каждую секунду. Если же хочется мучаться с файлами, то: PHP: <? if (isset($_POST['login']) && isset($_POST['password'])) { $f=file('base.php'); if (in_array($_POST['login'].':'.$_POST['password']."\r\n",$f)) {print "Вошли";} else {print "Облом";} } else { ?> <form method = "post"> Логин: <input type = "text" name = "login"><br /> Пароль: <input type = "text" name = "password"><br /> <input type = "submit" value = "Вход"> </form> <? } ?>
Да ладно, я всё это мутил ради самообразования( ), cms я пока писать не собираюсь) Но всеравно спасибо)
советую в цикл foreach добавить break; Code: if($login == $user && $password == $pass) { print "Вошли"; $good = 1; break; } и ещё: переменные $good и $bad лучше объявить: Code: $f = file("base.php"); $good = 0; $bad = 0; и ещё, вот этот код: Code: if ($good == 1 && $bad == 1) { } else { print "Облом"; } в случае, если логин и пароль совпадут с первой строкой в файле и записей в нём будет одна, тогда условие не выполнится! (хотя данные корректны) В любом случае, наличие переменной $bad в коде не оправдано! Лучше убери. И следует контролировать длину проверяемых данных (функция substr) Code: $f = file("base.php"); $good = 0; if(isset($_POST['login']) && isset($_POST['password'])) { $p_pass = substr($_POST['password'], 0, 10); $p_login = substr($_POST['login'], 0, 10); foreach($f as $d) { $d = trim($d); list($user, $pass) = split(":", $d); if($p_login == $user && $p_pass == $pass) { $good = 1; break; } } if ($good == 1) { print "Вошли"; } else { print "Облом"; } } else { print <<<HERE ...... и ещё в файле base.php аккаунты лучше хранить массивом, а не в текстовом виде, тогда автоматом увеличивается скорость работы скрипта и пропадает угроза безопасеости. при поиске не нужно будет перебирать все элементы и использовать функцию in_array, а просто обратиться к массиву по индексу.