У меня есть файл 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_*
,
Модифицированный 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'];
}
}
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 как свойство Вот