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