fgets()故障

时间:2012-08-31 01:58:27

标签: php

任何人都可以告诉我为什么这段代码适用于第二行而不是第一行,尽管它们是相同的?

这是pass.txt文件:

01234567 5f4dcc3b5aa765d61d8327deb882cf99
01234567 5f4dcc3b5aa765d61d8327deb882cf99

以下是代码:

<?php
    $f = fopen("pass.txt", "r");
    if ($f) {
        $buffer = fgets($f);
        $buffer = fgets($f); //Comment out this line to read the first line

        $token = explode(' ', $buffer);
        if ($token[1] == hash('md5', 'password'))
            echo "Password correct";
        else
            echo "Password incorrect";
    }
?>

2 个答案:

答案 0 :(得分:2)

您的第一行是换行符,第二行不是。由于您的哈希不包含换行符,因此它与第一行不匹配。

  

读取长度 - 读取1个字节,换行(包含在返回值中)或EOF(以先到者为准)时结束。如果没有指定长度,它将继续从流中读取,直到它到达行尾。 - fgets documentation

答案 1 :(得分:1)

正如@David Schwartz指出的那样,最可能的原因是换行符。

您可以使用file函数忽略换行符。

foreach (file('pass.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
    $token = explode(' ', $line);
    if ($token[1] == hash('md5', 'password'))
      echo "Password correct";
    else
      echo "Password incorrect";
} 

如果文件非常大,请使用fgets逐一阅读并修剪换行符。