【问题标题】:PHP Search Not Matching Line in FilePHP搜索文件中的行不匹配
【发布时间】:2015-05-03 23:50:10
【问题描述】:

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

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) 中的任何行都不匹配时显示警报。

编辑:尝试过:

  • 使用“===”而不是“==” - 结果相同
  • 使用“strstr”而不是“strpos” - 结果相同
  • 使用“$_GET”而不是“$_POST”以及变量上的 urldecode() 函数 - 前者给出“未定义索引”并与后者结合使用“strpos(): 空针”。

顺便说一下,我使用的是 Internet Explorer 11。

【问题讨论】:

  • 如果学生必须输入全文,例如“Student One 8M2”,而这正是您要测试的内容,那么为什么不简单地在数组中测试该值呢?即: if( !in_array( 'Student One 8M2', $students ) ) exit("");
  • @RamRaider 这会产生与我尝试过的相同的东西。是否与文件中的换行符有关?
  • 有可能。也许试试: $students = file('students.txt',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES | FILE_TEXT);
  • @RamRaider 这行不通! :(

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


【解决方案1】:

您的代码中有很多错误。其中一些已经被注意到。您应该使用“===”,并且最好使用行尾符号。 但我看到的主要问题是您签入 for 循环,但在第一个不包含正确名称的字符串之后退出,而不是处理所有这些。

您应该检查所有登录并仅在它们都不匹配时退出。所以应该是这样的

...
$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”。字母 E 包含在您的一些学生姓名中,因此可以考虑。 您应该通过比较提取字符串的名称部分的完整字符串并比较该部分来防止这种情况

【讨论】:

  • 这很完美!非常感谢您改进我草率的代码。但是,完整的字符串比较对我不起作用,至少在使用 in_array() 时是这样。
  • 如果您假设学生输入“Student One 8M2”之类的全名,它应该可以工作。您可以在两个字符串中添加修剪以删除前导和尾随空格
【解决方案2】:

没有构建一个表单来测试我写了这个并使用 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。

【讨论】:

  • 这也没用。我得到:未定义的索引:在第 29 行的 signin.php 中搜索 strpos():第 32 行的 signin.php 中的空针
  • 刚刚尝试使用 _POST 进行 urldecode,也没有成功。
【解决方案3】:

来自您的问题

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

来自 strpos 的 PHP 文档

警告

此函数可能返回布尔值 FALSE,但也可能返回计算结果为 FALSE 的非布尔值。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符来测试这个函数的返回值。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多