Conversione da mysql a mysqli: come ottenere l'oggetto di connessione superglobal?

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

  •  20-08-2019
  •  | 
  •  

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?

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top