这是一个范围错误。你正在制作$DBH一个全局变量。因此,当您输入函数时,全局变量不可用。你有5个真正的选择。
1.使用global关键字function doSomething() {
global $DBH;
//...
这不是一个好主意,因为它可以维护和测试PITA。想象一下尝试调试该函数调用。你现在需要找出$DBH定义的地方,试图弄清楚发生了什么......
2. $DBH为函数创建一个参数function doSomething(MySQLi $DBH) {
它具有明确的优点。但它仍然不是很好,因为调用代码需要跟踪全局变量。
3.创建一个“获取” $DBH对象的函数function getDBH() {
static $DBH = null;
if (is_null($DBH)) {
$DBH = new mysqli(...);
}
return $DBH;}function doSomething() {
$DBH = getDBH();}
这具有完全绕过全局变量问题的优点。但是也很难有多个连接或重复使用任何代码用于其他连接。
4.创建一个包装数据库访问的类class Database {
public function __construct($host, $user, $pass) {
$this->DBH = new MySQli($host, $user, $pass);
}
public function doSOmething() {
$this->DBH->foo();
}}
这为您封装了一切。所有数据库访问都将通过单个类,因此您无需担心全局变量访问或其他任何问题。
5.使用预先构建的类/框架
这是最好的选择,因为您不必担心自己这样做。
数据库访问类:Doctrine ORM - 具有完整ORM(对象映射)的完整数据库访问库
ADODB - 与数据库无关的数据库访问库
Pear MDB2 - 另一个数据库访问库
完整框架:(真的还有很多,我不打算再费心了,因为这是另一个问题......)
真的,选择是无止境的。找到你喜欢的东西,并坚持下去。它真的会让你的生活更轻松......
祝好运!