我有一个connect.php
文件,应该是用来验证与我的数据库的成功连接。然后我有一个 db.php
文件,我在其中使用 PHP 中的 require('connect.php');
函数导入了 connect.php
文件。然而,我的IDE仍然给我一个错误,说$conn
变量(在下面的代码中定义)没有被定义。起初我以为将connect.php
导入db.php
文件的过程可能在某种程度上失败了,但情况似乎并非如此,因为在浏览器中启动db.php
文件会返回 “数据库连接成功”,这应该是不可能的,除非connect.php
文件已被正确导入。
这就是connect.php
文件的内容。
<?php
$host = 'localhost';
$usr = 'root';
$passwd = '';
$db_name = 'testdb';
$conn = new MySQLi($host, $usr, $passwd, $db_name);
if($conn->connect_error){
die('Database connection failure: ' . $conn->connect_error);
} else{
echo "Database connection success.";
}
然后我尝试将这段代码导入db.php
,如下图所示。
<?php
require('connect.php');
$sql = "SELECT * FROM users";
$stmt = $conn->prepare($sql);
然而在db.php
中,$conn
的变量由于某种原因而未被定义。为什么在导入它的定义成功的情况下,它还是未定义?
解决方案1
在PHPStorm中,如果我错误地定义了项目根(即使这不应该是你的情况)或包含路径,这种情况就会发生在我身上。
基本上,IDE无法 “看到 “connect.php
里面的内容,因此就像那里定义的变量不存在一样。
你可以尝试定义一个class来处理连接。这是个肮脏的黑客。
<?php
class MyConnection
{
private static $conn = null;
public static instance() {
if (null === static::$conn) {
$host = 'localhost';
$usr = 'root';
$passwd = '';
$db_name = 'testdb';
static::$conn = new MySQLi($host, $usr, $passwd, $db_name);
if(static::$conn->connect_error) {
die('Database connection failure: ' . static::$conn->connect_error);
}
}
return static::$conn;
}
}
中,然后在db.php
中。
require('connect.php');
$sql = "SELECT * FROM users";
$stmt = MyConnection::instance()->prepare($sql);
不同的是,我注意到一些IDE(PHPStorm和Microsoft VSCode)有时似乎比全局符号更能处理类way。
这种方法的优点之一是,在较大的项目中,如果你定义了一个自动加载器,就可以完全避免大多数require
和include
,而只在需要时加载文件。
在这种情况下,这只是一个丑陋的黑客,perhaps让IDE高兴。如果你可以通过告知 IDE 你的项目文件和/或包含的路径来解决一些问题,通过各种方式,你应该这样做。
我将避免使用声明的技巧
global $conn;
因为当你使用一个全局未定义的变量时,你可能不会注意到,或者更糟糕的是用特殊的注释来压制警告,因为这使你错过了all个未定义的符号。
/** @noinspection PHPUndefinedSymbol */
如果没有别的办法,就投降吧,定义一个假的变量。
/* dummy connection */
$conn = null;
require 'connect.php';
...