You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP文件单独运行正常,被包含时提示$conn未定义的原因排查

问题分析:Undefined variable: conn 报错原因与解决办法

嘿,我来帮你拆解这个问题!先理清楚你的场景:

  • 根目录下有frontendbackend两个文件夹
  • frontend里有个拼写小失误my_prohile.php(应该是my_profile.php吧?)
  • backend里有my_profile.phpconnection.php

先把你的代码整理出来方便查看:

后端文件代码

backend/connection.php

<?php 
error_reporting(0); 
$conn = new mysqli("localhost","root","","vector"); 
?>

backend/my_profile.php

<?php 
require_once './connection.php'; 
$credit_score=mysqli_query($conn, "SELECT credits FROM volunteers WHERE username='$user';"); 
$credit=mysqli_fetch_assoc($credit_score); 
$credits=$credit['credits']; 
return $credits;

前端文件代码

frontend/my_prohile.php

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<?php require_once '../backend/my_profile.php'; ?> 
<meta charset="UTF-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 
<title>My Profile</title> 
</head> 
<body> 
<!-- View credit score --> 
<p>Your credits: <?php echo($credits)?></p> 
</body> 
</html>

你提到单独运行backend/my_profile.php正常,但运行前端的文件时,后端的my_profile.php第4行报Undefined variable: conn,核心原因是PHP的相对路径解析规则

报错原因

当你在frontend/my_prohile.php里用require_once '../backend/my_profile.php';引入后端文件时,backend/my_profile.php里的require_once './connection.php';是**相对于当前执行的脚本(也就是前端的my_prohile.php所在的frontend目录)**来查找文件的,而不是相对于backend/my_profile.php自己的目录!

也就是说,PHP会去frontend/connection.php找这个文件,但这个文件根本不存在,所以connection.php里的$conn变量完全没有被定义,自然在执行mysqli_query($conn, ...)时就会报错。

而单独运行backend/my_profile.php时,./connection.php是相对于backend目录的,能找到文件,所以$conn正常定义,脚本就能跑通。

解决办法

最可靠的方式是使用绝对路径来引入文件,避免相对路径的解析歧义,推荐两种方案:

方案1:使用__DIR__常量(最推荐)

修改backend/my_profile.php里的引入代码,用__DIR__获取当前文件所在的目录(也就是backend目录),再拼接connection.php的路径:

<?php 
// 用__DIR__确保路径始终相对于当前文件所在目录
require_once __DIR__ . '/connection.php'; 
$credit_score=mysqli_query($conn, "SELECT credits FROM volunteers WHERE username='$user';"); 
$credit=mysqli_fetch_assoc($credit_score); 
$credits=$credit['credits']; 
return $credits;

__DIR__是PHP内置常量,会返回当前脚本文件所在的绝对路径,不管这个脚本被哪个文件引入,这个路径都是准确的,完美解决相对路径的问题。

方案2:定义根目录常量

如果你的项目有多个文件需要跨目录引入,可以在入口文件(比如frontend/my_profile.php)顶部定义一个根目录常量,然后所有文件都基于这个常量来引入:

// 在frontend/my_profile.php最顶部添加
define('ROOT_DIR', dirname(__DIR__)); // 获取根目录的绝对路径

// 然后修改backend/my_profile.php里的引入代码
require_once ROOT_DIR . '/backend/connection.php';

这种方式适合大型项目,方便统一管理文件路径。

另外,顺便提一下:你的前端文件名是my_prohile.php(多了个h?),建议改成my_profile.php保持命名一致,避免后续访问时的路径错误。

内容的提问来源于stack exchange,提问作者Rohan Shah

火山引擎 最新活动