スーパーグローバル接続オブジェクトを取得する方法 - mysqliのためにMySQLを変換しますか?
質問
私はmysqliのにMySQLからのコードを変換しようとしています。 コードは、他のすべてのファイルによって含まれているファイル内の単一のにmysql_connectを使用します。
あなたがあなた自身の関数のいずれかで利用可能なデータベース接続を持つに頼ることができるようにスーパーグローバルであるMySQLのリンク識別子を返すにmysql_connectます。
これは、mysqli_connectでこれが当てはまらないように、返されたオブジェクトはグローバルではないに見えます。
私は追加する必要があり、この意味は:グローバルの$ mysqliのを。すべての関数の上部に、またはそのスーパーグローバル作る方法はありますか?
解決
あなたがいずれかを指定しない場合、PHPは最後に開いた接続リソースを使用するという事実に頼って、おそらく非常に良いアイデアではありません。
お使いのアプリケーションの変更とあなたが2つの接続を必要とする、または接続がない場合はどうなりますか?
だから、あなたはとにかく、いくつかのリファクタリングを行う必要がありそうです。
ここでは、常に同じ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(....
他のヒント
私は通常の関数を作成します:
$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
}
と、そのを呼び出します。それは、私は以来、あまりにもバグだらけ使用可能考慮されるべきであるとしてmysqliのを放棄してきた、言われています。恥本当にます。
あなたにいくつかのOOPを紹介し、あなたの問題を解決するために、あなたはこのようなクラスを使用することができます:
class MyDatabase
{
private static $_connection;
public static function connect()
{
$mysqli = new mysqli(...);
self::$_connection = $mysqli;
}
public static function getConnection()
{
return self::$_connection;
}
}
データベース接続のファイルでは、このクラスをロードし、一度MyDatabase::connect();
を実行します。
どこでもあなたのスクリプト内の$ mysqliの接続を取得するには、ちょうどMyDatabase::getConnection();
を呼び出します。
これを行うには非常に単純な方法は、単にmysqliの接続オブジェクトを保持するために、固定されたデータベースのクラスになります:
class Database {
public static $connection;
}
Database::$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);
そして、あなたは、通常の方法でそれにアクセスすることができます:
$sql = 'SELECT * FROM table';
$result = Database::$connection->query($sql);
$result = mysqli_query(Database::$connection, $sql);
echo 'Server info ' . mysqli_get_server_info(Database::$connection);