首页 > 解决方案 > 为什么 $line = fgets("data/$f_handle") 不起作用

问题描述

好的,情况看起来很简单,那我做错了什么?

$fname = "students.dat";
$f_handle = fopen("data/$fname", 'r');
$num_lines = count(file("data/$fname"));
for($x=0; $x<$num_lines; $x++) {
    $line = fgets("data/$f_handle");
    echo "Line $x: ($line)<br />"; //exit;
    if(strpos($line,$studentID)) {
    // Line has studentID
    echo "Line $x: ($line)($studentID)<br /> <br />";
    // Exit the loop if found
    break;      
}

我的输出是这样的:

Line 0: ()
Line 1: ()
Line 2: ()
Line 3: ()
Line 4: ()
Line 5: ()

我去了平面文件,因为我的 MySQL 尝试失败了,$studentID 是正确的,并且数据文件有六行。请问有什么建议吗?

标签: phpfgets

解决方案


$f_handle包含一个资源对象(您刚刚打开的文件的句柄)。在字符串中插入它"data/$f_handle"是没有意义的。改用就好fgets($f_handle)了。

除此之外,您的代码中还有其他几个问题:

  • 像你一样单独计算行数并不是最有用的方法,因为它需要读取文件两次。相反,使用类似的东西$x = 0; while(($line = fgets($f_handle)) !== false) { ... ; $x++; }
  • strpos()false如果没有匹配则返回,但如果在 haystack 字符串的开头找到针子字符串,它也会返回0。两者都表现得像false一个if条件。您应该直接比较falseif(strpos(...) !== false).
  • 但是,strpos()在这里也可能行不通。想象一下,您正在搜索具有 ID 的学生10,但您正在扫描的当前行具有 ID 102。您的测试将错误地匹配该行。
  • 之后有一个左大括号if(),但没有匹配的右大括号。

推荐阅读