调用一个非对象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..."; }