我正在尝试编写一个PHP函数。这很简单。这只是一个查询数据库的准备好的语句,但是我无法使它正常工作。我一直收到非对象上的错误消息,调用成员函数prepare()。这是代码:
$DBH = new mysqli("host", "test", "123456", "dbname"); function selectInfo($limit, $offset){ $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); $stmt->bind_param("ii", $limit, $offset); $stmt->execute(); } selectInfo();
每当我调用该函数时,都会收到该错误。有人可以帮忙吗?
这是一个范围错误。您正在创建$DBH一个全局变量。因此,当您输入函数时,全局变量不可用。您有5个真实选择。
$DBH
1.使用全局关键字
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.使用预先建立的课程/框架
这是最好的选择,因为您不必担心自己做。