pdo使用总结
- PDO 简介
- 初始化连接数据库和简单操作
- PDO常用方法
- 预处理
一、pdo简介
PDO是PHP访问数据库的一个轻量级、一致性的接口,实现PDO接口使php无论使用什么数据库,都可以通过一致的函数执行CRUD操作数据库。
二、初始化连接数据库和简单操作
try {
//mysql:host=127.0.0.1;dbname=test 数据库类型mysql,主机地址127.0.0.1,数据库名称test
//用户名root 密码'' 设置字符编码为utf8
$db = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));
//查询
$rows = $db->query('SELECT * from members')->fetchAll(PDO::FETCH_ASSOC);
$rs = array();
foreach($rows as $row) {
$rs[] = $row;
}
//结束连接对象
$db = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
查询后结果返回的类型:
PDO::FETCH_ASSOC – 关联数组形式
PDO::FETCH_NUM – 数字索引数组形式
PDO::FETCH_BOTH – 两者数组形式都有,这是缺省的
PDO::FETCH_OBJ – 按照对象的形式,类似于以前的 mysql_fetch_object()
三、PDO常用方法
PDO::query() 主要用于有记录结果返回的操作,特别是select操作。
PDO::exec()主要是针对没有结果集合返回的操作。如insert,update等操作。返回影响行数。
PDO::lastInsertId()返回上次插入操作最后一条ID
注意:如果用insert into tb(col1,col2)values(v1,v2),(v11,v22)..的方式一次插入多条记录,lastinsertid()返回的只是第一条(v1,v2)插入时的ID,而不是最后一条记录插入的记录ID。
PDOStatement::fetch()是用来获取一条记录。配合while来遍历。
PDOStatement::fetchAll()是获取所有记录集到一个中。
PDOStatement::fetchcolumn([intcolumn_indexnum])用于直接访问列,参数column_indexnum是该列在行中的从0开始索引值,但是,这个方法一次只能取得同一行的一列,只要执行一次,就跳到下一行。因此,用于直接访问某一列时较好用,但要遍历多列就用不上。
PDOStatement::rowcount()适用于当用query("select...")方法时,获取记录的条数。也可以用于预处理中。$stmt->rowcount();
PDOStatement::columncount()适用于当用query("select...")方法时,获取记录的列数。
四、预处理
pdo的预处理有什么好处呢,为什么不直接用exec和query方法。举个栗子:
delete from table where id = $_GET['id'];
exec和query是直接把整句sql语句进行编译运行,假如用户输入
delete from table where id = 1 or 1=1;
这样就会有sql注入的危险,而使用pdo的execute预处理就不会出现这个问题
使用占位符处理:
- ? 按顺序使用
:name 按名称使用,与顺序无关
$sql = delete from table where id = ?;//id=:id $stmt = $pdo->prepare($sql); $stmt->execute(array(1));//array(':id'=>1) $stmt->rowCount();//返回影响行数