PHP-PDO笔记
2016-01-31 16:00
731 查看
个人环境
1.Ubuntu
2.LAMP
PHP官方文档
预处理方式
PDOStatement的方法
setAttribute() ; 设置
SQL注入
尽量使用命名参数的占位符,可读性高
bindParam() 绑定一个参数到指定的变量名
getColumnMeta() —testing version,索引从0开始
fetchColumn() 没有办法返回同一行的另外一列,每执行一次,指针向下偏移一行,索引从0开始
debugDumpParams() 打印一条预处理命令
bindValue() 把一个值绑定一个参数,这个值可以重复使用
bindValue(3,’test@qq.com’);
bindColumn() 绑定一列到一个PHP变量
nextRowset() 存储过程 结果集 指针向下移动一位,用来遍历下一个结果集
多个结果集,首先创建一个存储过程
错误处理模式
PDO事务处理
要么都成功,要么都失败的方式
案例:工资系统
财务 -15000
个人 +15000
事务必须使用innodb的存储引擎
1.Ubuntu
2.LAMP
PHP官方文档
1.连接管理
//数据库链接测试 <?php try{ $dsn='mysql:host = localhost;dbname=info'; //数据源 $username = 'root'; $passwd = " "; $pdo = new PDO($dsn,$username,$passwd); var_dump($pdo); //返回类型与数值 }catch(PODException $e){ echo $e->getMessage(); }
2.PDO对象的方法
//EOF是大文本形式 //创建表测试 $sql=<<<EOF CREATE TABLE IF NOT EXISTS user( id INT UNSIGNED AUTO_INCREMENT KEY, username VARCHAR(20) NOT NULL UNIQUE, password CHAR(32) NOT NULL, email VARCHAR(30) NOT NULL ); EOF; $res = $pdo->exec($sql); var_dump($res);
//插入测试 $sql = 'INSERT user (username,password,email) VALUES ("king","king","test@qq.com")'; $res = $pdo->exec($sql); echo $res; //插入多条的大文本形式 $sql = <<<EOF INSERT user (username,password,email) VALUES ("king1","king1","test1@qq.com"), ("king2","king2","test2@qq.com"), ("king3","king3","test3@qq.com") EOF; //最后插入记录的编号 $pdo->lastInsertId();
预处理方式
PDOStatement的方法
//查询单一row的测试 $sql = 'select * from user where username="king2"'; $stmt = $pdo->prepare($sql); $res = $stmt->execute(); $row = $stmt->fetch(); print_r($row); /** 1.查询多个,可以设置关联,索引,BOTH 2.fetch()设置参数 3.FETCH::ASSOC关联 */ $sql = 'select * from user '; $stmt = $pdo->prepare($sql); $res = $stmt->execute(); if($res){ while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ print_r($row); echo '<hr/>'; } } //setFetchMode设置返回格式 $stmt->setFetchMode(POD::FETCH_ASSOC); $rows = $stmt->fetchAll(); print_r($rows);
3.数据库连接属性
getAttribute(); 得到数据库连接的属性setAttribute() ; 设置
//第四个参数可以设置属性 $pdo = new PDO($dsn,$username,$passwd,$options); $pdo->getAttribute(PDO::ATTR_...);
4. 防止SQL注入
开始了多文件的交互过程// web interface <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title> login </title> </head> <body> <form action='doAction.php' method='post'> username:<input type='text' name='username' /> <br/> password:<input type='text' name='password' /> <br/> <input type='submit' value='login' /> </form> </body> <html>
//doAction.php <?php header("content-type:text/html;charset=utf-8"); $username = $_POST['username']; $password = $_POST['password']; // echo $username ; // echo $password ; try{ $pdo = new PDO('mysql:host=localhost;dbname=info','root',''); // var_dump($pdo); $sql = "select * from user where username='{$username}' and password='{$password}'"; $stmt = $pdo->query($sql); echo $stmt->rowCount(); }catch(PDOException $e){ $e->getMessage(); } ?>
SQL注入
1.PODStatement对象的quote方法
//通过quote();返回带引号的字符串,过滤字符串的特殊字符 $pdo->quote($username); $sql="select * from user where username={$username}" and password='{$password}'";
2.预处理语句形式防止SQL注入
占位符处理方式,预处理…尽量使用命名参数的占位符,可读性高
// : 占位符,命名占位符 <?php header("content-type:text/html;charset=utf-8"); $username = $_POST['username']; $password = $_POST['password']; try{ $pdo = new PDO('mysql:host=localhost;dbname=info','root',''); $sql = "select * from user where username=:username and password=:password"; $stmt = $pdo->prepare($sql); $stmt—>execute(array(":username"=>$username,":password"=>$password)); echo $stmt->rowCount(); }catch(PDOException $e){ $e->getMessage(); } ?>
// ? 占位符 <?php header("content-type:text/html;charset=utf-8"); $username = $_POST['username']; $password = $_POST['password']; try{ $pdo = new PDO('mysql:host=localhost;dbname=info','root',' '); $sql = "select * from user where username=? and password=?"; $stmt = $pdo->prepare($sql); $stmt ->execute(array($username,$password)); echo $stmt->rowCount(); }catch(PDOException $e){ $e->getMessage(); } ?>
bindParam() 绑定一个参数到指定的变量名
getColumnMeta() —testing version,索引从0开始
fetchColumn() 没有办法返回同一行的另外一列,每执行一次,指针向下偏移一行,索引从0开始
debugDumpParams() 打印一条预处理命令
//使用命名占位符 $sql = "INSERT user(username,password,email) VALUES(:username,$password,$email)"; $stmt = $pdo -> prepare($sql); $stmt->bindParam(":username",$username,PDO::PARAM_STR); $username = "rose"; $stmt->execute(); //使用? $sql = "INSERT user(username,password,email) VALUES(?,?,?)"; $stmt -> bindParam(1,$username,PDO::PARAM_STR);
bindValue() 把一个值绑定一个参数,这个值可以重复使用
bindValue(3,’test@qq.com’);
bindColumn() 绑定一列到一个PHP变量
nextRowset() 存储过程 结果集 指针向下移动一位,用来遍历下一个结果集
多个结果集,首先创建一个存储过程
DELIMITER // CREATE PROCEDURE test1() BEGIN SELECT * FROM user; SELECT * FROM userAccount; END // DELIMITER ;
错误处理模式
PDO::ERRMODE_SLIENT 默认模式 ,静默模式 PDO::ERRMODE_WARNING 警告模式 PDO::ERRMODE_EXCEPTION 异常模式
PDO事务处理
要么都成功,要么都失败的方式
案例:工资系统
财务 -15000
个人 +15000
事务必须使用innodb的存储引擎
//根据实验场景,创建一个账户表格 CREATE TABLE IF NOT EXISTS userAccount( id TINYINT UNSIGNED AUTO_INCREMENT KEY, username VARCHAR(20) NOT NULL UNIQUE, money DECIMAL(10,2) ) INSERT INTO `userAccount`(`username`, `money`) VALUES ('boss',200000),('user1',10000);
5.PDO封装
//官方手册持久化连接的例子 <?php $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( PDO::ATTR_PERSISTENT => true )); ?>
相关文章推荐
- ThinkPHP - CURD增删改查 - 实例 - 搜索功能
- php常用的正则匹配
- thinkphp控制器中获取当前控制器路径
- ThinkPHP - 查询语句
- PHP学习注意点
- Thinkphp里import的几个使用方法介绍
- PHP开发学习门户改版效果图投票
- 如何使用php session
- 详细讲解PHP中缓存技术的应用
- ZendStudio快捷键
- PHP文件处理系统
- ThinkPHP单字母函数(快捷方法)使用总结
- yii2 日志功能使用记录
- PHP 三元运算符
- DTP中写例程 取前7日和前1日
- PHP常量详解:define和const的区别
- 使用PHP导入和导出CSV文件
- composer 详解
- PHP文件上传
- 新浪云PHP