OOPS与OOP,PHP数据库连接


OOPS with OOP, PHP database connection

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

警告:mysqli_query()要求参数1为mysqli,在C:''Users中给定null。。。''第26行的function.php。

我是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()。这将显示$this->con未定义。接下来,您将返回到定义和添加die()语句或类似语句的位置,看看该代码是否正在运行。你会发现事实并非如此。

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

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

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

  1. _construct方法之前添加第二个下划线,使其成为__construct,并且
  2. 根据这些属性更改构造函数

我建议将变量作为参数传递给构造函数,并以这种方式设置它们(这样就可以执行new MyClass( $host, $user, $pass, $db))。我也会更改,而不是使用var关键字,声明这些属性如下:

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

另一种选择是将它们定义为常量,因为当您当前使用它们时,它们永远不会真正改变:

const HOST = 'host';

您可以稍后将其引用为:

self::HOST

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

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

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

正如其他人所说,构造函数以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))
......

请访问这里,它将为您提供PHP高级oop编程,并提供反馈。。。。

安全级别更改1

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

安全级别更改2

public到protected成员变量。

1) 您的数据库连接代码是程序样式,不适用于OOP

OOP风格:$this->con=新的mysqli($this->主机,$this->用户,$this->通行证,$this->db)

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

3) 如果($this->con->connect_error)死亡('数据库错误->'.$this->con->connect_error),则检查条件;

4) 更改echo$obj->query("SELECT*FROM posts");打印_r($obj->query("SELECT*FROM posts"));OR var_dumb5)

public function query()
    {
        return $this->con;
    }

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