使用变量ID查询数据库后file_get_contents无法显示数据求助
先别急,咱们一步步排查问题,从最可能的根源入手:
1. 先确认SQL查询是否真的拿到了数据
你说$myrow[0]的值是2,但拼接后的SQL可能没你想的那么“干净”,或者查询本身就没返回结果。先加几行调试代码看看:
$query = "SELECT * FROM data where data.id=".$myrow[0].""; // 先输出实际执行的SQL,看看是不是真的是SELECT * FROM data where data.id=2 echo "执行的SQL: " . $query . "<br>"; $result = mysqli_query($mysqli, $query); // 检查SQL是否执行成功 if (!$result) { die("SQL执行出错: " . mysqli_error($mysqli)); } $rows = mysqli_fetch_row($result); // 检查是否拿到了记录 if (!$rows) { echo "没有找到id为" . $myrow[0] . "的记录"; exit; } // 输出拿到的结果,确认$rows[1]有值 echo "查询到的rows[1]值: " . $rows[1] . "<br>"; $homepage = file_get_contents('my page'); echo $homepage;
运行这段代码后,你就能明确:
- SQL语句是不是正确(有没有隐形字符,比如空格、换行、奇怪的符号)
- SQL有没有执行错误
- 到底有没有拿到id=2的记录
- $rows[1]是不是真的有值
如果发现SQL里的id不是纯2(比如是" 2"或者"2\n"),那先对$myrow[0]做清理:
$clean_id = (int)trim($myrow[0]); // 先去掉前后空白,再转成整数 $query = "SELECT * FROM data where data.id=" . $clean_id;
2. 检查页面内容的变量替换逻辑
你说页面'my page'包含$rows[1],但这里有个关键问题:用file_get_contents读取文件,只会拿到原始字符串,不会自动解析PHP变量。
举个例子,如果'my page'是个PHP文件,里面写的是<?php echo $rows[1]; ?>,用file_get_contents读出来的就是这个字符串本身,不会变成$rows[1]的实际值——除非你是通过HTTP请求访问这个页面(比如file_get_contents('http://yourdomain/my page.php'),这时候服务器会先解析PHP再返回内容)。
解决办法分两种:
方法一:用include/require代替file_get_contents
如果'my page'是PHP文件,直接引入它,PHP会自动解析里面的变量:
// 先确保$rows已经拿到了数据 $display_value = $rows[1]; include 'my page.php'; // 页面里直接用<?= $display_value ?>或者<?php echo $display_value; ?>
方法二:手动替换字符串
如果'my page'是静态文件(比如HTML),里面用了占位符(比如{{rows1}}或者你原来的$rows[1]),那读完文件后手动替换:
$homepage = file_get_contents('my page'); // 把页面里的占位符替换成实际值 $homepage = str_replace('$rows[1]', $rows[1], $homepage); echo $homepage;
3. 别再用SQL拼接了,用预处理语句更安全还能避免坑
不管这次问题是什么,直接拼接SQL都有SQL注入的风险,而且很容易因为变量的格式问题出bug。换成预处理语句试试,从根源避免拼接的问题:
// 准备预处理语句 $stmt = mysqli_prepare($mysqli, "SELECT * FROM data WHERE data.id = ?"); // 绑定参数,"i"表示参数是整数类型 mysqli_stmt_bind_param($stmt, "i", $myrow[0]); // 执行语句 mysqli_stmt_execute($stmt); // 获取结果 $result = mysqli_stmt_get_result($stmt); $rows = mysqli_fetch_row($result); // 关闭语句 mysqli_stmt_close($stmt);
预处理语句会自动处理变量的格式问题,不管$myrow[0]有没有隐形字符,都能正确绑定参数,而且完全避免SQL注入。
按上面的步骤一步步排查,应该就能找到问题所在了!
内容的提问来源于stack exchange,提问作者user9223748

