OOPS与OOP,PHP数据库连接

时间:2014-09-08 16:26:01

标签: php oop mysqli

嘿伙计我正在使用OOP PHP开发数据库连接,而且我遇到了这个错误;

  

警告:mysqli_query()要求参数1为mysqli,在第26行的C:\ Users ... \ function.php中给出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");

5 个答案:

答案 0 :(得分:2)

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

您可以自己调试此类问题。从错误开始向后工作,您首先要var_dump() $this->con mysqli_query()的第一个参数。这将显示$this->con未定义。接下来,您将返回到您定义的位置并添加die()语句或类似内容,以查看该代码是否正在运行。你会发现它不是。

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

答案 1 :(得分:1)

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

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

  1. _construct方法之前添加第二个下划线以使其__construct
  2. 根据这些属性更改构造函数。
  3. 我建议将变量作为参数传递给构造函数并以这种方式设置它们(这样你就可以new MyClass( $host, $user, $pass, $db))。我也会更改,而不是使用var关键字来声明这些属性:

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

    另一种选择可能是将它们定义为常量,因为正如您目前使用它们一样,它们永远无法真正改变:

    const HOST = 'host';
    

    您可以稍后引用它们:

    self::HOST
    

    以下是documentation的相关引用:

      

    为了保持与PHP 4的向后兼容性,PHP 5将会   仍然接受在属性声明中使用关键字var   而不是(或除了)公共,受保护或私人。然而,   不再需要var。在从5.0到5.1.3的PHP版本中   使用var被认为已弃用,并将发布E_STRICT   警告,但自PHP 5.1.3以来,它不再被弃用,也没有   发出警告。

答案 2 :(得分:0)

构造函数以2个下划线function __construct()

开头

答案 3 :(得分:0)

像其他人说的那样,构造函数以2个下划线开头, 我正在使用以下课程及其为我工作,

class maindb_con
{
    private $hostname;
    private $username;
    private $password;
    private $dbname;
    private $con;

    function __construct()
    {
        $this->hostname = "**********";
        $this->username = "**********";
        $this->password = "**********";
        $this->dbname   = "**********";
        if(!mysql_connect($this->hostname, $this->username, $this->password,$this->dbname))
        {
            echo'Error:: 1001 Couldnot connect to database. Please update hostname, username and password';
        }
        else
            $this->con=mysql_connect($this->hostname, $this->username, $this->password);

    }
    /*function maindb_con($hname, $uname, $pwd, $dbname)
    {
        $this->hostname = $hname;
        $this->username = $uname;
        $this->password = $pwd;
        $this->dbname = $dbname;
    }*/
    function get_con()
    {
        mysql_select_db($this->dbname,$this->con);
        return $this->con;
    }
    function get_dbname()
    {
        return $this->dbname;
    }
    public function __destruct()
    {
        mysql_close($this->con);
    }
} 

并且您可以添加以下方法来运行查询并获取结果,如果查询无法按需要运行,则添加false

public function runQuery($query)
    {
        //echo "query on runQuery(): ".$query;
        if($result=mysql_query($query,$this->con)) //or die("couldnt run mysql_query on runQuery for ".$query)
            return $result;
        return false;
    }

或此类可以按以下方式使用

$dbcon=new maindb_con();
        $con=$dbcon->get_con();
        //echo "query on runQuery(): ".$query;
        if($result=mysql_query($query,$con))
......

请访问here,它将为您提供PHP的高级编程,并提供反馈....

答案 4 :(得分:0)

安全级别更改1

 define("DB_HOST", 'yourhostaname');  
    define("DB_USER", 'dbusername');  
    define("DB_PASSWORD", 'dbpassword');  
    define("DB_DATABSE", 'databasename');

安全级别更改2

对受保护的成员变量公开。

1)您的数据库连接代码是非OOP的过程样式

OOP风格:$ this-> con = new mysqli($ this-> host,$ this-> user,$ this-> pass,$ this-> db)

2)您应该更改构造函数__construct()

3)检查条件($ this-> con-> connect_error)是否死了('Database error->'。$ this-> con-> connect_error);

4)更改echo $ obj-> query(“ SELECT * FROM posts”);到print_r($ obj-> query(“ SELECT * FROM posts”));或var_dumb 5)

public function query()
    {

        return $this->con;

    }

6)obj->query("SELECT * FROM posts") or die(obj->error);