2010-12-11 5 views
1

Я пытаюсь помочь другу с назначением программирования php. Ему необходимо прочитать пароли и имена пользователей из файла и сравнить их с именем пользователя ($ user) и паролем (пароль $), введенным из формы для аутентификации пользователя. (простой, никакой безопасности вообще, просто академический)Сложность сравнения строк PHP

Проблема в сравнении строк. Я пошел туда и обратно между использованием ==, === и strcmp, но ничего не работает правильно. Есть идеи?

Это текстовый файл, который читается:

UserData.txt

test:pass 
testa:pass2 
testb:pass4 
testc:pass6 

<?php 

$fh = fopen("UserData.txt", "r") or die("Can't open file"); 

$line = ""; 
$line_length = 0; 
$div = 0; 
$accounts = array(); 

while($line = fgets($fh)) { 
    $div = strpos($line, ":"); //positing of ":" dividing username and password 
    $line_length = strlen($line); //Total length of username + : + password line entry 

    $accounts[substr($line, 0, $div)] = substr($line, $div + 1, $line_length); 
} 

foreach ($accounts as $key => $value) { 
    if(($user === $key) && ($password === $value)) { 
     echo "MATCH - user/pass correct<br/>"; 
     //Just needs to echo the above line if user/pass correct 
    } 
} 

?> 

HTML файла:

<form name="myform" method="GET" action="login.php"> 
Please Login to order 
User Name: 
<input type="text" name="user" value="" size="10"/> 
Password: 
<input type="password" name="password" value="" size="10"/> 
<input type="submit" name="submit" value="Log In" > 

Обновлено login.php файл:

<?php 

$lines = file('UserData.txt', FILE_IGNORE_NEW_LINES); 
foreach ($lines as $line) 
{ 
    $arr = explode(':', $line); 
    if ($arr[0]==$user && $arr[1]==$password) 
    { 
    echo "MATCH - user/pass correct<br/>"; 
    } else { 
    echo "NO<br />"; 
    } 
} 

echo "<br />"; 
var_dump($user); 
echo "<br />"; 
var_dump($password); 
echo "<br />"; 
echo phpversion(); 
?> 

Выход:

NO 
NO 
NO 
NO 

string(4) "test" 
string(4) "pass" 
4.4.9 
+1

Подписываются ли '$ user 'и' $ password' соответствующие поля формы '$ _POST'? – BoltClock

ответ

2

Как Короче говоря, как это:

$lines = file('UserData.txt', FILE_IGNORE_NEW_LINES); 
foreach ($lines as $line) 
{ 
    $arr = explode(':', $line); 
    if ($arr[0]==$user && $arr[1]==$password) 
    { 
    echo "MATCH - user/pass correct<br/>"; 
    } 
} 

Если файл UserData.txt огромен, увеличить объем памяти для обработки

+2

Если файл огромен, вам будет лучше читать его по очереди, чем увеличение памяти. – scoates

+0

Если файл небольшой, лучше остановиться с этой функцией, потому что это домашняя работа – ajreal

+0

@ajreal, мне нравится эта реализация - она ​​чистая и лаконичная. Но по какой-то причине я не могу понять, почему, когда правильное имя пользователя/пароль вводится в форму, «$ arr [0] == $ user && $ arr [1] == $ password" не возвращается правда. Я добавил форму, которая называет этот PHP-скрипт главной записи. Есть идеи? –

1

fgets читает заключительную строку, поэтому пароль для "test" будет "pass\n". В следующий раз, когда у вас возникнет такая проблема, используйте var_dump на сравниваемых строках и тщательно изучите вывод.

В любом случае, считают это:

$accounts = array(); 
foreach (file("UserData.txt",FILE_IGNORE_NEW_LINES) as $line) { 
    list($user,$pass) = explode(':',$line); 
    $accounts[$user] = $pass; 
} 

if ($accounts[$the_user] === $the_password) { /* Password is correct */ } 
+1

ах. вы избили меня за секунды (-: Обратите внимание, что ваше решение перезаписывает переменную '$ user' (что плакат пренебрегал отображением в качестве ввода). – scoates

+1

@scoates: вот почему я использую' $ the_user' ниже ;-) –

+0

уверен. просто хотел, чтобы это было ясно для ОП, что ему нужно следить за этим. – scoates

1

Похоже на OFF- по одной ошибке.

Try:

while($line = fgets($fh)) { // or better, use file() 
    list($u, $p) = explode(':', $line, 2); 
    $accounts[$u] = $p; 
} 
0

Во-первых, вы хотели бы прочитать весь файл в массив:

$file = file('userdata.txt') or die("Can't open file"); 

После этого, вы можете использовать explode() разделить каждую строку и добавить пользователя и пароль к массиву учетных записей:

foreach($file as $line){ 
    $up = explode(':', $line); 
    // here you can also check line validity 
    if(count($up)!=2){ 
     continue; // skip it 
    } 
    $accounts[ trim($up[0]) ] = trim($up[1]); 
} 

Теперь легкая часть:

if(isset($accounts[$user]) && $accounts[$user]===$password){ 
    echo "Welcome, $user"; // this should be sanitized before use 
} 
else{ 
    echo "Wrong username or password"; 
} 
+0

Я не использовал 'list()', потому что он может создавать уведомления о недопустимых строках. – s3v3n

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