php連接到mysql數據庫,經典的方式就是使用mysql_connect(),但此擴展自 PHP 5.5.0 起已廢棄,之后被移除,因此本文介紹另外2種擴展方式
1、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>";
}
?>
上面的這段代碼是一個完整的從連接到查詢再到關閉數據庫的一個例子。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一個對象,然后使用該實例對象進行操作。
2、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;//關閉連接
?>
PS:
由于從PHP 6 開始要完全使用PDO方式而非其他方式連接數據庫,所以接下來對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";
class db extends PDO{
public function __construct(){
try{
parent::__construct("$GLOBALS[dsn]",$GLOBALS['user'],$GLOBALS['pass']);
}catch(PDOException$e){
die("Error: ".$e->__toString()."<br/>");
}
}
public final function query($sql){
try{
return parent::query($this->setString($sql));
}catch(PDOException$e){
die("Error: ".$e->__toString()."<br/>");
}
}
private final function setString($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 — 異常克隆