调用一个非对象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(); 

任何时候我打电话的function,我得到这个错误。 有人可以帮忙吗?

这是一个范围错误。 你让$DBH成为一个全局variables。 所以当你input函数时,全局variables不可用。 你有5个真正的select。

1.使用全局关键字

 function doSomething() { global $DBH; //... 

这不是一个好主意,因为它使维护和testing成为一个PITA。 想象一下,试图debugging该函数调用。 你现在需要去找出$DBH的定义,试图找出发生了什么事…

2.使$DBH成为函数的一个参数

 function doSomething(MySQLi $DBH) { 

它有明确的优势。 但是它仍然不是很好,因为调用代码需要跟踪全局variables。

3.创build一个函数来“获取” $DBH对象

 function getDBH() { static $DBH = null; if (is_null($DBH)) { $DBH = new mysqli(...); } return $DBH; } function doSomething() { $DBH = getDBH(); } 

这有利于全面解决全局variables问题。 但是也很难有多个连接或重新使用其他连接的任何代码。

4.创build一个类来包装数据库访问

 class Database { public function __construct($host, $user, $pass) { $this->DBH = new MySQli($host, $user, $pass); } public function doSOmething() { $this->DBH->foo(); } } 

这封装了你的一切。 所有的数据库访问将通过一个类,所以你不必担心全局variables访问或其他任何东西。

5.使用预build的类/框架

这是最好的select,因为你不需要担心自己做这件事。

数据库访问类:

  • 快速的谷歌search,让你开始
  • Doctrine ORM – 具有完整ORM(对象映射)的完整数据库访问库
  • ADODB – 数据库不可知的数据库访问库
  • 梨MDB2 – 另一个数据库访问库

完整的框架:

  • Zend框架
  • 锂电池框架
  • 代码点火器
  • (真的有更多,我不打算再打扰上市,因为这是另一个问题,所有在一起…)

真的,select是无止境的。 find你喜欢的东西,并坚持下去。 这真的会让你的生活更轻松

祝你好运!

$DBH不在范围内。 你要么在函数中定义$DBH为全局的:

 $DBH = new mysqli("host", "test", "123456", "dbname"); function selectInfo($limit, $offset){ global $DBH; $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); $stmt->bind_param("ii", $limit, $offset); $stmt->execute(); } 

或者ircmaxell在他的优秀答案中指出,它有一个返回$DBH的静态实例的函数。

尝试添加global $DBH; 在函数中,或将其添加到函数的参数。

 selectInfo($DBH); function selectInfo($DBH,$limit, $offset){ $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); $stmt->bind_param("ii", $limit, $offset); $stmt->execute(); } 

那很简单。 selectInfo()函数中不存在$DBH 。 在全局范围内定义的variables在函数内不可见,反之亦然。 阅读更多关于手册页上的variables范围 。

如何解决? 将该variables作为函数的parameter passing:

 $dbh = new MySQLi(...); function selectInfo(MySQLi $dbh, $limit, $offset) { $stmt = $dbh->prepare(...); ... } 

确保连接成功。

 $DBH = @new mysqli("host", "test", "123456", "dbname"); if ($DBH->connect_errno) { die('Connect Error: ' . $DBH->connect_errno); } 

要么

 $DBH = @mysqli_connect("host", "test", "123456", "dbname"); if (!$DBH ) { die('Connect Error: ' . mysqli_connect_errno()); } 

使$ DBH全局不健康…除了你可以让你的$ DBH在课堂上保护,并将其设置为空…并使用它..

 class PDOconnect extends PDO{ 

保护$ con = null;

  public function __construct(){ try { $this->con= new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD ); //our new PDO Object $this->con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT ); $this->con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING ); $this->con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); echo "hi.. you are connected succcessfully..."; }