php - 为什么 $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
。两者都表现得像false
一个if
条件。您应该直接比较false
:if(strpos(...) !== false)
.- 但是,
strpos()
在这里也可能行不通。想象一下,您正在搜索具有 ID 的学生10
,但您正在扫描的当前行具有 ID102
。您的测试将错误地匹配该行。 - 之后有一个左大括号
if()
,但没有匹配的右大括号。
推荐阅读
- r - 如何将r数据框保存为图像
- sql - 从表中选择参数
- python-3.x - Pandas 中的混合数字和字符串在 Excel 中显示错误
- php - 如何在 FPDF 生成的 PDF 文件中水平居中文本
- python - 使用 Spyder 安装 Python 包
- javascript - 如何在Javascript中仅使用其引用更改对象
- windows - 3个或更多进程之间的通信
- angular - Angular 子窗体控件/组值和错误冒泡到父级
- twitter-bootstrap - 添加 XXL 和 XXXL 断点。什么是容器最大宽度?
- php - 我想在 Laravel 的 /public 文件夹中创建一个 .html 文件