带有OOP的OOPS,PHP数据库连接

嘿,我正在开发与OOP PHP的数据库连接,我卡住了这个错误;

警告:mysqli_query()期望参数1是在第26行的C: Users ... function.php中给出的mysqli,null。

我是OOP的新手,因此非常感谢大家的帮助

<?php
    class MyClass{
        var $HOST = "localhost";
        var $USER = "user";
        var $PASS = "pass";
        var $DB = "image_blog";
        public $con;

        function _construct(){
            $this->host = $HOST;
            $this->user = $USER;
            $this->pass = $PASS;
            $this->db = $DB;

            $this->con = mysqli_connect($this->host, $this->user, $this->pass, $this->db);
        }

        public function query($sql)
        {
            $query = mysqli_query($this->con,$sql);
            return $query;
        }
   }

   $obj = new Myclass;
   echo $obj->query("SELECT * FROM posts");

你的构造函数的名字必须是__construct两个下划线,而不是一个。

你可以自己调试这类问题。 从错误中反向工作,首先在$this->conmysqli_query()的第一个参数var_dump()上执行var_dump() )。 这会告诉你$this->con没有被定义。 接下来,您将返回到您定义的位置并添加die()语句或类似语句,以查看该代码是否正在运行。 你会发现它不是。

从那里,你可以尝试从PHP文档中复制/粘贴已知的工作函数,然后你会发现构造函数可以工作。 你所要做的就是比较你的两个构造函数,并且很可能你会立即发现你的错误。


var $HOST = "localhost";
var $USER = "user";
var $PASS = "pass";
var $DB = "image_blog";

阅读这个答案,你在这里使用过时的语法来声明类属性(事实上,它们本身并不是变量)。 在你的构造函数中(其他人是正确的,缺少第一个下划线),你只是简单地引用未定义的局部变量,而不是属性本身。 这里的解决方案是:

  • _construct方法之前添加第二个下划线以使其成为__construct ,并且
  • 关于这些属性更改您的构造函数。
  • 我建议将变量作为参数传递给构造函数并设置它们(以便您可以执行new MyClass( $host, $user, $pass, $db) )。 我也会改变,而不是使用var关键字来声明这些属性:

    protected $host = 'host';
    // etc.
    

    另一个选择可能是将它们定义为常量,因为当前正在使用它们,它们永远无法改变:

    const HOST = 'host';
    

    您可以稍后参考它们:

    self::HOST
    

    以下是文档中的相关引用:

    为了保持与PHP 4的向后兼容性,PHP 5将仍然接受在属性声明中使用关键字var,而不是(或除了)public,protected或private。 但是,var不再是必需的。 在从5.0到5.1.3的PHP版本中,var的使用被认为已被弃用,并会发出E_STRICT警告,但是自PHP 5.1.3开始,它不再被弃用,并且不会发出警告。


    构造function __construct()以2个下划线function __construct()开头

    链接地址: http://www.djcxy.com/p/96565.html

    上一篇: OOPS with OOP, PHP database connection

    下一篇: get values from txt file in php