现在我正在制作一个简单的登录系统。客户端输入表单数据,php通过检查类似的文本文件来处理它:
name
pass
name
pass
...so on
我用来处理的问题是:
$name = $_REQUEST['name'];
$pass = $_REQUEST['pass'];
$validName = false;
$validPass = false;
$pos = 0;
$file_handle = fopen("database.txt", "r");
while (!feof($file_handle)) {
$line = ltrim( fgets($file_handle), "\n" );
if ($pos % 2 == 0 ) // Checks for names first on even rows
{
if( strcmp( $name, $line))// Normal checking returns correctly
$validName = true;
}
else if( $validName === true ) // if odd, and a matching name check pass
{
if( !strcmp( $pass, $line) )// What's going on here? Why is it opposite?
{
$validPass = true;
}
break;
}
$pos++;
}
首先检查if( strcmp( $name, $line))
是否检查数据库中是否有与客户端输入匹配的名称。
当客户端名称与数据库中的名称匹配时,这会正确返回true。我以相同的方式检查密码 EXACT ,但是当它假设为真时它会返回false,并在它假设时返回true是假的。
这里发生了什么?
旁注,我只使用strcmp
,因为我无法让$name === $line
工作。
答案 0 :(得分:3)
strcmp()
返回一个整数,而不是布尔值。实际上,如果字符串匹配,则返回0,这将在if语句中评估为false。这就是为什么它与典型的布尔函数相比似乎具有“反向”行为。
答案 1 :(得分:0)
根据你的代码,它不是完全相同的方式,而是相反:
if( strcmp( $name, $line))
if( !strcmp( $pass, $line))
答案 2 :(得分:0)
看起来我认为有一个更大的问题。
有2个问题。
1,正如丹尼尔完美解释的那样
2,在每一行的末尾都有一个额外的字符,它丢掉了所有的比较。所以为了解决这个问题,我删除了该行的结尾,现在一切正常。
while ( !feof($file_handle) )
{
$line = ltrim( fgets($file_handle) );
$line = substr($line, 0, -1);/// This gets rid of the extra character
if ( ($pos % 2) == 0 )
$validName = ( $name === $line );// compares with ===, which is faster then strcmp
else if( $validName )
{
$validPass = ( $pass === $line );
break;
}
$pos++;
}fclose($file_handle);