Сложность сравнения строк в PHP - PullRequest
1 голос
/ 12 декабря 2010

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

Проблема заключается в сравнении строк.Я ходил туда-сюда между использованием ==, === и 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

Ответы [ 4 ]

2 голосов
/ 12 декабря 2010

Так коротко, как это:

$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 огромен, увеличьте объем памяти для обработки

1 голос
/ 12 декабря 2010

Выглядит как ошибка "один за другим".

Попробуйте:

while($line = fgets($fh)) { // or better, use file()
    list($u, $p) = explode(':', $line, 2);
    $accounts[$u] = $p;
}
1 голос
/ 12 декабря 2010

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 */ }
0 голосов
/ 12 декабря 2010

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

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

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

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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...