Conversion de mysql en mysqli - comment obtenir un objet de connexion superglobal?

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

  •  20-08-2019
  •  | 
  •  

Question

J'essaie de convertir le code de mysql en mysqli. Le code utilise un seul mysql_connect dans un fichier qui est inclus par tous les autres fichiers.

mysql_connect renvoie un identifiant de lien MySQL qui est superglobal. Vous pouvez donc vous fier à une connexion à la base de données disponible dans vos propres fonctions.

On dirait que avec mysqli_connect ce n'est pas le cas, l'objet renvoyé n'est pas global.

Est-ce que cela signifie que je dois ajouter: global $ mysqli; au sommet de chaque fonction, ou existe-t-il un moyen d'en faire un superglobal?

Était-ce utile?

La solution

Compter sur le fait que PHP utilisera la dernière ressource de connexion ouverte si vous n'en spécifiez pas, n'est probablement pas une très bonne idée.
Que se passe-t-il si votre application change et que vous avez besoin de deux connexions ou si la connexion n'existe pas?
Il semble donc que vous ayez besoin de refactorer quand même.

Voici une solution similaire à celle de Karsten qui renvoie toujours le même objet 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(....

Autres conseils

Je fais habituellement une fonction:

$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
}

puis appelez ça. Cela étant dit, j'ai depuis abandonné mysqli, trop corrigé par les bogues pour être considéré comme utilisable. Honte vraiment.

Pour vous présenter un oop et résoudre votre problème, vous pouvez utiliser une classe comme celle-ci:

class MyDatabase
{
    private static $_connection;

    public static function connect()
    {
        $mysqli = new mysqli(...);
        self::$_connection = $mysqli;
    }

    public static function getConnection()
    {
        return self::$_connection;
    }
}

Dans votre fichier de connexion à la base de données, vous devez charger cette classe et exécuter MyDatabase::connect(); une fois. Pour obtenir la $ mysqli-connection n'importe où dans votre script, appelez simplement MyDatabase::getConnection();.

Un moyen très simple de faire cela serait avec une classe de base de données fixe, juste pour contenir l'objet de connexion mysqli:

class Database {
    public static $connection;
}

Database::$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);

Ensuite, vous pouvez y accéder de la manière habituelle:

$sql = 'SELECT * FROM table';
$result = Database::$connection->query($sql);
$result = mysqli_query(Database::$connection, $sql);
echo 'Server info ' . mysqli_get_server_info(Database::$connection);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top