您的位置:首页 > 编程语言 > PHP开发

PHP-PDO笔记

2016-01-31 16:00 731 查看
个人环境

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
));
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: