2014-11-24 48 views
0

我有这样我的config.php文件:如何通过__construct返回数据库连接以用于mysqli_ *?

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']; 
    } 
} 

但是当我尝试调用一个函数GetStateId(),它给了我一个警告mysqli_query() expects parameter 1 to be mysqli, null given in State.php

我也试过$db->$con而不是$conState.php但结果相同。

有谁能告诉我如何参考原始$conState.php用于mysqli_*?我试图从mysql_*移动。

+1

你创建一个'DB_con'实例,然后把它扔掉,之后便将其'$ db'处理掉。在这两种情况下,您都需要将它分配给一个属性'$ this-> con'。 - 虽然整个'DB_con'类包装是毫无意义的;只是让它成为一个功能。 – mario 2014-11-24 05:16:48

回答

-1

修改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;   
    } 
} 

修改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']; 
    } 
} 

上面的代码将工作读了。我会告诉你另一种方式。这是一个整洁的代码,你可以很容易理解。

修改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() {   
     $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 { 
    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']; 
    } 
} 
+0

为什么是负面投票?代码中的任何问题? – 2014-11-24 07:08:10

+0

请解释一下。谢谢! – Mehulkumar 2014-11-24 07:22:37

+0

@ m3huL - 额外添加了代码,从中可以轻松了解 – 2014-11-24 07:36:59

2
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有一个好点的,所以这里的解释。

当你调用新的State()时,你基本上调用了__construct()。所以通过将$ mysqli作为参数添加到__construct中,您可以通过参数传递它。你也可以通过setMysqli函数内部状态来完成它,并以那种方式传递它而不是实例化,但这样你就知道你总是有一个连接。

至于为什么mysqli_query需要$ conn作为第一个参数。 mysqli_query()只是包装mysqli :: query(),所以当它要求mysqli_query($ conn,$ sql)时,它实际上只是执行$ conn-> query($ sql);在里面,所以你可以跳过这一步,自己动手。

当你在学习mysqli时,考虑到你的安全性应该是binding your params。更进一步,你可以在我如何存储的mysqli作为属性here

+2

请添加说明,而不仅仅是代码转储。如果你这样做,我会删除我的downvote。 – siride 2014-11-24 05:18:39

+0

你的权利,我没有帮助,我的不好 – 2014-11-24 05:23:26

+0

我有点困惑你的答案。我看到你在创建状态对象时通过了params。这是否意味着我每次创建状态对象都必须通过params?如果是这样,那么配置怎么样? – Mehulkumar 2014-11-24 06:36:58