PHP使用PDO连接mysql

记录下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();

只需要修改变量的值即可进行不同指定条件的查询
插入一行并获取ID

$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中的错误

在实例化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或任何类似的工具对数据库进行手动查询,都会返回第三个错误

事物和PDO

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的情况。


你可能感兴趣的:(PHP使用PDO连接mysql)