個人理解:數(shù)據(jù)庫有很多種简十,如mysql,oracle等,不同的數(shù)據(jù)庫有各自不同的函數(shù)哨毁,因此即使是實現(xiàn)同一個功能如插入數(shù)據(jù),我們也需要記住多個函數(shù)源武,這無疑是一個巨大的工作扼褪。所以,我們希望有一個工具能夠一個統(tǒng)一的方法來操作不同的數(shù)據(jù)庫粱栖,這樣话浇,我們就可以只了解這一個工具就可以操作多種不同的數(shù)據(jù)庫。Pdo就是這樣一種工具闹究。
有了pdo凳枝,我們不需要再為不同的數(shù)據(jù)庫封裝數(shù)據(jù)庫操作類,只需要使用pdo接口中的方法就可以對數(shù)據(jù)庫進(jìn)行操作跋核。在選擇不同的數(shù)據(jù)庫時岖瑰,只需要修改pdo中的dsn即可。在使用pdo之前砂代,我們首先要對配置文件進(jìn)行更改蹋订。
- 打開php。Ini文件
- 加載”extension=php_pdo.dll”
-
若想支持某個具體的數(shù)據(jù)庫還要加載相應(yīng)的數(shù)據(jù)庫選項刻伊。如露戒,要支持mysql數(shù)據(jù)庫,則需要加載”extension=php_pdo_mysql.dll”選項.
如圖:
4.php捶箱。ini更改完后智什,保存并重啟MySQL即可。
那么如何連接數(shù)據(jù)庫呢丁屎。
原本荠锭,用MySQL數(shù)據(jù)庫中的函數(shù)是這樣的
$dbc=@mysqli_connect('127.0.0.1', 'root','123456','todolist') or die('could not connect to mysql');
mysqli_set_charset($dbc,'utf8');
現(xiàn)在,用pdo數(shù)據(jù)庫抽象層進(jìn)行操作是這樣的
$dbName='todolist';
$user='root';
$pass='123456';
$host='localhost';
$dsn="$dbms:host=$host;dbname=$dbName";
try{
$pdo=new PDO($dsn,$user,$pass);
$pdo->query("set names utf8");
}catch(PDOException $e){
die("Error!:".$e->getMessage()."<br />");
}
$dbms='mysql'; 定義數(shù)據(jù)庫的類型
$user='root';定義使用數(shù)據(jù)庫的用戶名
$pass='123456';定義密碼
$host='localhost';定義使用的主機(jī)名稱
$dsn="$dbms:host=$host;dbname=$dbName"DSN部分晨川,有三部分組成:pdo的鏈接的數(shù)據(jù)庫名稱证九,主機(jī)名稱和數(shù)據(jù)庫名稱;
$pdo=new PDO($dsn,$user,$pass);實例化對象
$pdo->query("set names utf8");設(shè)置編碼格式删豺,否則會導(dǎo)致讀取數(shù)據(jù)庫的中文內(nèi)容是會出現(xiàn)亂碼。
下面愧怜,我們以todolist中的register.php為例進(jìn)行講解呀页。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<title>注冊頁面</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
session_start();
$dbc=@mysqli_connect('127.0.0.1', 'root','123456','todolist')
or die('could not connect to mysql');
mysqli_set_charset($dbc,'utf8');
require('D:\Dev Apps\xampp\htdocs\sunyan2015\mysqli_connecttodolist.php');
$error=array();
if($_SERVER['REQUEST_METHOD']=='POST'){
if(!empty($_POST['username'])){
$username=$_POST['username'];
}else{
$error[]="請輸入用戶名";
}
if(!empty($_POST['password'])){
$password=$_POST['password'];
}else{
$error[]="請輸入密碼";
}
if(empty($error)){
$q1="select user_id from usermessage where name='$username' ";
$r1=mysqli_query($dbc,$q1);
if(mysqli_num_rows($r1)==0){
$q="insert into usermessage(name,password)values(\"$username\",\"$password\")";
$r=mysqli_query($dbc,$q);
if($r){
echo'恭喜你,已注冊成功拥坛。請點(diǎn)擊<a href="login.php">登錄</a>';
}else{//$r
echo'You could not be registered due to a system error.';
}
}else{
echo'對不起蓬蝶,此用戶名已經(jīng)注冊';
}
mysqli_close($dbc);
exit();
}else{//empty
echo'<h2> Error!</h2>';
echo'The following error(s) occurred:</br>';
foreach($error as $msg){
echo"$msg";
echo"<br />";
}
echo'<p>Please try again.</p>';
}
}
?>
<form action="register.php" method="POST">
用戶名:<br />
<input type="text" name="username" />
<br />
密碼:<br />
<input type="password" name="password" />
請由字母數(shù)字或下劃線組成,長度為5-21
<br />
<input type="submit" value="注冊" />
</form>
<a href="login.php">登錄</a>
<br />
<a href="changepassword.php">更改密碼</a>
<br />
<a href="index.php">返回首頁</a>
</body>
</html>
應(yīng)用pdo
<?php
session_start();
include("../config.php");
$smarty->assign('title','注冊頁面');
echo'<form action="register.php" method="POST">
用戶名:<br />
<input type="text" name="username" />
<br />
密碼:<br />
<input type="password" name="password" />
<br />
<input type="submit" value="注冊" />
</form>';
$error=array();
if($_SERVER['REQUEST_METHOD']=='POST'){
if(!empty($_POST['username'])){
$username=$_POST['username'];
}else{
$error[]="請輸入用戶名";
}
if(!empty($_POST['password'])){
$password=$_POST['password'];
}else{
$error[]="請輸入密碼";
}
if(empty($error)){
$dbms='mysql';
$dbName='todolist';
$user='root';
$pass='123456';
$host='localhost';
$dsn="$dbms:host=$host;dbname=$dbName";
try{
$pdo=new PDO($dsn,$user,$pass);
$pdo->query("set names utf8");
$q1="select user_id from usermessage where name='$username'";
$q="insert into usermessage(name,password)values(\"$username\",\"$password\")";
$r1=$pdo->query($q1);
if(!empty($r1)){
$r=$pdo->exec($q);
if($r){
echo'恭喜你猜惋,已注冊成功丸氛。請點(diǎn)擊<a href="login.php">登錄</a>';
}else{
echo'You could not be registered due to a system error.';
}
}else{
echo'對不起,此用戶名已經(jīng)注冊';
}
}catch(PDOException $e){
die("Error!:".$e->getMessage()."<br />");
}
}else{
echo'<h2> Error!</h2>';
echo'The following error(s) occurred:</br>';
foreach($error as $msg){
echo"$msg";
echo"<br />";
}
echo'<p>Please try again.</p>';
}
}
$smarty->assign('name1','login');
$smarty->assign('content1','登錄');
$smarty->assign('name2','changepassword');
$smarty->assign('content2','更改密碼');
$smarty->display('todo.html');
?>
從以上兩段代碼惨奕,我們可以開出
總體思路是不變的雪位。變的只是數(shù)據(jù)庫的鏈接部分和各種驗證條件的位置。
通過上述代碼梨撞,我們再來了解一下dpo是如何執(zhí)行sql語句的雹洗。
- 對于insert,delete,update,用exec方法
$q="insert into usermessage(name,password)values(\"$username\",\"$password\")";
$r=$pdo->exec($q);
Exec方法返回執(zhí)行后受影響的行數(shù)。
- 對于insert卧波,用query方法
$q1="select user_id from usermessage where name='$username' ";
$r1=$pdo->query($q1);
Query方法返回一個結(jié)果集时肿。