Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP类中使用Mysqli的问题_Php_Oop_Mysqli - Fatal编程技术网

在PHP类中使用Mysqli的问题

在PHP类中使用Mysqli的问题,php,oop,mysqli,Php,Oop,Mysqli,我是面向对象PHP新手,对以下代码有问题。使用Mysqli的数据库查询在类内不起作用,但在类外可以正常工作。所以我的问题是,我做错了什么 class webFile { private $sql, $query; function __construct() { $sql = new mysqli('host','user','pass','dbname'); } function doQuery() { $queryText

我是面向对象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致命错误:对非对象调用成员函数query()”。。。我又犯了一个愚蠢的错误吗?我在网上查过了,但是找不到任何与这个问题相关的东西。任何帮助都将不胜感激。

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

将构造函数更改为

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

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

将构造函数更改为

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

出于某种原因,$SQL变量似乎没有设置为MySQLi对象的实例

我个人并不经常使用MySQLi;因为我更喜欢mysql\u 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
}

假设连接抛出错误-这将让您知道它已失败,并允许您进行更正。

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

我个人并不经常使用MySQLi;因为我更喜欢mysql\u 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
}

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

正如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";
    }
}

正如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";
    }
}

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

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

 class webFile extends mysqli {
你可能想把它锁起来。说到这里,请注意MySQLi的构造不会被您自己的_construct()方法自动调用,因此您可能需要解决这个问题

您还可以使用MySQLi的过程功能来实现所需的结果,而无需扩展MySQLi的类。当我发现这篇文章时,我正在研究这个类,它目前有2600多个视图,并且对您的问题没有绝对正确的答案

PHP的面向对象并不像某些面向对象那样健壮,希望在未来几年内这种情况会有所改变。PHP7.0支持匿名类实例化,这表明它可能很快就会支持嵌套类

编辑:我在PHP.net上找到了一个覆盖覆盖该构造的链接。显然,您自己的构造不会覆盖MySQLi,但您必须手动调用它,如中所示:

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

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

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

 class webFile extends mysqli {
你可能想把它锁起来。说到这里,请注意MySQLi的构造不会被您自己的_construct()方法自动调用,因此您可能需要解决这个问题

您还可以使用MySQLi的过程功能来实现所需的结果,而无需扩展MySQLi的类。当我发现这篇文章时,我正在研究这个类,它目前有2600多个视图,并且对您的问题没有绝对正确的答案

PHP的面向对象并不像某些面向对象那样健壮,希望在未来几年内这种情况会有所改变。PHP7.0支持匿名类实例化,这表明它可能很快就会支持嵌套类

编辑:我在PHP.net上找到了一个覆盖覆盖该构造的链接。显然,您自己的构造不会覆盖MySQLi,但您必须手动调用它,如中所示:

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

在PHP5.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类似乎有一个问题,我希望他们能在php7中解决这个问题。
另一个解决方法是将其扩展为php手册页面中的大纲。

在PHP5.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类似乎有一个问题,我希望他们能在php7中解决这个问题。
另一个解决方法是将其扩展为php手册页面中的大纲。

所有mysql_*函数都不受欢迎。很抱歉,php文档中没有最新的内容-我不知道这意味着它不是一个有效的解决方案。谢谢你往下说。答案是正确的,但你把他送进了一条封闭的道路,我自己也认为这是一条崎岖不平的道路,不太可能