天天看點

PHP-PDO筆記1.連接配接管理2.PDO對象的方法3.資料庫連接配接屬性4. 防止SQL注入5.PDO封裝

個人環境

1.Ubuntu

2.LAMP

PHP官方文檔

PHP-PDO筆記1.連接配接管理2.PDO對象的方法3.資料庫連接配接屬性4. 防止SQL注入5.PDO封裝

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對象的方法

PHP-PDO筆記1.連接配接管理2.PDO對象的方法3.資料庫連接配接屬性4. 防止SQL注入5.PDO封裝
PHP-PDO筆記1.連接配接管理2.PDO對象的方法3.資料庫連接配接屬性4. 防止SQL注入5.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的方法

PHP-PDO筆記1.連接配接管理2.PDO對象的方法3.資料庫連接配接屬性4. 防止SQL注入5.PDO封裝
PHP-PDO筆記1.連接配接管理2.PDO對象的方法3.資料庫連接配接屬性4. 防止SQL注入5.PDO封裝
//查詢單一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注入

PHP-PDO筆記1.連接配接管理2.PDO對象的方法3.資料庫連接配接屬性4. 防止SQL注入5.PDO封裝

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
));
?>