在非对象错误上调用成员函数prepare()

时间:2010-09-05 22:38:53

标签: mysqli php

这是我用来将数据库句柄传递给我的类的代码:

$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($db->connect_error)
    die('MySQL connection error (' . $db->connect_errno . ') ' . $db->connect_error);

$linkgen = new Linkgen($db);
echo $linkgen->getLinksLeft();

这是Linkgen类中的代码:

class Linkgen {
    private $db; // our database handle
    private $linksLeft;

    function __contruct($db)
    {
        $this->db = $db;
    }

    function getLinksleft()
    {
        $ip = $_SERVER['REMOTE_ADDR'];
        $q = $this->db->prepare("SELECT links_left FROM `limits` WHERE ip=?");
        $q->bind_param("s", $ip);
        $q->execute();
        $q->bind_result($this->linksLeft);
        $q->fetch();
        printf("%i links left", $this->linksLeft);
        $q->close();
    }
}

出于某种原因,当我调用getLinksLeft方法时,我得到了非对象错误。我无法理解这一点,因为从我所看到的,我正确地引用了数据库句柄。

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

为什么不扩展你的对象以成为mysqli的一部分?

class Linkgen extends mysqli
{
    private $_linksLeft;

    function __construct()
    {
        parent::__construct(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    }

   function getLinksleft()
   {
        $ip = $_SERVER['REMOTE_ADDR'];
        $q = $this->prepare("SELECT links_left FROM `limits` WHERE ip=?");
        $q->bind_param("s", $ip);
        $q->execute();
        $q->bind_result($this->_linksLeft);
        $q->fetch();
        printf("%i links left", $this->_linksLeft);
        $q->close();
    }
    //...
}

//Usage:
$Linkgen = new Linkgen();
echo $Linkgen->getLinksLeft();

如果您仍然希望修复错误,那么您将错过拼写__construct;)

答案 1 :(得分:0)

这是因为$db类中的Linkgen为null或未设置。您需要在调用getLinksleft()之前进行检查。