记录下PHP学习时连接mysql使用的PDO用法,以备自己查漏补缺和复习
PDO提供了便于使用的常量:
PDO::FETCH_ASSOC使用键组返回数组到列名
PDO::FETCH_NUM使用数字键返回数组
PDO::FETCH_BOTH(默认值)结合了PDO::FETCH_ASSOC和PDO::FETCH_NUM以提供一个每个值出现两次的数组,一次使用列名,一次使用数字索引
PDO::FETCH_CLASS返回一个已命名的类的对象,值以列的名字命名设置到属性中
调用方法:$result = $stmt->fetch(PDO::FETCH_ASSOC);
$db = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');//首先创建PDO对象
使用 预处理语句,如:
$sql = "select * from user where name = :user_name";
$stmt = $db->prepare($sql);//得到PDOStatement对象
$stmt ->execute(array('user_name'=>'name1'));//设定参数值
$result = $stmt->fetch();
var_dump($result); //即可得到搜索到的值,如果任意地方出现错误,result将返回一个false
另一种方式,如:
$sql = "select * from user where name = ? and age = ?";
$stmt = $db->prepare($sql);
$stmt->execute(array('name', 20));
设置一些元素用于每次查询,bindValue()方法使用方式如下:
$sql = "select * from user where name = :user_name and age = :user_age";
$stmt = $db->prepare($sql);
$stmt->bindValue(':user_name', 'name1');
$stmt->bindValue(':user_age', 20);
$stmt->execute();
$stmt->fetch();
$stmt->bindValue(':user_name', 'name2');
$stmt->execute();
$stmt->fetch();
可以很容易的修改占位符的值,方便查询
bindParam()方法使用方法如下:
$sql = "select * from user where name = :user_name";
$stmt = $db->prepare($sql);
$stmt->bindParam(':user_name', $name);
$name = 'name1';
$stmt->execute();
$stmt->fetch();
$name = 'name2';
$stmt->execute();
$stmt->fetch();
只需要修改变量的值即可进行不同指定条件的查询$sql = "insert into user (name, age) values (:user_name, :user_age)";
$stmt = $db->prepare($sql);
$stmt->execute(array(':user_name'=>'name3', ':user_age'=>22));
$db->lastInsertId();//execute执行这个sql语句后,通过调用数据库连接中的lastInsertId()方法(是PDO对象而不是PDOStatement)对象
//可以马上获取新纪录的ID。该方法在所有支持auto_increment或类似功能的数据库平台上都有效
需要用到rowCount()方法,使用方式如下:
$sql = "update user set age = :user_age where name = :user_name ";
$stmt = $db->prepare($sql);
$stmt->execute(array(':user_name'=>'name', ':user_age'=>25));
$stmt->rowCount(); //即可得到被影响的行数
插入数据及删除数据操作方式除sql语句不同外,类似。
在实例化PDO对象的时候,如果填入的参数不对,会抛出异常错误,所以应当添加try catch代码
如:
try{
$db = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
}catch(PDOException $e){
echo 'Could not connect to database';
}
调用PDO::prepare()方法时,会返回一个PDOStatement对象,如果预处理失败,可能会返回一个false或抛出一个PDOException异常
代码应如下处理:
try{
$stmt = $db->prepare($sql);
if($stmt){
$stmt->execute(array('user_name'=1));
}
$stmt->fetch();
}catch(PDOException $e){
echo "A database problem has occurred:".$e->getMessage();
}
这时候发现了一个细节问题,为什么有execute方法array内的占位符前加了冒号,有的没加
经测试,加不加都可以,所以我决定之后的代码还是都加统一下。
execute()方法执行成功会返回true,失败会返回false。尝试提取任何结果前检查是否正确是个好习惯。
部分代码如下:
$result = $stmt->execute();
if($result){
var_dump($stmt->fetch());
}else{
$error = $stmt->errorInfo();
echo "Query failed with message:".$error[2];//输出查找错误的原因
}
使用errorInfo()方法主动找到错误产生的原因,会返回一个由3个元素组成的数组:
1) SQLSTATE--------- 一个关于错误产生原因的ANSI SQL标准码;
2) 来自数据库驱动的错误代码;
3) 来自数据库驱动的错误消息。
使用命令行、phpMyAdmin或任何类似的工具对数据库进行手动查询,都会返回第三个错误
1) 在运行任何语句之前通过调用PDO::beginTransaction()方法启动事务
2) 当所有的语句成功运行之后调用PDO::commit()方法
3) 如果调用PDO::rollBack()方法时出现错误,将取消所有已经运行的语句
部分代码体现如下:
try{
$db->beginTransaction();
$db->exec('......................');//运行sql语句
$db->commit();
}catch(PDOException $e){
$db->rollBack();
echo "Something went wrong:".$e->getMessage();
}
exec()方法和返回值:
对数据运行了一次性语句,exec()方法的返回值不是受影响的行数就是查询失败的false,要特别区分影响行数为0和返回false的情况。