Php 如何通过要在mysqli中使用的u构造返回数据库连接?

Php 如何通过要在mysqli中使用的u构造返回数据库连接?,php,mysql,database,mysqli,database-administration,Php,Mysql,Database,Mysqli,Database Administration,我的config.php文件如下所示: define ( 'DB_SERVER', 'localhost' ); define ( 'DB_USERNAME', 'admin' ); define ( 'DB_PASSWORD', 'password' ); define ( 'DB_DATABASE', 'database' ); class DB_Con { function __construct() { $con = mysqli_connect ( DB_SER

我的config.php文件如下所示:

define ( 'DB_SERVER', 'localhost' );
define ( 'DB_USERNAME', 'admin' );
define ( 'DB_PASSWORD', 'password' );
define ( 'DB_DATABASE', 'database' );
class DB_Con {
    function __construct() {
        $con = mysqli_connect ( DB_SERVER, DB_USERNAME, DB_PASSWORD ) or die ( 'Connection error -> ' . mysqli_error ($con) );
        mysqli_select_db ( $con, DB_DATABASE) or die ($con);
    }
}
我的State.php如下所示:

include_once 'config.php';
class State {

    public function __construct() {
        $db = new DB_con ();
    }

    public function GetStateId($statename) {
        $result = mysqli_query ( $con, "SELECT State_Id FROM state_master WHERE State_Name='$statename'" ) or die ( mysqli_error ($con) );
        $row = mysqli_fetch_assoc ( $result );
        return $row ['State_Id'];
    }
}
但是当我尝试调用函数时,它会给我一个警告
mysqli\u query()希望参数1是mysqli,State.php中给出的是null

我还在
State.php
中尝试了
$db->$con
而不是
$con
,但结果相同

有谁能告诉我如何在
State.php
中引用原始
$con
,以便在
mysqli.*
中使用?我正在尝试从
mysql.*
移动

class State {

    private $_mysqli;

    public function __construct($mysqli) {
        $this->_mysqli = $mysqli;
    }

    public function GetStateId($statename) {
        $result = $this->_mysqli->query("SELECT State_Id FROM state_master WHERE State_Name='$statename'" ) or die ( $this->_mysq );
        $row = $this->_mysqli->fetch_assoc ( $result );
        return $row ['State_Id'];
    }
}

$mysqli = new mysqli('hostname', 'username', 'password', 'database');
$state = new State($mysqli);
或者我想你可以用

$result = mysqli_query($this->_mysqli, "SELECT State_Id FROM state_master WHERE State_Name='$statename'");
但这不是好的做法

编辑:Siride有一个很好的观点,所以这里有一个解释

当您调用newstate()时,您基本上是在调用_construct()。因此,通过将$mysqli作为参数添加到_构造中,您可以通过参数传入它。您也可以通过在state中使用setMysqli函数来完成,并以这种方式传递它,而不是在实例化时传递,但这样您就知道您将始终拥有一个连接

至于为什么mysqli_查询需要$conn作为第一个参数。mysqli_query()只是围绕mysqli::query()展开,所以当它请求mysqli_query($conn,$sql)时,它实际上只是执行$conn->query($sql);在内部,所以你可以跳过这一步,自己做

当你在学习MyQuLi时,考虑一下你确实应该是安全的。此外,您还可以了解我是如何将mysqli存储为属性的

Modified config.php

define ( 'DB_SERVER', 'localhost' );
define ( 'DB_USERNAME', 'admin' );
define ( 'DB_PASSWORD', 'password' );
define ( 'DB_DATABASE', 'database' );
class DB_Con {
    private $con;
    function __construct() {
        global $con;
        $con = mysqli_connect ( DB_SERVER, DB_USERNAME, DB_PASSWORD ) or die ( 'Connection error -> ' . mysqli_error ($con) );
        mysqli_select_db ( $con, DB_DATABASE) or die ($con);

    }
    public function getConnection()
    {
        global $con;
        return $con;        
    }
}
    define ( 'DB_SERVER', 'localhost' );
    define ( 'DB_USERNAME', 'admin' );
    define ( 'DB_PASSWORD', 'password' );
    define ( 'DB_DATABASE', 'database' );
class DB_Con {
    private $con;
    function __construct() {        
        $this->con = mysqli_connect ( DB_SERVER, DB_USERNAME, DB_PASSWORD ) or die ( 'Connection error -> ' . mysqli_error ($con) );
        mysqli_select_db ($this->con, DB_DATABASE) or die ($con);
    }
    public function getConnection()
    {        
        return $this->con;
    }
}
修改的state.php

include 'config.php';
class State extends DB_Con{

    public function __construct() {
        $db = new DB_con ();
    }


    public function GetStateId($statename) {
        $con=  $this->getConnection();
        $result = mysqli_query ( $con, "SELECT State_Id FROM state_master WHERE State_Name='$statename'"  ) or die ( mysqli_error ($con) );
        $row = mysqli_fetch_assoc ( $result );
        $row ['State_Id'];
    }
}
include 'config.php';
class State {
    private $db;
    public function __construct() {
        $this->db = new DB_con ();
    }


    public function GetStateId($statename) {
        $con= $this->db->getConnection();
        $result = mysqli_query ( $con, "SELECT State_Id FROM state_master WHERE State_Name='$statename'"  ) or die ( mysqli_error ($con) );
        $row = mysqli_fetch_assoc ( $result );
        $row ['State_Id'];
    }
}
以上代码将起作用。我会告诉你另一条路。这是一个整洁的代码,你可以很容易地理解

修改的config.php

define ( 'DB_SERVER', 'localhost' );
define ( 'DB_USERNAME', 'admin' );
define ( 'DB_PASSWORD', 'password' );
define ( 'DB_DATABASE', 'database' );
class DB_Con {
    private $con;
    function __construct() {
        global $con;
        $con = mysqli_connect ( DB_SERVER, DB_USERNAME, DB_PASSWORD ) or die ( 'Connection error -> ' . mysqli_error ($con) );
        mysqli_select_db ( $con, DB_DATABASE) or die ($con);

    }
    public function getConnection()
    {
        global $con;
        return $con;        
    }
}
    define ( 'DB_SERVER', 'localhost' );
    define ( 'DB_USERNAME', 'admin' );
    define ( 'DB_PASSWORD', 'password' );
    define ( 'DB_DATABASE', 'database' );
class DB_Con {
    private $con;
    function __construct() {        
        $this->con = mysqli_connect ( DB_SERVER, DB_USERNAME, DB_PASSWORD ) or die ( 'Connection error -> ' . mysqli_error ($con) );
        mysqli_select_db ($this->con, DB_DATABASE) or die ($con);
    }
    public function getConnection()
    {        
        return $this->con;
    }
}
修改的state.php

include 'config.php';
class State extends DB_Con{

    public function __construct() {
        $db = new DB_con ();
    }


    public function GetStateId($statename) {
        $con=  $this->getConnection();
        $result = mysqli_query ( $con, "SELECT State_Id FROM state_master WHERE State_Name='$statename'"  ) or die ( mysqli_error ($con) );
        $row = mysqli_fetch_assoc ( $result );
        $row ['State_Id'];
    }
}
include 'config.php';
class State {
    private $db;
    public function __construct() {
        $this->db = new DB_con ();
    }


    public function GetStateId($statename) {
        $con= $this->db->getConnection();
        $result = mysqli_query ( $con, "SELECT State_Id FROM state_master WHERE State_Name='$statename'"  ) or die ( mysqli_error ($con) );
        $row = mysqli_fetch_assoc ( $result );
        $row ['State_Id'];
    }
}

您正在创建一个
DB\u con
实例,然后将其扔掉,然后将其
$DB
句柄扔掉。在这两种情况下,您都需要将其分配给属性
$this->con
不过,整个
DB_con
类包装是毫无意义的;只是让它成为一个函数。请添加解释,而不仅仅是一个代码转储。如果你那样做的话,我将取消我的反对票。我对你的答案有点困惑。我看到您在创建状态对象时传递了params。这是否意味着每次创建状态对象时都必须传递参数?如果是的话,那么config呢?是的,这意味着每次创建State时都必须传入mysqli对象。但是,您不必传入配置。如果您看看这个示例,您要做的是在创建状态之前在mysqli对象内部设置配置,然后传入对象本身,这样对象就已经有状态了。这也意味着您在页面上只创建了一个连接,而不是每个州都创建一个连接。请解释一下。谢谢@m3huL-添加了额外的代码,从中您可以轻松understand@m3huL-(仍在思考)谁倒下了(说出了答案:):)读第一个答案的评论@m3huL-我希望您能够理解第二段代码,无需解释:)