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

0

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

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).

EDIT: Пробовал:

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

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

  • 0
    Если студент должен напечатать полный текст, например «Student One 8M2», и это именно то, что вы проверяете, тогда почему бы просто не проверить это значение в массиве? Например: if (! in_array ('Student One 8M2', $ Students)) exit ("<script> what </ script>");
  • 0
    @RamRaider Это производит то же самое, что я пытался. Это связано с символами новой строки в файле?
Показать ещё 2 комментария
Теги:
file-handling
comparison-operators
strpos

3 ответа

1
Лучший ответ

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

Вы должны проверить все логины и выйти, только если они не совпадают. Так должно быть что-то вроде этого

...
$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, содержащееся в некоторых ваших именах учеников, так что оно будет исправлено. Вы должны предотвратить это, сравнивая полную строку извлечения части имени строки и сравнивая эту часть

  • 0
    Это сработало отлично! Большое спасибо за улучшение моего неаккуратного кода. Однако полное сравнение строк у меня не сработало, по крайней мере с использованием in_array ().
  • 0
    Если вы предполагаете, что студент вводит полное имя, например «Student One 8M2», это должно сработать. Вы можете добавить обрезку в обе строки, чтобы удалить начальные и конечные пробелы
0

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

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

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

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

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

Поэтому попробуйте свой скрипт, изменив следующую строку

 if (strpos($student, $search) === false) { 
  • 0
    Это не сработало. :(
0

Не создавая форму для тестирования, я написал это и протестировал, используя 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 вокруг опубликованной переменной - по мере того, как вы публикуете, поэтому var будет urlencoded.
  • 0
    Это тоже не сработало. Я получил: неопределенный индекс: поиск в signin.php в строке 29 strpos (): пустая игла в signin.php в строке 32
  • 0
    Просто пробовал urldecode с _POST и тоже не работал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню