0

このコードが同じであるのに、なぜこのコードが2行目では機能するが、1行目では機能しないのかを誰でも教えてくれますか?

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";
    }
?>
4

2 に答える 2

2

最初の行は改行文字で終了し、2番目の行はそうではありません。ハッシュには改行文字が含まれていないため、最初の行とは一致しません。

長さ-1バイトが読み取られたとき、改行(戻り値に含まれる)、またはEOF(どちらか早い方)で読み取りが終了します。長さが指定されていない場合は、行の終わりに達するまでストリームから読み取りを続けます。--fgetsドキュメント

于 2012-08-31T02:00:11.510 に答える
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して 1 つずつ読み取り、改行を削除します。

于 2012-08-31T02:06:32.387 に答える