在非对象PHP帮助上调用成员函数prepare()

前端之家收集整理的这篇文章主要介绍了在非对象PHP帮助上调用成员函数prepare()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个 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) {

它具有明确的优点.但是,由于调用代码需要跟踪全局变量,所以仍然不太好.

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,$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
(真的有很多,我不会打扰上市,因为这是另一个问题在一起…)

真的,选择是无止境的.找到你喜欢的东西,并坚持下去.真的会让你的生活更轻松

祝你好运!

猜你在找的PHP相关文章