为什么$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是正确的,数据文件有六行。有什么建议吗?

$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()后面有一个左大括号,但没有匹配的右大括号

最新更新