2015-03-03 5 views
0

Просто создайте простую систему входа в школьный клуб. И я пытаюсь отправить сообщение об ошибке, если имя, которое было введено, не соответствует строке в файле, содержащем имена учеников. Файл выглядит примерно так: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).

EDIT: Пробовал:

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

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

+0

ЕСЛИ студент должен набрать полный текст, например «Student One 8M2», и это именно то, что вы тестируете тогда, почему нет просто проверить это значение в массиве? т.е.: if (! in_array ('Student One 8M2', $ students)) exit (""); – RamRaider

+0

@RamRaider Это производит то же, что и я. Это связано с новыми символами в файле? – mikebah

+0

Это может быть так. Возможно, попробуйте: $ students = file ('students.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES | FILE_TEXT); – RamRaider

ответ

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(). – mikebah

+0

Если вы предположим, что студент вводит полное имя, например «Student One 8M2», он должен работать. Вы можете добавить обрезку в обе строки, чтобы удалить ведущие и конечные пробелы – SeriousDron

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 – mikebah

+0

Просто попробовал urldecode с _POST и не работал – mikebah

0

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

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

От PHP документации для StrPos

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

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

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

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

Это не сработало. :( – mikebah

Смежные вопросы