Как мне вернуть соединение с базой данных через __construct для использования в mysqli_ *?

У меня есть файл 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'];
}
}

Но когда я пытаюсь вызвать функцию GetStateId(), это дает мне предупреждение mysqli_query() expects parameter 1 to be mysqli, null given in State.php,

Я тоже пробовал $db->$con вместо $con в State.php но результат тот же.

Может кто-нибудь сказать мне, как я ссылаюсь на оригинал $con в State.php быть использованным в mysqli_*? Я пытаюсь уйти от mysql_*,

0

Решение

Модифицированный 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'];
}
}
-1

Другие решения

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 имеет хорошую точку зрения, так что вот объяснение.

Когда вы вызываете new State (), вы в основном вызываете __construct (). Таким образом, добавив $ mysqli в качестве параметра в __construct, вы можете передать его через параметр. Вы могли бы также сделать это с помощью функции setMysqli внутри состояния и передать ее таким образом, а не на создание экземпляра, но таким образом вы знаете, что у вас всегда будет соединение.

Что касается того, почему mysqli_query требует $ conn в качестве первого параметра. mysqli_query () просто оборачивается вокруг mysqli :: query (), поэтому, когда он запрашивает mysqli_query ($ conn, $ sql), он действительно просто выполняет запрос $ conn-> ($ sql); на внутренней стороне, так что вы можете просто пропустить шаг и сделать это самостоятельно.

Пока вы изучаете mysqli, учтите, что вам действительно следует связывание ваших параметров для обеспечения безопасности. Более того, вы можете прочитать о том, как я храню mysqli как свойство Вот

2

По вопросам рекламы [email protected]