Преобразование mysql в mysqli - как получить объект суперглобального соединения? - PullRequest
3 голосов
/ 28 января 2009

Я пытаюсь конвертировать код из mysql в mysqli. Код использует единственное mysql_connect в файле, который включается в любой другой файл.

mysql_connect возвращает идентификатор ссылки MySQL, который является суперглобальным, поэтому вы можете рассчитывать на то, что соединение с базой данных будет доступно в любой из ваших собственных функций.

Похоже, что с mysqli_connect это не так, возвращаемый объект не является глобальным.

Значит ли это, что я должен добавить: global $ mysqli; в верхней части каждой функции, или есть ли способ сделать ее суперглобальной?

Ответы [ 4 ]

5 голосов
/ 28 января 2009

Полагаться на то, что PHP будет использовать последний открытый ресурс соединения, если вы его не указали, вероятно, не очень хорошая идея.
Что произойдет, если ваше приложение изменится, и вам понадобятся два соединения, или соединение отсутствует?
Похоже, вам все равно нужно провести рефакторинг.

Вот решение, подобное Karsten, которое всегда возвращает один и тот же объект 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(....
3 голосов
/ 28 января 2009

Я обычно делаю функцию:

$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 как слишком загруженного, чтобы его можно было использовать. Стыд действительно.

0 голосов
/ 29 октября 2013

Очень простой способ сделать это - использовать фиксированный класс базы данных, просто для хранения объекта подключения 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);
0 голосов
/ 28 января 2009

Чтобы познакомить вас и решить вашу проблему, вы можете использовать такой класс:

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();.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...