mysqli是專門訪問MySQL數據庫的,不能訪問其它數據庫。PDO可以訪問多種的數據庫,它把操作類合並在一起,做成一個數據訪問抽象層,這個抽象層就是PDO,根據類操作對應的數據庫。mysqli是一個類,PDO也是一個類,只不過PDO這個類功能更加強大。
PDO的功能
1.訪問不同的數據庫
2.自帶事務功能。事務是指同時執行幾條sql語句,但是其中1條語句出了錯無法執行,那么所有的就都執行失敗。
3.防止SQL注入攻擊。
1.訪問不同數據庫
下面代碼是訪問MySQL數據庫的,如果訪問其它數據庫,只需要在造對象中更改數據庫驅動mysql,換成其它數據庫的驅動。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body>
<?php //PDO的用法 //1.造對象 $dsn = "mysql:dbname=text1;host=localhost"; //mysql是指MySQL數據庫的驅動名,加上冒號,冒號后面是數據庫的名稱。 //host是服務器的地址,為localhost。 //如果要使用其它數據庫,要更改數據庫的驅動名。可以從php手冊開面找。 //寫的驅動一定是配好環境的驅動。可以在瀏覽器地址欄里輸入服務器地址localhost查找支持的數據庫驅動。 $pdo = new PDO($dsn,"root","666"); //參數:1.服務器的地址2.數據庫的名稱3.服務器密碼 //寫sql語句 $sql = "update nation set name='獸族' where code='n003'"; //執行sql語句 //$r = $pdo->exec($sql);//返回受影響的條數 ?>
</body> </html>
2.事務功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body>
<?php //1.造對象 $dsn = "mysql:dbname=text1;host=localhost"; $pdo = new PDO($dsn,"root","666"); //設置異常模式,如果出現錯誤,拋個異常出來。2個參數不要加雙引號。 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //寫sql語句 $sql1 = "insert into nation values('noo5','人族')"; $sql2 = "insert into nation values('noo6','精靈族')"; //執行2條sql語句 try//try代表加事務 { $pdo->beginTransaction();//啟動事務 $pdo->exec($sql1); $pdo->exec($sql2); $pdo->commit();//提交事務 } catch(PDOException $e)//抓住出現的異常。$e代表抓住的異常,異常保存在$e里面。 { //$e->getMessage();//獲取錯誤信息。 $pdo->rollBack();//回滾,如果一個地方出現錯誤,回到總體操作之前。 } ?>
</body> </html>
3.防止注入
(1)占位方式為?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body>
<?php //防止sql注入 //1.造對象 $dsn = "mysql:dbname=text1;host=localhost"; $pdo = new PDO($dsn,"root","666"); //寫sql語句,預處理語句。 $sql = "insert into nation values(?,?)";//變量先不寫,先用?占住位置。先把這條語句發過去。 //准備sql語句,返回statement對象。 $st = $pdo->prepare($sql); /*//綁定參數 $st->bindParam(1,$code);//從1開始索引。 $st->bindParam(2,$name); $code="n002";//也可以在前面賦值。 $name="矮人族"; //提交執行 $st->execute();//調用這個方法就可以執行了,括號里面不用給sql語句了,sql語句已經傳過去了。 */ $attr = array("n007","魔族");//造一個數組,數組里面要和添加的內容對應起來。這2行相當於上面/**/標記的4行內容。 //提交執行 $st->execute($attr);//直接把數組放在執行的里面。 //預處理里面用?占位的,給數組的時候要給索引數組,並且數組里的內容要和要添加的內容對應起來。 ?>
</body> </html>
(2)占位方式為name
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body>
<?php //防止sql注入 //1.造對象 $dsn = "mysql:dbname=text1;host=localhost"; $pdo = new PDO($dsn,"root","666"); //寫sql語句,預處理語句。使用name占位。 $sql = "insert into nation values(:code,:name)";//前面要加冒號,不加冒號會被當成普通的變量 //准備執行 $st = $pdo->prepare($sql); /*//綁定參數 $st->bindParam(":code",$code,PDO::PARAM_STR);//PDO::PARAM_STR表示必須是一個字符串 $st->bindParam(":name",$name,PDO::PARAM_STR); $code="no12"; $name="狼族"; //執行 $st->execute();*/ $attr = array("code"=>"n025","name"=>"蟲族");//name占位,要用關聯數組。 //執行 $st->execute($attr); ?>
</body> </html>
4.讀取數據
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body>
<?php //1.造對象 $dsn = "mysql:dbname=text1;host=localhost"; $pdo = new PDO($dsn,"root","666"); //寫sql語句,預處理語句。使用name占位。 $sql = "select * from nation";//前面要加冒號,不加冒號會被當成普通的變量 //准備執行 $st = $pdo->prepare($sql); //執行 $st->execute(); //讀數據 //var_dump($st->fetch());//輸出結果為第一條,可以用while循環全部讀取出來。 //var_dump($st->fetch(PDO::FETCH_ASSOC));//輸出的是關聯數組 //var_dump($st->fetch());//輸出二維數組 //var_dump($st->fetch(PDO::FETCH_ASSOC));//輸出關聯的二維數組 ?>
</body> </html>
