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

StackOverflow https://stackoverflow.com/questions/487375

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Вот решение, похожее на решение Карстена, которое всегда возвращает один и тот же объект 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top