Просто создать простую систему входа для школьного клуба. И я пытаюсь отправить сообщение об ошибке, если введенное имя не совпадает ни с одной строкой в файле, содержащем имена учеников. Файл выглядит примерно так:
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).
РЕДАКТИРОВАТЬ: Пытался:
Я использую Internet Explorer 11, кстати.
В вашем коде много ошибок. Некоторые из них уже отмечены. Вы должны использовать «===», и это хорошо, чтобы отключить символы конца строки.
Но главная проблема, как я вижу, состоит в том, что вы регистрируете цикл, но выход после самой первой строки, которая не содержит правильного имени, вместо обработки всех из них.
Вы должны проверить все логины и выйти, только если ни один из них не совпадает. Так и должно быть
...
$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 содержится в именах некоторых ваших учеников, так что это будет хорошо обозначено.
Вы должны предотвратить это, сравнивая полную строку извлечения части имени строки и сравнивая эту часть
Не создавая форму для тестирования, я написал это и протестировал, используя 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>";
}
}
Из твоего вопроса
Однако когда оператор if запрашивает совпадение (! == false), он корректно генерирует предупреждение javascript для всего, что соответствует чему-либо в файле.
Из документации PHP для strpos
Предупреждение
Эта функция может возвращать логическое значение FALSE, но также может возвращать и не булево значение, которое оценивается как FALSE. Пожалуйста, прочитайте раздел о логических значениях для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции.
Так что попробуйте свой сценарий, изменив следующую строку
if (strpos($student, $search) === false) {