我正在尝试编写一个
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个真正的选择.
1.使用全局关键字
function doSomething() { global $DBH; //...
这不是一个好主意,因为它使维护和测试成为一个PITA.想象一下,尝试调试该函数调用.你现在需要去找出$DBH被定义在哪里,试图弄清楚发生了什么事情
2.使$DBH成为函数的一个参数
function doSomething(MysqLi $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,$pass); } public function doSOmething() { $this->DBH->foo(); } }
这封装了你的一切.所有数据库访问将通过一个类,所以您不需要担心全局变量访问或其他任何事情.
5.使用预构建的类/框架
这是最好的选择,因为你不需要担心自己做.
数据库访问类:
> A quick google search to get you started
> Doctrine ORM – 具有完整ORM(对象映射)的完整数据库访问库
> ADODB – 数据库不可知数据库访问库
> Pear MDB2 – 另一个数据库访问库
完整框架:
> Zend Framework
> Lithium Framework
> Code Igniter
(真的有很多,我不会打扰上市,因为这是另一个问题在一起…)
真的,选择是无止境的.找到你喜欢的东西,并坚持下去.真的会让你的生活更轻松
祝你好运!