javascript — PHP-поиск не соответствует строке в файле

Просто создать простую систему входа для школьного клуба. И я пытаюсь отправить сообщение об ошибке, если введенное имя не совпадает ни с одной строкой в ​​файле, содержащем имена учеников. Файл выглядит примерно так:

Student One  8M2
Student Two  8M3
Student Three  8M2

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

if (isset($_POST['search'])) {
$search = $_POST['search'];
$students = file("students.txt"); // read file into array
foreach ($students as $student) {
if (strpos($student, $search) == false) { // not found in student list
echo "<script type='text/javascript'>alert('You must enter your full name.');
window.open('signin.php', '_self');</script>";
return false;
}
}
}
}

К сожалению, это приводит к тому, что пользователь не может отправить что-либо, не получив «Вы должны ввести свое полное имя». Например, с такими записями, как «Student One 8M2» и «fdskdsa».

Однако когда оператор if запрашивает совпадение (! == false), он корректно генерирует предупреждение javascript для всего, что соответствует чему-либо в файле.

Просто повторюсь, я бы хотел, чтобы предупреждение показывалось, когда пользователь пишет что-то, что НЕ соответствует ни одной строке в файле (Students.txt).

РЕДАКТИРОВАТЬ: Пытался:

  • используя «===» вместо «==» — тот же результат
  • использование «strstr» вместо «strpos» — тот же результат
  • использование «$ _GET» вместо «$ _POST», а также функции urldecode () для переменной — первый дал «неопределенный индекс» и в сочетании с последним «strpos (): empty needle».

Я использую Internet Explorer 11, кстати.

0

Решение

В вашем коде много ошибок. Некоторые из них уже отмечены. Вы должны использовать «===», и это хорошо, чтобы отключить символы конца строки.
Но главная проблема, как я вижу, состоит в том, что вы регистрируете цикл, но выход после самой первой строки, которая не содержит правильного имени, вместо обработки всех из них.

Вы должны проверить все логины и выйти, только если ни один из них не совпадает. Так и должно быть

...
$found = false;
foreach($students as $student) {
if (strpos( $student, $search ) !== false ) {
$found = true;
break; //We found one. So we can to stop search
}
}
if (!$found) {
echo "<script type='text/javascript'>
alert('You must enter your full name.');
window.open('signin.php', '_self');
</script>";
}

Следующая проблема, как я вижу, состоит в том, что strpos не является хорошей функцией для проверки существования имени, так как достаточно, если введенная строка является только частью полной строки.
Например, если я злой ученик и ввел (например) просто «е». Буква E содержится в именах некоторых ваших учеников, так что это будет хорошо обозначено.
Вы должны предотвратить это, сравнивая полную строку извлечения части имени строки и сравнивая эту часть

1

Другие решения

Не создавая форму для тестирования, я написал это и протестировал, используя GET, а не POST.

$filepath='c:\temp\students.txt';
$search = urldecode( $_GET['search'] );
$students = file( $filepath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES | FILE_TEXT );

foreach($students as $student) {
if( strpos( $student, $search ) == false ) {
echo "<script type='text/javascript'>
alert('You must enter your full name.');
window.open('signin.php', '_self');
</script>";
}
}
  • это сработало. Попробуйте использовать urldecode вокруг публикуемой переменной — когда вы публикуете, переменная будет urlencoded.
0

Из твоего вопроса

Однако когда оператор if запрашивает совпадение (! == false), он корректно генерирует предупреждение javascript для всего, что соответствует чему-либо в файле.

Из документации PHP для strpos

Предупреждение

Эта функция может возвращать логическое значение FALSE, но также может возвращать и не булево значение, которое оценивается как FALSE. Пожалуйста, прочитайте раздел о логических значениях для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции.

Так что попробуйте свой сценарий, изменив следующую строку

 if (strpos($student, $search) === false) {
0