从mysql到PDO - 混淆了何时何地

时间:2011-02-25 22:11:58

标签: php mysql pdo

我正在尝试从构建查询字符串切换并调用mysql_query()并使用PDO。我已经阅读了一些教程,并了解准备语句和为占位符分配值的基本过程。

我不明白的是如何将这项新技术整合到我现有的网络应用程序中。

让我解释一下:

目前,我已经在每个页面上都有init.php require_once'd。它保存数据库U / P并打开数据库连接。随着那个加载,我可以左右摇摆查询,威利和不知情,随心所欲,无需任何进一步的思考。

PDO让我感觉更像是故意的方法。我仍然将所有U / P和连接处理程序填充到我的init文件中吗?我可以直接使用我的脚本并用PDO语句一对一替换查询吗?

抱歉这个简单的问题!

3 个答案:

答案 0 :(得分:1)

对于它的价值,我有同样的问题,这就是我接近它的方式。我将数据库函数分为两个不同的类:Database和Query。我在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;

        }



    }
?>

然后我在init函数中设置数据库:

//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();

之后我就像以前一样使用结果。

答案 1 :(得分:0)

PDO的工作方式与旧学校方法相同。您仍然需要定义连接和初始化对象以查询数据库。

答案 2 :(得分:0)

我存储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_closemysql_close不同,PDO没有紧密的方法。您只需将db句柄设置为null