Я использую explode () для преобразования строки, прочитанной из текстового файла, в массив, который я использую для сравнения с вводом от пользователя.
Текстовый файл содержит:
user#test //user= username test= password
Когда я пытаюсь использовать strcmp (), он возвращает -1, хотя печать двух строковых переменных приводит к выводу
test||test
=-1
который я печатаю с:
if(isset($user_details[1])){
$user_details = explode('#', $user); // $user is text file
$passW = $_GET['password']; // input: "test"$tesPW = user_details[1];
printf($passW."||".$testPW."=".strcmp($passW,$testPW));
}
Предполагая, что это простое приложение для избранной группы людей в ограниченной среде, я не буду комментировать вопросы безопасности, связанные с этим методом.
Эта функция вернет true
если пользователь / пароль соответствует строке в файле, false
если не.
//Assumes const USERACCOUNTFILE defines the path to the file
function AuthenticateUser ($username, $password) {
$handle = @fopen(USERACCOUNTFILE, "r"); //Open the file for reading
if ($handle) {
while(($line = fgets($handle)) !== false) { //Read each line of the file
$line = explode('#', $line); //Split the line
if($line && count($line) == 2) { //Does the line have the expected number of values?
//Compare the values minus all whitespace
if(trim($line[0], "\r\n\t ") === $username && trim($line[1], "\r\n\t ") === $password) {
fclose($handle);
return true; //Found a match
}
}
}
}
fclose($handle);
return false; //None matched
}
Вы также можете использовать trim($line[0])
без необязательного параметра "\r\n\t "
в качестве параметра по умолчанию достаточно.
если strcmp возвращает -1 из-за того, что $ passW меньше, чем $ testPW http://php.net/manual/en/function.strcmp.php.
Если у $ user есть строка «user # test // user = username test = password» и вы делаете $ user_details = explode (‘#’, $ user); у вас есть в user_details [1]; строка «test // user = username test = password»;