本文整理PHP下PDO連接MySQL示例,打算把服務器PHP升級,之前的MySQL擴展已不再支持,所以只能把早前的程序作了大量修改,本文整理PDO連接MySQL簡要實例,供MySQL PDO應用入門參考。全文代碼均做測試,環境APACHE 2.4/PHP 5.5/MYSQL 5.6。
從PHP 5開始,已經支持sqlite、mysql、pgsql、mssql等數據的pdo擴展,此配置均可在php.ini配置文件中開啟或關閉(;extension=php_pdo_mysql.dll),如果是CentOS、Ubuntu等系統安裝最新PHP支持包,一般均會默認開啟MySQL PDO擴展模塊支持。
$dbhost="localhost";
$dbname="test";
$dbusr="root";
$dbpwd="";
$dbhdl=NULL;
$dbstm=NULL;
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',);
$dsn='mysql:host=' . $dbhost . ';port=3306;dbname=' . $dbname;
try {
$dbhdl = new PDO($dsn, $dbusr, $dbpwd, $opt);
//dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);//Display none
//dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);//Display warning
$dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//Display exception
} catch (PDOExceptsddttrtion $e) {//return PDOException
print "Error!: " . $e->getMessage() . "
";
die();
}
上述代碼中,PDO連接有兩個需要注意地方:dsn和option,這兩部分定義可參考:
http://www.php.net/manual/zh/pdo.construct.php
http://www.php.net/manual/zh/ref.pdo-mysql.php
關於PDO數據庫的持久連接問題可參考:http://php.net/manual/zh/pdo.connections.php,大意就是在option中增設array(PDO_ATTR_PERSISTENT => true)。使用持久連接在腳本結束後不會被關閉,且被緩存,當另一個使用相同憑證的腳本連接請求時被重用。持久連接緩存可以避免每次腳本需要與數據庫回話時建立一個新連接的開銷,從而讓 web 應用程序更快。
PDO連接數據庫的關閉,參考下文說明。
$dbhdl->exec("INSERT INTO foo(name, age) VALUES('Joe', '25')");
$dbhdl->exec("INSERT INTO foo(name, age) VALUES('Kate', '20')");
$dbhdl->exec("UPDATE foo SET name='Tom' WHERE Id='1'");
$dbhdl->exec("DELETE FROM foo WHERE Id='1'");
使用PDO::exec還可搭配事務批處理(PDO::beginTransaction和PDO::commit)使用,其大概意思就是從beginTransaction直到commit為止,中間的操作都是在內存中進行,直到我們執行commit才會提交到最終數據庫修改,否則隨時可以回滾動作。
執行DROP TABLE 或 CREATE TABLE等指令除外,此類操作會隱式commit提交,無法回滾。
PDO查詢可以使用PDO::query也可使用PDOStatement::execute,實例如下:
//Query SELECT
$dbstm = $dbhdl->query('SELECT * from foo LIMIT 0,1');
$rows = $dbstm->fetchAll(PDO::FETCH_ASSOC);//$rows = $dbhdl->Fetch();
print_r($rows);
//execute testing
$name = "Johe";
$age="12";
//execute 1
$dbstm = $dbhdl->prepare("INSERT INTO foo(name, age) VALUES (:name,:age)");
$dbstm->execute(array(':name' => $name,'age'=>$age));
//execute 2
$dbstm = $dbhdl->prepare("INSERT INTO foo(name, age) VALUES (:name,:age)");
$dbstm->bindParam(':name', $name);
$dbstm->bindParam(':age', $age);
$dbstm->execute();
//execute 3
$dbstm = $dbhdl->prepare("INSERT INTO foo(name, age) VALUES (?, ?)");
$dbstm->bindParam(1, $name);
$dbstm->bindParam(2, $age);
$dbstm->execute();
//execute 4
$dbstm = $dbhdl->prepare("INSERT INTO foo(name, age) VALUES (?, ?)");
$dbstm->execute(array($name, $age));
代碼中PDOStatement::execute操作方式有好幾種,隨個人愛好而定,最終執行結果均相同。
PDO SELECT有個問題就是讀取行數沒有直接的方法:
$stmt = $dbhdl->query(“SELECT count(*) from foo;”);
$row = $stmt->fetch();
$rowCount = $row[0];
以上這三句是目前主流的統計方法。
PDO連接數據成功後,返回一個 PDO 類的實例給腳本(上文中的$dbhdl),此連接在 PDO 對象的生存周期中保持活動。要想關閉連接,需要銷毀對象以確保所有剩余到它的引用都被刪除,可以賦一個 NULL 值給對象變量。如果不賦值 NULL,PHP 也會在腳本結束時會自動關閉連接。