PDO 提供了一个 数据访问 抽象层,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据,而且可以提高访问速度和有效防止SQL注入,从 PHP 5.1 开始附带了 PDO。(程序摘自php官网,多看php manual http://php.net/manual/zh/book.pdo.php)
1,数据库连接和断开
<?php $dsn = 'mysql:dbname=testdb;host=127.0.0.1'; //可以加上 charset=utf8; 设置编码方式 $user = 'dbuser'; $password = 'dbpassword'; try { $dbh = new PDO($dsn, $user, $password); //连接数据库 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //设置错误处理模式,最好采用这种,需要使用try,catch捕获 } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage();} ?>
$dbh=array();其实脚本结束后会自动断开连接
2,预处理语句与SQL防注入
下面例子获取数据基于键值已提供的形式。用户的输入被自动用引号括起来,因此不会有 SQL 注入攻击的危险。
1 <?php 2 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); //使用?占位,也可以用另一种,这种较方便 3 if ($stmt->execute(array($_GET['name']))) { //传入的一定要是数组,不用过滤 4 while ($row = $stmt->fetch()) { 5 print_r($row); 6 } 7 } 8 ?>
注意:
1,不要直接把用户输入变量放入prepare语句中。先传给sql server语句,再传入变量。
2,like 模糊查询的方法,占整个位置
1 <?php 2 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'"); //这个语句不会返回任何结果,PDO的机制并不是字符串的简单拼接,存在防注入的一些处理 3 $stmt->execute(array($_GET['name'])); 4 5 // 占位符必须被用在整个值的位置 6 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?"); 7 $stmt->execute(array("%$_GET[name]%")); 8 ?>
详情:http://zhangxugg-163-com.iteye.com/blog/1835721