от MySQL до PDO - запутался в том, когда и где - PullRequest
0 голосов
/ 26 февраля 2011

Я пытаюсь перейти от построения строк запроса и вызова mysql_query() и использовать PDO. Я прочитал несколько учебных пособий и понимаю базовый процесс подготовки оператора и присвоения значений заполнителям.

Что я не понимаю, так это как интегрировать эту новую технику в мое существующее веб-приложение.

Позвольте мне объяснить:

В настоящее время у меня есть init.php, который требуется для каждой страницы. Он содержит базу данных U / P и открывает соединение с базой данных. С этим загруженным я могу перебрасывать запросы влево и вправо, волей и неволей, куда угодно, без дальнейших размышлений.

PDO кажется мне гораздо более преднамеренным подходом. Я все еще вставляю все обработчики U / P и соединения в мой файл инициализации? Могу ли я просто работать со своими сценариями и заменять запросы один-на-один инструкциями PDO?

Извините за простой вопрос!

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

Для чего это стоит, у меня была такая же проблема, и вот как я подошел к ней.Я разделил функции базы данных на два разных класса: База данных и Запрос.Я настраиваю и открываю базу данных в моей функции init, а затем вызываю экземпляры моего класса Query по всей странице, закрывая запросы каждый раз, когда я закончу.Наконец, я закрываю базу данных.

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

Класс базы данных:

<?php
    class Database {

        private $db, $dbserver, $dbport, $dbname, $dbuser, $dbpassword;

        //----------------------------------------------------------------------------------------------------------
        //Function: __construct()
        //----------------------------------------------------------------------------------------------------------
        public function __construct($idbserver, $idbport, $idbname, $idbuser, $idbpassword) 
        {

        $this->dbserver = $idbserver;
        $this->dbport = $idbport;
        $this->dbname = $idbname;
        $this->dbuser = $idbuser;
        $this->dbpassword = $idbpassword;

        }

        //----------------------------------------------------------------------------------------------------------
        //Function: openDatabase()
        //----------------------------------------------------------------------------------------------------------
        public function openDatabase()
        {

        /* Create a new user db object with persistent database connection parameters */
        try {
            $this->db = new PDO("mysql:host=".$this->dbserver.";dbname=".$this->dbname.";port=".$this->dbport, $this->dbuser, $this->dbpassword, array(
                PDO::ATTR_PERSISTENT => true
                )); 
            return true;
            } catch (PDOException $e) {
                print "Error!: " . $e->getMessage() . "<br/>";
                die();
            }

        }

        //----------------------------------------------------------------------------------------------------------
        //Function: getDB
        //----------------------------------------------------------------------------------------------------------
        public function getDB()
        {

        //return the database
        return $this->db;

        }

        //----------------------------------------------------------------------------------------------------------
        //Function: getDBName
        //----------------------------------------------------------------------------------------------------------
        public function getDBName()
        {

        //return the database
        return $this->dbname;

        }




        //----------------------------------------------------------------------------------------------------------
        //Function: closeUserDatabase
        //----------------------------------------------------------------------------------------------------------
        public function closeDatabase()
        {

        //close the database
        $this->db=null;
        }



    }
?>

Тогда мой класс запросов:

<?php
    class Query {

        private $db, $sql, $qresult;

        //----------------------------------------------------------------------------------------------------------
        //Function: __construct
        //----------------------------------------------------------------------------------------------------------
        public function __construct($idb, $isql) 
        {

        $this->db = $idb;
        $this->sql = $isql;

        }

        //----------------------------------------------------------------------------------------------------------
        //Function: openQuery
        //----------------------------------------------------------------------------------------------------------
        public function openQuery($param) 
        {

            /* assemble and run a query and return a result object */

            //prepare the sql statement
            //get the db object

            $tempdb= $this->db->getDB();
            $this->qresult = $tempdb->prepare($this->sql);

            //bind parameters to the prepared statement
            foreach ($param as $key => $value) {
                $this->qresult->bindValue($key,$value);
                }

            return $this->qresult->execute();

        }

        //----------------------------------------------------------------------------------------------------------
        //Function: fetchAssociative
        //----------------------------------------------------------------------------------------------------------
        public function fetchAssociative() 
        {

        return $this->qresult->fetch(PDO::FETCH_ASSOC);

        }


        //----------------------------------------------------------------------------------------------------------
        //Function: closeQuery
        //----------------------------------------------------------------------------------------------------------
        public function closeQuery()  
        {

        $this->qresult = null;

        }



    }
?>

Затем я настроил базу данных в моей функции инициализации:

//initialize the user database with buffered set true so we can use nested queries
$usrdb = new Database($udbserver, $udbport, $udbname, $udbuser, $udbpassword, array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
//open the database
$usrdb->openDatabase();

Затем я вызываю свой запрос на странице:

//set up the sql
$sql = "SELECT * FROM Blah WHERE blahid = :filter";

//create the parameter array
$params = array(':filter'=>$filter);

//craetea new query
$q = new Query($usrdb, $sql);

//run the query
if ($q->openQuery($params)) {

    //get the results if there are any
    while ($row=$q->fetchAssociative()) {

        $viewData['blahid']=$row['blahid'];

    }


}

//clean up the query
$q->closeQuery();

После этого я работаю с результатами, как всегда.

0 голосов
/ 26 февраля 2011

Я сохраняю соединение с базой данных PDO и извлекаю его экземпляр как singleton .

В любом месте, где вам нужна база данных, чтобы выполнить запрос или выполнить подготовленные операторы, вы используетеэкземпляр синглтона.

$db_handle = PDO_DBConnect::getInstance();
$stmt = $db_handle->prepare("SELECT * FROM users WHERE name= ?");
$result = $stmt->execute(array($cleaned_username));
...

Если у класса есть несколько запросов, для удобства вы можете сохранить дескриптор в переменной экземпляра
$this->dbh = PDO_DBConnect::getInstance();.

Еще одно примечание отличается от pg_close или mysql_close, нет метода закрытия для PDO.Вы просто устанавливаете дескриптор БД на null.

0 голосов
/ 26 февраля 2011

PDO работает так же, как подход старой школы.Вам все еще нужно определить соединение и инициализировать объект для запроса базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...