第二部分PDO详解
尽量使用外部的Apche服务,比如Xampp的集成环境,具体如何在PHPStorm如何更改,请参见
http://blog.csdn.net/yellowstar5/article/details/52652962
1.PDO 使得数据库更换方便
pdo开启方式 php.ini文件中搜索php_pdo
前面的分号去掉表示开启
extension=php_pdo.dll(父扩展,就是驱动确保开启,前面的分号去掉表示开启)
echo php_info();查看那些已经开启
如果扩展不全,自己可以将其放在Php目录下的ext目录下如Php_pdo
**高版本的php里面已经没有php_pdo.dll了,所有的连接都直接集成到php_pdo_xxx.dll中了**
所以你只要php_pdo_xxx.dll前面的;被去掉即可
2.PHP manual
静态方法或者静态成员在外部采用类名::+方法名/变量名访问
内部采用self::方法名/变量名
/单例类(目的是为了产生唯一的对象
class A{
private static $single;
private function __construct(){
}
static function makeA(){
if(A::$single==null){
A::$single=new self();
}
return A::$single;
}
}
print_r(A::makeA());
PDO 成员对象方法
1.query($sql) 用于执行查询sql语句,返回pdostatement对象
2.exec($sql) 用于执行增删改操作,返回影响的行数
3.setAttribute()设置PDO对象属性$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
4.fetchAll()用于解析数据
更常用的方式
1.连接数据库,及读取和增删改
try{
$pdo=new PDO("uri:mysqlPDO.ini",
'root','');
}
catch (Exception $e){
die($e->getMessage());
}
//这是快捷的操作
//$sql="select * from users";
//
////3.解析数据 foreach 语法
//foreach ($pdo->query($sql) as $val){
// echo $val['id']." ".$val['name'].$val['age']."<br>";
//}
//$sql="insert into users values(null,'YellowStar',20)";
//$sql="delete from users where id=26 ";
$sql="update users set name='mylove' where id=27";
$affectRow=$pdo->exec($sql);
if($affectRow==1)
echo 'success';
//4.释放资源
$pdo=null;
连接数据库的方式及传统的读取
1.连接数据库
try{
$pdo=new PDO("mysql:host=localhost;dbname=myapp",
// 'root','');
$pdo=new PDO("uri:mysqlPDO.ini",'root','');//mysqlPDO.ini为同一目录下的配置文件
// $pdo=new PDO("mysqlpdo",'root','');//在php.ini中声明的,但好像不行
[PDO]
pdo.dsn.mysqlpdo=mysql:host=localhost;dbname=myapp
}
catch (Exception $e){
die($e->getMessage());
}
//执行query返回一个预处理对象
$sql="select * from users";
$stas=$pdo->query($sql);
//$list=$stas->fetchAll();
$list=$stas->fetchAll(PDO::FETCH_ASSOC);//返回的都是关联的,没有以数字为键的
//print_r($list);
//3.解析数据 foreach 语法
foreach ($list as $val){
echo $val['id']." ".$val['name'].$val['age']."<br>";
}
//4.释放资源
$stas=null;
$pdo=null;
2.PDO Exception的使用
PDO 异常处理介绍
PDO::ATTR_ERRMODE
1.PDO::ERRMODE_SILENT //默认是不现实的
默认是不提示的,需要用
echo $pdo->errorCode()."<br>";
print_r($pdo->errorInfo());
2.PDO::ERRMODE_WARINING //已警告的方式报错
3.PDO::ERRMODE_EXCEPTION //以异常的方式报错,最常用
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
setAttribute();
getAttrubute();
*/
try{
$pdo=new PDO("mysql:host=localhost;dbname=myapp",'root','');
// $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
//方式二,设置PDO为报警的模式
//最常用方式三,设置PDO为异常模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch (Exception $e){
die('连接数据库失败'.$e->getMessage());
}
// print_r($pdo);
try{
$sql="insert into userrs values(null,'Codercuixin',22)";
$result=$pdo->exec($sql);
if($result==0){
// echo 'insert failure<br>';
// echo $pdo->errorCode()."<br>";
// print_r($pdo->errorInfo());
}
else{
echo 'insert success';
}
}catch (PDOException $e){
print_r( $e->errorInfo);
}
3.PDO预处理
1.prepare()用于执行sql语句,返回PDOstatement对象
2.bindvalue()将值绑定到对应的一个参数,返回布尔值
3.bindParam()将参数绑定到相应的查询占位符上,返回布尔值
4.bindColumn()用来匹配列名和一个指定的变量名
5.执行一个准备好了的预处理语句,返回布尔值
6.rowCount()返回使用增删改查操作语句后受到影响的行总数。
1.?方式的预处理语句,一共有三种绑定方式
$statement->execute(array(null,'python',3));最简洁
/预处理的sql语句
$sql="insert into users(id,name,age) values(?,?,?)";
$statement=$pdo->prepare($sql);
//第三种绑定方式
$statement->execute(array(null,'python',3));
//执行
//$statement->execute();
echo $statement->rowCount();
//对?号进行参数绑定,第一种绑定方式
//$statement->bindValue(1,null);
//$statement->bindValue(2,'php');
//$statement->bindValue(3,10);
//第二种绑定方式
//$id=null;
//$name='java';
//$age=16;
//$statement->bindParam(1,$id);
//$statement->bindParam(2,$name);
//$statement->bindParam(3,$age);
//$id=null;
//$name='java';
//$age=16;
2.别名方式的预处理语句,也有三种绑定方式(只当做知识点,并没有?的好用)
//预处理的sql语句
$sql="insert into users(id,name,age) values(:id,:name,:age)";
$statement=$pdo->prepare($sql);
//对?号进行参数绑定,第一种绑定方式
//$statement->bindValue("id",null);
//$statement->bindValue("name",'c');
//$statement->bindValue("age",10);
//第二种绑定方式
//$id=null;
//$name='c++';
//$age=16;
//$statement->bindParam("id",$id);
//$statement->bindParam("name",$name);
//$statement->bindParam("age",$age);
//第三种绑定方式
$statement->execute(array('id'=>null,
'name'=>'javascript','age'=>10));
//执行
//$statement->execute();
echo $statement->rowCount();
3.采用预处理方式Sql执行查询
$sql='select * from users';
$statement=$pdo->prepare($sql);
$statement->execute();
//采用foreach输出
//foreach ($statement as $row){
// echo $row['id'].' '.$row['name'].' '.$row['age']."<br>";
//}
//采用bindColumn输出
$statement->bindColumn(1,$id);
$statement->bindColumn(2,$name);
$statement->bindColumn('age',$age);
while($row=$statement->fetch(PDO::FETCH_COLUMN)){
echo "$id $name $age<br>";
4.PDO事务处理(要么都成功,要么都失败)
1.数据表需要InnoDB类型
2.beginTransaction() 开启一个事物作为一个回滚点
3.commit()提交事物
4.rollback 事物回滚操作
//采用预处理+事物处理执行sql操作
1.方法一 exception
$pdo=null;
try{
$pdo=new PDO("mysql:host=localhost;dbname=myapp",'root','');
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
die('连接数据库失败' . $e->getMessage());
}
try{
//开启事物
$pdo->beginTransaction();
$sql="insert into users values(?,?,?)";
$stmt=$pdo->prepare($sql);
//传入参数
$stmt->execute(array(null,'hello',1));
$stmt->execute(array(null,'hello',1));
$stmt->execute(array(null,'hello',1));
$pdo->commit();
}
catch (PDOException $e){
die('执行失败' . $e->getMessage());
$pdo->roolback();
}
2.方法二 foreach遇到错误就跳出
$pdo=null;
try{
$pdo=new PDO("mysql:host=localhost;dbname=myapp",'root','');
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
die('连接数据库失败' . $e->getMessage());
}
//开启事物
$pdo->beginTransaction();
$sql="insert into users values(?,?,?)";
$stmt=$pdo->prepare($sql);
$datalist=array(array(null,'hello',1),
array(null,'hello',1),array(null,'hello',1));
$needCommit=true;
//传入参数
foreach($datalist as $item){
$stmt->execute($item);
if($stmt->errorCode()>0){
$pdo->rollBack();
$needCommit=false;
echo 'operation failure';
break;
}
}
if($needCommit)
$pdo->commit();
5.PDO增删改 如果是字符串类型必须加''(如'{$name}'),如果是整形的则不加where id={$id}
action="action.php?action=add"
<input type="hidden" name="id" value="<?php echo $stu['id'];?>">
<td><input type="text" name="name" value="<?php echo $stu['name']?>"></td>
$sql="insert into student values(null,'{$name}','{$sex}','{$age}','{$classId}')";
$sql="delete from student where id={$id}";
$sql="update student set name='{$name}',sex='{$sex}',age='{$age}',classId='{$classId}' where id={$id}";