PHP連線到mysql的方法--mysqli和PDO
原文:https://blog.csdn.net/llittlepig/article/details/38272769
php連線到mysql資料庫,經典的方式就是使用mysql_connect(),具體程式碼如下:
mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
mysql_select_db($db_name);
瀏覽器提示:本擴充套件自 PHP 5.5.0 起已廢棄,並在將來會被移除。應使用 MySQLi 或 PDO_MySQL 擴充套件來替換之。於是一通搜尋,就有了接下來這篇文章的來源。
這裡的mysql是一個擴充套件的API,目的是為了簡化php對mysql資料庫的操作。
mysqli
mysqli是對mysql的一個增強版,出現在PHP 5 及以後的版本。它主要在一下幾方面比mysql增強了:
1、面向物件介面;2、prepared語句支援(譯註:關於prepare請參閱mysql相關文件);3、多語句執行支援;4、事務支援;5、增強的除錯能力;6、嵌入式服務支援
<?php
$link = mysqli_connect("localhost","root","123456","test") or die("Error " . mysqli_error($link)); //連線,test為資料庫的名稱
$query = "SELECT name FROM userInfo" or die("Error in the consult.." . mysqli_error($link));//查詢
$result = mysqli_query($link, $query);//查詢的結果
while($row = mysqli_fetch_array($result)) {
echo $row["name"] . "<br>";
}
?>
上面的這段程式碼是一個完整的從連線到查詢再到關閉資料庫的一個例子。從該例子中可以看到,mysql_connect()和mysqli_connect()函式的用法上的小區別。
//mysql
mysql_connect("localhost","root","123456");
mysql_select_db("userInfo");
//mysqli
mysqli_connect("localhost","root","123456","test");
mysqli的連線資料庫方法中除了使用上述(又稱之為面向過程)之外,另外一種就是面向物件方式:
<?php
$mysqli = new mysqli("localhost","root","123456","test") //填寫mysql使用者名稱、密碼及資料庫的名稱
or die("Could not connect to MySQL server!");
$mysqli->query("set names utf8"); //設定資料庫內資料的編碼,相當於同時設定客戶端、伺服器端和指令碼編碼方式。
$sql = "select * from userInfo";
$result = $mysqli->query($sql);
if($result){
if($result->num_rows>0){
while($row =$result->fetch_array()){//迴圈輸出結果集中的記錄
echo ($row[0])." ";
echo ($row[1])." ";
echo ($row[2])." ";
echo "<br/>";
}
}
}else{
echo "Sorry!";
}
$result=NULL;
$mysqli->close();
?>
這種用法中,使用mysqli之前要先new一個物件,然後使用該例項物件進行操作。
PDO
PHP的一個數據物件,它提供了一個統一的連線資料庫的API,它代表的是和資料庫之間的一個連線,類似於java中的jdbc。
簡單舉例如下:
<?php
$pdo = new PDO('pgsql:host=192.168.1.111;port=5432;dbname=anydb', 'anyuser', 'pw');//連線到資料庫
sleep(5);
$stmt = $pdo->prepare('SELECT * FROM sometable');
$stmt->execute();
$pdo = null;//關閉連線
?>
由於從PHP 6 開始要完全使用PDO方式而非其他方式連線資料庫,所以接下來詳細研究一番:
1、為什麼要用PDO,用PDO有什麼好處?
PDO(PHP資料物件),是PHP訪問資料庫的一個輕量級的統一介面。它提供了一個數據訪問抽象層,這也就是說無論什麼資料庫都能用相同的方法進行查詢或讀取。需要注意的是PDO本身並不能實現任何的資料庫功能,而是必須要使用一個具體資料庫的PDO驅動進行訪問資料庫服務。
2、怎麼用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);
//處理連線錯誤
try {
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
//查詢
foreach($db->query('SELECT * from FOO') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
//關閉連線
$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');
?>
3、更多的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 — 異常克隆