PHP搜索不匹配文件中的行

时间:2015-03-03 10:51:55

标签: javascript php file-handling strpos comparison-operators

为学校俱乐部创建一个简单的登录系统。如果输入的名称与包含学生姓名的文件中的任何行不匹配,我会尝试发送错误。该文件看起来有点像这样:

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;
            }
        }
    }
}

不幸的是,这会导致用户无法提交任何内容而无法获得#34;您必须输入您的全名&#34;。例如,条目如&#34; Student One 8M2&#34;和&#34; fdskdsa&#34;。

但是,当if语句要求匹配(!== false)时,它会正确地将javascript警告抛出到与文件中任何内容匹配的任何内容。

重申一下,我希望当用户写出与文件中任何一行(students.txt)不匹配的内容时,会显示警告。

编辑:尝试:

  • 使用&#34; ===&#34;而不是&#34; ==&#34; - 结果相同
  • 使用&#34; strstr&#34;而不是&#34; strpos&#34; - 结果相同
  • 使用&#34; $ _ GET&#34;而不是&#34; $ _ POST&#34;以及变量上的urldecode()函数 - 前者给出了&#34;未定义的索引&#34;并结合后者,&#34; strpos():空针&#34;。

顺便说一句,我正在使用Internet Explorer 11。

3 个答案:

答案 0 :(得分:1)

您的代码中存在很多错误。其中一些已经注意到了。你应该使用&#34; ===&#34;跳行结束符号很好。  但是我看到的主要问题是你检查了循环,但是在第一个不包含正确名称的字符串之后退出而不是处理所有这些。

您应检查所有登录并仅在没有匹配时退出。所以它应该是那样的

...
$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不是检查名称是否存在的好函数。 如果我是一个邪恶的学生并且进入(例如)仅仅是&#34; e&#34;那么这是一个例子。字母E包含在你的一些学生名字中,所以这将被罚款。 您应该通过比较字符串的提取名称部分的完整字符串并比较该部分来防止这种情况

答案 1 :(得分: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。

答案 2 :(得分:0)

根据您的问题

但是,当if语句请求匹配(!== false)时,它会正确地将javascript警报抛出到与文件中任何内容匹配的任何内容。

来自strpos的PHP文档

<强> 警告

此函数可能返回布尔值FALSE,但也可能返回非布尔值,其值为FALSE。有关更多信息,请阅读有关布尔值的部分。使用===运算符测试此函数的返回值。

因此,请通过更改以下行来尝试您的脚本

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