首页 文章

为什么$ line = fgets(“data / $ f_handle”)不起作用

提问于
浏览
1

好吧,情况看起来很简单,所以我做错了什么?

$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)
"; //exit; if(strpos($line,$studentID)) { // Line has studentID echo "Line $x: ($line)($studentID)

"; // Exit the loop if found break; }

我的输出是这样的:

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

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

1 回答

  • 2

    $f_handle 包含一个资源对象(您刚刚打开的文件的句柄) . 在 "data/$f_handle" 中插入字符串中的内容是没有意义的 . 只需使用 fgets($f_handle) 代替 .

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

    • 像你一样单独计算行数并不是最有用的方法,因为它需要两次读取文件 . 相反,请改用 $x = 0; while(($line = fgets($f_handle)) !== false) { ... ; $x++; } 之类的东西 .

    • strpos() 如果没有匹配则返回 false ,但如果在haystack字符串的开头找到针子串,它也会返回 0 . 两者都在 if 条件下表现为 false . 您应该直接与 false 进行比较: if(strpos(...) !== false) .

    • 但是, strpos() 也可能在这里不起作用 . 想象一下,您正在搜索ID为 10 的学生,但您正在扫描的当前行的ID为 102 . 您的测试将在该行上错误匹配 .

    • if() 之后有一个左大括号,但没有匹配的右大括号 .

相关问题