PHP 在文件中搜索不匹配的行
PHP Search Not Matching Line in File
只是为学校俱乐部创建一个简单的登录系统。如果输入的姓名与包含学生姓名的文件中的任何行不匹配,我将尝试发送错误。该文件看起来有点像这样:
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;
}
}
}
}
不幸的是,这会导致用户在未获得 "You must enter your full name" 的情况下无法提交任何内容。例如,使用 "Student One 8M2" 和 "fdskdsa" 等条目。
但是,当 if 语句要求匹配 (!== false) 时,它会正确地向与文件中任何内容匹配的任何内容抛出 javascript 警报。
重申一下,我希望当用户写入的内容与文件中的任何行都不匹配时显示警报 (students.txt)。
编辑: 尝试:
- 使用“===”代替“==” - 结果相同
- 使用 "strstr" 而不是 "strpos" - 结果相同
- 使用“$_GET”而不是“$_POST”以及变量上的 urldecode() 函数 - 前者给出 "undefined index" 并与后者结合,"strpos(): empty needle".
顺便说一句,我正在使用 Internet Explorer 11。
我写了这篇文章,并使用 GET 而不是 POST 进行了测试,而不是 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>";
}
}
- 它起作用了。尝试在 posted 变量周围使用 urldecode - 当你 post 时,var 将被 urlencoded。
根据你的问题
但是,当 if 语句要求匹配 (!== false) 时,它会正确地将 javascript 警报抛给与文件中任何内容匹配的任何内容。
来自 PHP strpos 的文档
警告
此函数可能 return 布尔值 FALSE,但也可能 return 计算结果为 FALSE 的非布尔值。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符测试此函数的 return 值。
因此,通过更改以下行来尝试您的脚本
if (strpos($student, $search) === false) {
你的代码中有很多错误。其中一些已经被注意到。您应该使用“===”,它可以很好地去除行尾符号。
但我看到的主要问题是您签入 for 循环,但在第一个不包含正确名称的字符串之后退出,而不是处理所有这些。
您应该检查所有登录并仅在 none 匹配时退出。所以应该是这样的
...
$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,因此可以考虑。
您应该通过比较字符串的提取名称部分的完整字符串并比较该部分来防止这种情况
只是为学校俱乐部创建一个简单的登录系统。如果输入的姓名与包含学生姓名的文件中的任何行不匹配,我将尝试发送错误。该文件看起来有点像这样:
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;
}
}
}
}
不幸的是,这会导致用户在未获得 "You must enter your full name" 的情况下无法提交任何内容。例如,使用 "Student One 8M2" 和 "fdskdsa" 等条目。
但是,当 if 语句要求匹配 (!== false) 时,它会正确地向与文件中任何内容匹配的任何内容抛出 javascript 警报。
重申一下,我希望当用户写入的内容与文件中的任何行都不匹配时显示警报 (students.txt)。
编辑: 尝试:
- 使用“===”代替“==” - 结果相同
- 使用 "strstr" 而不是 "strpos" - 结果相同
- 使用“$_GET”而不是“$_POST”以及变量上的 urldecode() 函数 - 前者给出 "undefined index" 并与后者结合,"strpos(): empty needle".
顺便说一句,我正在使用 Internet Explorer 11。
我写了这篇文章,并使用 GET 而不是 POST 进行了测试,而不是 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>";
}
}
- 它起作用了。尝试在 posted 变量周围使用 urldecode - 当你 post 时,var 将被 urlencoded。
根据你的问题
但是,当 if 语句要求匹配 (!== false) 时,它会正确地将 javascript 警报抛给与文件中任何内容匹配的任何内容。
来自 PHP strpos 的文档
警告
此函数可能 return 布尔值 FALSE,但也可能 return 计算结果为 FALSE 的非布尔值。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符测试此函数的 return 值。
因此,通过更改以下行来尝试您的脚本
if (strpos($student, $search) === false) {
你的代码中有很多错误。其中一些已经被注意到。您应该使用“===”,它可以很好地去除行尾符号。 但我看到的主要问题是您签入 for 循环,但在第一个不包含正确名称的字符串之后退出,而不是处理所有这些。
您应该检查所有登录并仅在 none 匹配时退出。所以应该是这样的
...
$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,因此可以考虑。 您应该通过比较字符串的提取名称部分的完整字符串并比较该部分来防止这种情况