標籤:php pdo串連mysql
最近在linux裝了新的環境,php5.6+mysql5.5+nginx。然後用原來的mysql連結資料庫出現的錯誤。
原因就是說串連資料庫的方法太舊。建議我用mysqli和PDO來連結資料庫。
好吧,咱也不能落後,使用mysqli的確也簡單了不少,但是PDO貌似更簡單。效率也會得到提升。根據官方文檔,貌似對於sql注入的一些風險也做了屏蔽。所以今天寫的 部落格就是關於php用PDO串連mysql的一些介紹啦!
【PDO是啥】
PDO是PHP 5新加入的一個重大功能,因為在PHP 5以前的php4/php3都是一堆的資料庫擴充來跟各個資料庫的串連和處理,什麼php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等擴充來串連MySQL、PostgreSQL、MS SQL Server、SQLite,同樣的,我們必須藉助 ADOdb、PEAR::DB、PHPlib::DB之類的資料庫抽象類別來協助我們,無比煩瑣和低效,畢竟,php代碼的效率怎麼能夠我們直接用C/C++寫的擴充效率高捏?所以嘛,PDO的出現是必然的,大家要平靜學習的心態去接受使用,也許你會發現能夠減少你不少功夫哦。
下面說說PDO基於php的版本:
PDO 是 PHP 5.1 發行的,也就是說,在 5.1 之前的版本是不支援 PDO。在PHP5.0的PECL擴充中也可以使用。
PDO如何使用:
這裡我們就以PHP的黃金搭檔mysql作為例子看看:
PDO_MYSQL:PDO_MYSQL是PDO介面能夠完成串連mysql資料庫的驅動(註:僅使用於mysql 3.x以上版本)。
安裝:開啟php.ini檔案,可以找到如下代碼,這裡可以看到mysql的驅動預設已經開啟(前面沒有用於注釋的分號),如有串連其他資料庫的需要,自行添加其他資料庫的驅動程式(取出相應的項前面的分號,沒有的添上)。
//各資料庫的PDO驅動 extension=php_pdo.dll extension=php_pdo_firebird.dll //Firebird extension=php_pdo_informix.dll //Informix extension=php_pdo_mssql.dll //sql server extension=php_pdo_mysql.dll //mysql extension=php_pdo_oci.dll //Oracle extension=php_pdo_oci8.dll extension=php_pdo_odbc.dll //DB2 extension=php_pdo_pgsql.dll //PostgreSQL extension=php_pdo_sqlite.dll //SQLite
串連:通過建立PDO基類的執行個體建立串連。
//串連到資料庫 $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
<?phpheader('content-type:text/html;charset=utf-8');try { $db = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', ''); //查詢 $rows = $db->query('SELECT * from members')->fetchAll(PDO::FETCH_ASSOC);$rs = array(); foreach($rows as $row) { $rs[] = $row; } $db = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); }print_r($rs);?>
//關閉串連 $db = null;
PDO方式串連資料庫mysql的執行個體:
<?php $dbms='mysql'; //資料庫 mysql $host='localhost'; //資料庫主機名稱 $dbName='test'; //資料庫名 $user='root'; //串連使用者名稱 $pass=''; //密碼 $dsn="$dbms:host=$host;dbname=$dbName"; classdbextendsPDO{ publicfunction__construct(){ try{ parent::__construct("$GLOBALS[dsn]",$GLOBALS['user'],$GLOBALS['pass']); }catch(PDOException$e){ die("Error: ".$e->__toString()."<br/>"); } } publicfinalfunctionquery($sql){ try{ returnparent::query($this->setString($sql)); }catch(PDOException$e){ die("Error: ".$e->__toString()."<br/>"); } } privatefinalfunctionsetString($sql){ echo"處理查詢"; return $sql; } } $db=new db(); $db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER); foreach($db->query('select * from table_name') as $row){ print_r($row); } $db->exec('delete from table_name where id=11');?>
不明白啥意思,俺們來慢慢講講。這行:
$dsn = "mysql:host=localhost;dbname=test";
就是構造我們的DSN(資料來源),看看裡面的資訊包括:資料庫類型是mysql,主機地址是localhost,資料庫名稱是test,就這麼幾個資訊。不同資料庫的資料來源構造方式是不一樣的。
$db = new PDO($dsn, ‘root‘, ‘‘);
初始化一個PDO對象,建構函式的參數第一個就是我們的資料來源,第二個是串連資料庫伺服器的使用者,第三個參數是密碼。我們不能保證串連成功,後面我們會講到異常情況,這裡我們姑且認為它是串連成功的。
$count = $db->exec("INSERT INTO foo SET name = ‘heiyeluren‘,gender=‘男‘,time=NOW()");
echo $count;
調用我們串連成功的PDO對象來執行一個查詢,這個查詢是一個插入一條記錄的操作,使用PDO::exec() 方法會返回一個影響記錄的結果,所以我們輸出這個結果。最後還是需要結束對象資源:
$db = null;
預設這個不是長串連,如果需要資料庫長串連,需要最後加一個參數:array(PDO::ATTR_PERSISTENT => true)變成這樣:
$db = new PDO($dsn, ‘root‘, ‘‘, array(PDO::ATTR_PERSISTENT => true));
一次操作就這麼簡單,也許跟以前的沒有太大區別,跟ADOdb倒是有幾分相似。
更多的PDO方法:
PDO::beginTransaction — 啟動一個事務 PDO::commit — 提交一個事務 PDO::__construct — 建立一個表示資料庫連接的 PDO 執行個體 PDO::errorCode — 擷取跟資料庫控制代碼上一次操作相關的 SQLSTATE PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle PDO::exec — 執行一條 SQL 陳述式,並返回受影響的行數 PDO::getAttribute — 取回一個資料庫連接的屬性 PDO::getAvailableDrivers — 返回一個可用驅動的數組 PDO::inTransaction — 檢查是否在一個事務內 PDO::lastInsertId — 返回最後插入行的ID或序列值 PDO::prepare — Prepares a statement for execution and returns a statement object PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object PDO::quote — Quotes a string for use in a query. PDO::rollBack — 復原一個事務 PDO::setAttribute — 設定屬性
PDOStatement::bindColumn — 綁定一列到一個 PHP 變數 PDOStatement::bindParam — 綁定一個參數到指定的變數名 PDOStatement::bindValue — 把一個值綁定到一個參數 PDOStatement::closeCursor — 關閉遊標,使語句能再次被執行。 PDOStatement::columnCount — 返回結果集中的列數 PDOStatement::debugDumpParams — 列印一條 SQL 預先處理命令 PDOStatement::errorCode — 擷取跟上一次語句控制代碼操作相關的 SQLSTATE PDOStatement::errorInfo — 擷取跟上一次語句控制代碼操作相關的擴充錯誤資訊 PDOStatement::execute — 執行一條預先處理語句 PDOStatement::fetch — 從結果集中擷取下一行 PDOStatement::fetchAll — 返回一個包含結果集中所有行的數組 PDOStatement::fetchColumn — 從結果集中的下一行返回單獨的一列。 PDOStatement::fetchObject — 擷取下一行並作為一個對象返回。 PDOStatement::getAttribute — 檢索一個語句屬性 PDOStatement::getColumnMeta — 返回結果集中一列的中繼資料 PDOStatement::nextRowset — 在一個多行集語句控制代碼中推進到下一個行集 PDOStatement::rowCount — 返回受上一個 SQL 陳述式影響的行數 PDOStatement::setAttribute — 設定一個語句屬性 PDOStatement::setFetchMode — 為語句設定預設的擷取模式。
Exception::getMessage — 擷取異常訊息內容。 Exception::getPrevious — 返回異常鏈中的前一個異常 Exception::getCode — 擷取異常代碼 Exception::getFile — 擷取發生異常的程式檔案名稱 Exception::getLine — 擷取發生異常的代碼在檔案中的行號 Exception::getTrace — 擷取異常追蹤資訊 Exception::getTraceAsString — 擷取字串類型的異常追蹤資訊 Exception::toString — 將異常對象轉換為字串 Exception::clone — 異常複製
php PDO串連mysql~高手略過