تحويل الخلية إلى mysqli - كيفية الحصول على كائن اتصال superglobal؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

واني اسعى الى تحويل رمز من الخلية إلى mysqli. يستخدم رمز لmysql_connect واحد في ملف الذي تم تضمينه من قبل كل ملف آخر.

وmysql_connect إرجاع معرف الرابط الخلية التي هي superglobal حتى تتمكن من الاعتماد على وجود اتصال قاعدة البيانات متوفرة في أي من الوظائف الخاصة بك.

ويبدو مع mysqli_connect هذا ليس هو الحال، الكائن عاد ليست العالمي.

هل هذا يعني أنني يجب أن تضيف: mysqli $ العالمي؛ في الجزء العلوي من كل وظيفة، أو هل هناك طريقة لجعلها superglobal؟

هل كانت مفيدة؟

المحلول

والاعتماد على حقيقة أن PHP سوف تستخدم آخر فتح الموارد الاتصال إذا لم تقم بتحديد واحد، وربما ليست فكرة جيدة جدا.
ماذا يحدث إذا لم يتغير التطبيق الخاص بك وتحتاج اتصالين، أو الاتصال لا توجد منتديات لذلك يبدو أنك بحاجة إلى القيام ببعض إعادة بيع ديون على أي حال.

وهنا حل مشابها لكارستن وترجع دائما نفس الكائن 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 بأنها أيضا علة التي تعاني من أن ينظر صالحة للاستعمال. العار حقا.

لإدخال بعض ووب لك ويحل مشكلتك، هل يمكن استخدام فئة مثل هذا:

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top