在PHP类中使用Mysqli的问题

时间:2013-09-02 17:40:28

标签: php oop mysqli

我是面向对象PHP的新手,并且遇到以下代码问题。使用Mysqli的数据库查询在类中不起作用,但在外部工作正常。所以我的问题是,我做错了什么?

class webFile {

    private $sql, $query;

    function __construct() {
        $sql = new mysqli('host','user','pass','dbname');
    }

    function doQuery() {
        $queryText = "SELECT * FROM blog_posts WHERE number = '2'";
        if($query = $this->sql->query($queryText)) {
            $results = $query->fetch_array();
            return $results['post_id'];
        } else {
            return "Error";
        }
    }
}

$object = new webFile();
echo $object->doQuery();

服务器错误日志显示“PHP致命错误:在非对象上调用成员函数查询()”......我是否犯了另一个愚蠢的错误?我在网上看过,但找不到与此问题相关的任何内容。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:6)

在构造函数中,将mysqli设置为局部变量$sql

将构造函数更改为

 function __construct() {
        $this->sql = new mysqli('host','user','pass','dbname');
    }

答案 1 :(得分:0)

正如Miguelo所说,问题是你在构造函数中写了 $ sql而不是$ this-> sql

但还有另一个问题。

如您所见,您的代码中有

private $sql, $query

我认为您不想在课程中的函数之间使用 $ query ,因此我会将其删除并离开:

private $sql;

但是如果你想在 函数之间使用它,那么 函数doQuery() 应该是这样的:

function doQuery() {
    $queryText = "SELECT * FROM blog_posts WHERE number = '2'";
    if($this->query = $this->sql->query($queryText)) {
        $results = $this->query->fetch_array();
        return $results['post_id'];
    } else {
        return "Error";
    }
}

答案 2 :(得分:0)

这是一个PHP问题。截至本文,PHP不支持嵌套类。在7.0版本中有可能会发生变化,但据我所知,它还没有出现。

我认为你最好的选择是简单地使用你的类扩展MySQLi类,如下所示:

 class webFile extends mysqli {

你可能想把它锁定一些。说到这一点,请注意MySQLi的构造不会被你自己的__construct()方法自动调用,所以你可能需要解决这个问题。

您还可以使用MySQLi的程序功能来实现所需的结果,而无需扩展MySQLi的类,这是我在查找目前有超过2600个视图且对您的问题没有明确正确答案的帖子时所关注的。

PHP的面向对象并不像某些人那样强大,希望这会在未来几年内发生变化。 PHP 7.0支持匿名类实例化,这表明它可能很快支持嵌套类。

编辑:我在PHP.net上发现了一个涵盖覆盖构造的链接。显然你自己的构造不会覆盖MySQLi,但你必须手动调用它,如:

 parent::__construct($host,$user,$pass,$db);

http://php.net/manual/en/mysqli.construct.php

答案 3 :(得分:-1)

在php 5.3中,在类构造函数中初始化mysqli对象会破坏代码。我必须将mysqli对象作为参数传递给类才能工作。 这是无效的:

function __construct() {
     $this->sql = new mysqli('host','user','pass','dbname');
 }

但这会奏效:

function __construct($mysqli) {
     $this->sql = new mysqli('host','user','pass','dbname');
 }

其中$ mysqli参数可以是

new mysqli('host','user','pass','dbname');

从执行的php脚本传递。 mysqli类似乎有一个问题,我希望他们能在php 7中解决这个问题。 另一项工作是将其扩展为php手册页中的大纲。

答案 4 :(得分:-2)

出于某种原因,似乎您的$ SQL变量未被设置为MySQLi对象的实例。

我自己并不经常使用MySQLi;因为我对mysql_connect优先。

我建议如下:

$this->sql = mysql_connect($host,$user,$pass) or die( mysql_error());
$this->db = mysql_select_db($db) or die( mysql_error());

或者如果您设置了MySQLi对象 -

try
{
    $this->sql = new mysqli('host','user','pass','dbname');
} 
catch(Exception $e)
{
    // throw another exception or something
}

假设连接引发错误 - 这会让您知道它已失败并允许您进行更正。