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