好吧,情况看起来很简单,所以我做错了什么?
$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 回答
$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()
之后有一个左大括号,但没有匹配的右大括号 .