加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 13:40:23 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试编写一个 PHP函数.这很简单它只是一个准备好的语句来查询数据库,但是我无法让它工作.我不断收到错误调用一个非对象的成员函数prepare().这里是代码: $DBH = new mysqli("host","test","123456","dbname");function selectInfo($limit,$offset){ $
我正在尝试编写一个 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
(真的有很多,我不会打扰上市,因为这是另一个问题在一起…)

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

祝你好运!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读