個人環境
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() NOT NULL UNIQUE,
password CHAR() NOT NULL,
email VARCHAR() NOT NULL
);
EOF;
$res = $pdo->exec($sql);
var_dump($res);
//插入測試
$sql = 'INSERT user (username,password,email) VALUES ("king","king","[email protected]")';
$res = $pdo->exec($sql);
echo $res;
//插入多條的大文本形式
$sql = <<<EOF
INSERT user (username,password,email) VALUES
("king1","king1","[email protected]"),
("king2","king2","[email protected]"),
("king3","king3","[email protected]")
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(,$username,PDO::PARAM_STR);
bindValue() 把一個值綁定一個參數,這個值可以重複使用
bindValue(3,’[email protected]’);
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() NOT NULL UNIQUE,
money DECIMAL(,)
)
INSERT INTO `userAccount`(`username`, `money`) VALUES ('boss',),('user1',);
5.PDO封裝
//官方手冊持久化連接配接的例子
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>