我正在尝试从构建查询字符串切换并调用mysql_query()
并使用PDO。我已经阅读了一些教程,并了解准备语句和为占位符分配值的基本过程。
我不明白的是如何将这项新技术整合到我现有的网络应用程序中。
让我解释一下:
目前,我已经在每个页面上都有init.php
require_once'd。它保存数据库U / P并打开数据库连接。随着那个加载,我可以左右摇摆查询,威利和不知情,随心所欲,无需任何进一步的思考。
PDO让我感觉更像是故意的方法。我仍然将所有U / P和连接处理程序填充到我的init文件中吗?我可以直接使用我的脚本并用PDO语句一对一替换查询吗?
抱歉这个简单的问题!
答案 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_close
或mysql_close
不同,PDO没有紧密的方法。您只需将db句柄设置为null
。