为什么strcmp在第二次运行时返回false?

时间:2014-05-02 01:52:40

标签: php passwords strcmp

现在我正在制作一个简单的登录系统。客户端输入表单数据,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工作。

3 个答案:

答案 0 :(得分:3)

strcmp()返回一个整数,而不是布尔值。实际上,如果字符串匹配,则返回0,这将在if语句中评估为false。这就是为什么它与典型的布尔函数相比似乎具有“反向”行为。

See the documentation

答案 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);