Я пытаюсь преобразовать код из mysql в mysqli. В коде используется один mysql_connect в файле, который включен в каждый другой файл.
mysql_connect возвращает идентификатор ссылки MySQL, который является суперглобальным, поэтому вы можете полагаться на наличие соединения с базой данных в любой из ваших собственных функций.
Похоже, что с mysqli_connect это не тот случай, возвращенный объект не является глобальным.
Означает ли это, что я должен добавить: global $ mysqli; в верхней части каждой функции, или есть способ сделать ее суперглобал?
Опираясь на то, что PHP будет использовать последний открытый ресурс соединения, если вы его не укажете, вероятно, не очень хорошая идея.
Что произойдет, если ваше приложение изменится и вам понадобится два подключения, или соединение не существует?
Похоже, вам все равно нужно сделать рефакторинг.
Вот решение, похожее на Karsten's, которое всегда возвращает тот же объект mysqli.
class DB { private static $mysqli; private function __construct(){} //no instantiation static function cxn() { if( !self::$mysqli ) { self::$mysqli = new mysqli(...); } return self::$mysqli; } } //use DB::cxn()->prepare(....
Обычно я выполняю функцию:
$mysqli = new mysqli(...); function prepare($query) { global $mysqli; $stmt = $msqyli->prepare($query); if ($mysqli->error()) { // do something } return $stmt; } function doStuff() { $stmt = prepare("SELECT id, name, description FROM blah"); // and so on }
и затем назовите это. Говоря это, я с тех пор покинул mysqli, потому что слишком запутан, чтобы считаться пригодным для использования. Позор действительно.
Чтобы представить вам некоторые проблемы и решить вашу проблему, вы можете использовать такой класс:
class MyDatabase { private static $_connection; public static function connect() { $mysqli = new mysqli(...); self::$_connection = $mysqli; } public static function getConnection() { return self::$_connection; } }
В вашем файле подключения к базе данных вы загрузите этот класс и выполните MyDatabase::connect();
один раз. Чтобы получить $ mysqli-соединение в любом месте вашего сценария, просто вызовите MyDatabase::getConnection();
,
Очень простой способ сделать это будет с фиксированным классом базы данных, просто чтобы сохранить объект соединения mysqli:
class Database { public static $connection; } Database::$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);
Затем вы можете получить доступ к нему обычным способом:
$sql = 'SELECT * FROM table'; $result = Database::$connection->query($sql); $result = mysqli_query(Database::$connection, $sql); echo 'Server info ' . mysqli_get_server_info(Database::$connection);