Convertendo mysql para mysqli - como obter objeto de conexão superglobal?
Pergunta
Eu estou tentando converter o código do MySQL para mysqli. O código usa um único mysql_connect em um arquivo que está incluído por qualquer outro arquivo.
mysql_connect retorna um identificador de conexão MySQL que é uma superglobal para que você possa confiar em ter uma conexão de banco de dados disponível em qualquer uma das suas próprias funções.
Parece que com mysqli_connect este não é o caso, o objeto retornado não é global.
Isso significa que eu tenho que adicionar: $ mysqli global; no topo de cada função, ou há uma maneira de torná-lo uma superglobal?
Solução
Baseando-se no fato de que o PHP irá usar o último recurso de conexão aberta se você não especificar um, provavelmente não é uma idéia muito boa.
O que acontece se o seu aplicativo muda e você precisa de duas conexões, ou a conexão não está lá?
Assim, parece que você precisa fazer alguma refatoração de qualquer maneira.
Aqui está uma solução semelhante à Karsten do que sempre retorna o mesmo objeto 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(....
Outras dicas
Eu costumo fazer uma função:
$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
}
e, em seguida, chamar isso. Dito isto, tenho uma vez abandonada mysqli como sendo demasiado cheia de defeitos para ser considerado utilizável. Pena realmente.
Para introduzir algum oop para você e resolver o seu problema, você pode usar uma classe como este:
class MyDatabase
{
private static $_connection;
public static function connect()
{
$mysqli = new mysqli(...);
self::$_connection = $mysqli;
}
public static function getConnection()
{
return self::$_connection;
}
}
Em seu arquivo de banco de dados de conexão que você iria carregar esta classe e executar MyDatabase::connect();
uma vez.
Para obter a qualquer lugar mysqli-conexão $ em seu script, apenas MyDatabase::getConnection();
chamada.
Uma maneira muito simples de fazer isso seria com uma classe de banco de dados fixa, apenas para manter o objeto de conexão mysqli:
class Database {
public static $connection;
}
Database::$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);
Em seguida, você pode acessá-lo nos caminhos normais:
$sql = 'SELECT * FROM table';
$result = Database::$connection->query($sql);
$result = mysqli_query(Database::$connection, $sql);
echo 'Server info ' . mysqli_get_server_info(Database::$connection);