PDO-数据库访问抽象层
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PDO-数据库访问抽象层相关的知识,希望对你有一定的参考价值。
C语言编写,php编译。php5面向对象。
在php.ini任意位置配置这句话,t2是自定义名,建议和要打开的数据库一样。
建议用参数形式连接数据库。$dsn是数据源,包含主机名和数据库名。
最简单的pdo连接数据库。
使用<<<EOF
EOF;就不能用引号。在php中创建数据表用这种EOF大文本格式。写完sql可以echo看看。接着复制到命令行试试。接着删除。truncate table 表名;清空表记录。truncate 截断。mysql命令控制台可以调颜色。插入多条也用大文本格式。altert table user auto_increment=10;调整即将插入的记录id号。$pdo->lastInsertId();得到新插入记录的id号。lastInsertId()这是针对插入操作,对更新等其他操作返回0.UPDATE user SET username="king" where id=1在id=1,username=king的前提还更新,相当于没更新,此时会匹配1条,但受影响0条。delete from user where id=1;删除记录格式delete from 表名 where 条件即可。
0是错误码,1是错误编号。errorCode()返回的是错误码,errorInfo()返回的是数组。query执行查询select后需要遍历foreach才可以打印具体内容。query用于查询更多,exec用于增删改更多。PDO可以使用预处理或者不使用。
fetch得到一条记录,循环可以多条。调用fetch结果集是prepare语句而不是execute语句。
$rows=$stmt->fetchAll();
print_r($rows);这样可以不用循环fetch()。不管fetch还是fetchall都是返回索引加关联的数组。
加上参数即可按参数定义的形式返回数组。fetch(PDO::FETCH_OBJ)还可以用返回对象的形式。
还可以预先设置语句返回模式。这里的索引和关联范围指最后一维数组。即字段名。$dsn最后的值可以不加分号结尾。echo ‘自动提交‘.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);查看自动提交是否开启,应用于事务场所。$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);设置属性。
连接数据库的第四个参数还可以自己设置连接参数。quote()防止sql注入。用了pdo不一定防止注入,还要预处理。
$pdo=new PDO()为PDO连接,关闭数据库连接将其设为null即可,即$pdo=null。不建议quote方法防止注入,
预处理更好。
?这种占位符更好。
<?php
header(‘content-type:text/html;charset=utf-8‘);
try {
$pdo=new PDO(‘mysql:host=localhost;dbname=t2‘,‘root‘,‘‘);
$sql="INSERT user(username,password,email) VALUES(:username,:password,:email)";
$stmt=$pdo->prepare($sql);
$stmt->bindParam(":username",$username,PDO::PARAM_STR);
$stmt->bindParam(":password", $password,PDO::PARAM_STR);
$stmt->bindParam(":email", $email);
$username=‘imooc1‘;
$password=‘imooc1‘;
$email=‘[email protected]‘;
$stmt->execute();
$username=‘K1‘;
$password=‘k1‘;
$email=‘[email protected]‘;
$stmt->execute();
echo $stmt->rowCount();
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
<?php
header(‘content-type:text/html;charset=utf-8‘);
try {
$pdo=new PDO(‘mysql:host=localhost;dbname=t2‘,‘root‘,‘‘);
$sql="INSERT user(username,password,email) VALUES(?,?,?)";
$stmt=$pdo->prepare($sql);
$stmt->bindParam(1, $username);
$stmt->bindParam(2, $password);
$stmt->bindParam(3, $email);
$username=‘THIS IS A TEST‘;
$password=‘THIS IS A TEST‘;
$email=‘[email protected]‘;
$stmt->execute();
echo $stmt->rowCount();
} catch (PDOException $e) {
echo $e->getMessage();
}
parameter参数
问号占位符赋值时,指定位置从1开始。当参数多的时候最好用:name这种,不用问号。bindParam(":id",$id);$id=10;放引用,再赋值,不要直接写入参数内。当有一个参数多次插入值一样就要用bindValue();
mysql
rename命令格式:rename table 原表名 to 新表名;
$stmt->nextRowset();指针下移到下一个结果集。
/* PDO::ERRMODE_SILENT:默认模式,静默模式,完全不显示, PDO::ERRMODE_WARNING:警告模式,抛出警告后,程序可继续运行 PDO::ERRMODE_EXCEPTION:异常模式(UP推荐模式),错误信息显示最完整,在抛出异常后程序停止运行 */
<?php
header(‘content-type:text/html;charset=utf-8‘);
try {
$options=array(PDO::ATTR_AUTOCOMMIT,0);
$pdo=new PDO(‘mysql:host=localhost;dbname=t2‘,‘root‘,‘‘,$options);
$pdo->beginTransaction();
$sql=‘update userAccount set money=money-2000 where username="imooc"‘;
$res1=$pdo->exec($sql);
if ($res1==0){
throw new PDOException(‘imooc 转账失败‘);
}
$res2=$pdo->exec(‘update userAccount set money=money+2000 where username="king"‘);
if ($res2==0){
throw new PDOException(‘king 接收失败‘);
}
$pdo->commit();
} catch (PDOException $e) {
$pdo->rollBack();
echo $e->getMessage();
}
事务处理。innoDB引擎才支持事务。
pdo关闭:看你是否永久连接,如果不是永久连接的话关闭页面或者销毁对象的时候就关闭了。PDO的连接数据库效率低于MYSQLi,速度前者比后者慢,耗时长。
插入效率也是pdo慢。除非要求效率高,否则用pdo。
以上是关于PDO-数据库访问抽象层的主要内容,如果未能解决你的问题,请参考以下文章