Mysqli'nin mysql dönüştürme - superglobal bağlantı nesnesi nasıl?

4 Cevap php

I am trying to convert code from mysql to mysqli. The code uses a single mysql_connect in a file which is included by every other file.

mysql_connect kendi işlevlerinin herhangi mevcut bir veritabanı bağlantısı olan güvenebilirsiniz böylece bir süper küresel bir MySQL bağlantı tanıtıcısı döndürür.

Mysqli_connect ile bu durum böyle değil gibi görünüyor, döndürülen nesne küresel değildir.

Bu ben eklemek zorunda demek: global $ mysqli; Her işlevin üstünde, ya da bir süper küresel yapma bir yolu var mı?

4 Cevap

Relying on the fact that PHP will use the last opened connection resource if you don't specify one, is probably not a very good idea.
What happens if your application changes and you need two connections, or the connection is not there?
So it seems you need to do some refactoring anyway.

İşte Karsten hep aynı mysqli nesnesi döndüren benzer bir çözüm.

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(....

Ben genellikle bir işlevi yapmak:

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

ve o diyoruz. Söyleniyor, ben çünkü çok bug-basmış kullanılabilir kabul edilmesi olarak mysqli terk ettik. Gerçekten ayıp.

Size bazı oop tanıtmak ve sorunu çözmek için, böyle bir sınıf kullanabilirsiniz:

class MyDatabase
{
    private static $_connection;

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

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

In your database-connection file you would load this class and execute MyDatabase::connect(); once. To get the $mysqli-connection anywhere in your script, just call MyDatabase::getConnection();.

Bunu yapmak için çok basit bir şekilde sadece mysqli bağlantı nesnesini tutmak için, bir sabit veritabanı sınıf olacaktır:

class Database {
    public static $connection;
}

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

Sonra normal bir şekilde erişebilirsiniz:

$sql = 'SELECT * FROM table';
$result = Database::$connection->query($sql);
$result = mysqli_query(Database::$connection, $sql);
echo 'Server info ' . mysqli_get_server_info(Database::$connection);