Conversione da mysql a mysqli: come ottenere l'oggetto di connessione superglobal?
Domanda
Sto cercando di convertire il codice da mysql a mysqli. Il codice utilizza un singolo mysql_connect in un file incluso in ogni altro file.
mysql_connect restituisce un identificatore di collegamento MySQL che è un superglobal, quindi puoi fare affidamento sulla disponibilità di una connessione al database in una qualsiasi delle tue funzioni.
Sembra che con mysqli_connect non sia così, l'oggetto restituito non è globale.
Questo significa che devo aggiungere: global $ mysqli; nella parte superiore di ogni funzione, o c'è un modo per renderlo un superglobal?
Soluzione
Basarsi sul fatto che PHP utilizzerà l'ultima risorsa di connessione aperta se non ne specifichi una, probabilmente non è una buona idea.
Cosa succede se l'applicazione cambia e sono necessarie due connessioni o la connessione non è presente?
Quindi sembra che tu debba fare qualche refactoring comunque.
Ecco una soluzione simile a quella di Karsten che restituisce sempre lo stesso oggetto 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(....
Altri suggerimenti
Di solito faccio una funzione:
$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 quindi chiamalo. Detto questo, da allora ho abbandonato mysqli perché troppo pieno di bug per essere considerato utilizzabile. Peccato davvero.
Per presentarti un po 'di oop e risolvere il tuo problema, puoi usare una classe come questa:
class MyDatabase
{
private static $_connection;
public static function connect()
{
$mysqli = new mysqli(...);
self::$_connection = $mysqli;
}
public static function getConnection()
{
return self::$_connection;
}
}
Nel file di connessione al database caricare questa classe ed eseguire MyDatabase::connect();
una volta.
Per ottenere $ mysqli-connection in qualsiasi punto del tuo script, chiama MyDatabase::getConnection();
.
Un modo molto semplice per farlo sarebbe con una classe di database fissa, solo per contenere l'oggetto di connessione mysqli:
class Database {
public static $connection;
}
Database::$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);
Quindi puoi accedervi come di consueto:
$sql = 'SELECT * FROM table';
$result = Database::$connection->query($sql);
$result = mysqli_query(Database::$connection, $sql);
echo 'Server info ' . mysqli_get_server_info(Database::$connection);