Mysqli Установить соединение в одной функции и использовать его для SQL-запросов в другой функции

Я пытался сделать класс базы данных похожим на то, что есть в большинстве cms, поэтому я делаю соединение в одной функции и возвращаю объект соединения, который будет использоваться для запросов в других функциях в классе.

<?php


class my_database {

    var $host = 'localhost';
    var $user = 'prince';
    var $pass = 'abcd1234wxyz';
    var $db = 'world';

    function __construct() {

        $this->db_connect();

    }

    function db_connect() {

        $mysqli = mysqli_connect($host,$user,$pass,$db);

        /* check connection */
        if (!$mysqli) {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }

        return $mysqli;
    }

    function query($query) {
        $mysqli = $this->db_connect();


        if ($result = mysqli_query($mysqli, $query)) {

            while ($row = mysqli_fetch_row($result)) {
                echo "<pre>";
                print_r($row);
                echo "</pre>";
            }


            mysqli_free_result($result);
        }  else
            echo "fails"; exit;

    }


}
$database  = new my_database;

/*************** Class Ends ****************************/

function get_results() {

    global $database;
    $database->query("select * from city limit 10");

}
get_results();
?>

Это всегда вывод failsЯ новичок в Oops & mysqli, может быть, я упускаю что-то очевидное. Пожалуйста помоги!

2 ответа

Ваш класс во многом плохая практика. Прежде всего, вы используете старый синтаксис PHP4, который уже не поддерживается. Настоятельно рекомендуется переключиться на PHP5 ( http://de2.php.net/manual/en/language.oop5.php).

Во-вторых, я бы использовал PDO, а не MySQLi. Однако, какой бы из них вы ни использовали, они уже имеют объектно-ориентированный интерфейс. Так зачем использовать процедурный? -> http://de2.php.net/manual/en/class.mysqli.php (MySQLi)

http://de2.php.net/manual/en/book.pdo.php (PDO)

Что касается вашей реализации, есть и некоторые действительно плохие практики. Просто присмотритесь к функции db_connect(): она вызывается всякий раз, когда вы используете метод query(), то есть вы создаете соединение каждый раз, когда делаете запрос! Это бесполезно, вам нужно только одно соединение на запрос! Решением этого является свойство объекта, которое содержит открытое соединение с базой данных.

Кроме того, в вашем коде внизу вы нарушаете некоторые ключевые концепции ООП, когда используете "глобальный". Вместо этого используйте Dependency Injection, что означает буквальное внедрение объекта $database в вашу функцию ( function(my_database $db) {}).

Существует множество реализаций того, что вы делаете в Интернете, просто используйте Google;)

Несколько вопросов:

  • Вы должны получить доступ к переменным экземпляра как $this->varname. (например, при подключении вы должны использовать $this->host...)
  • Вы должны получить доступ к $mysqli как к переменной экземпляра $ this-> mysqli.

(В противном случае есть много свободного слоя БД для php. Например, adodb.)

Другие вопросы по тегам