2015年5月25日 星期一

PHP PDO設定方式

由於PHP在5.0之後有新式物件化的資料庫連結方式

官網介紹: https://php.net/manual/en/book.pdo.php

之所以會要開始學習新的連結方式,主要是因為避免SQL Injection的攻擊也聽說在PHP6會強制使用PDO處理,所有的myql_相關函式會被停

用舊式的PHP-MYSQL連結,需要再加上mysql_real_escape_string() 來濾掉特殊字元避免攻擊,卻會讓程式整個變的很繁雜



下面列出PDO操作資料庫的函數

連線
PDO連線方式後,是以物件來操作對應,在程式面可以此區分操作功能

參考資料:
https://php.net/manual/zh/ref.pdo-mysql.connection.php


執行資料庫語法


PDO::exec($sql) 
回傳受影響的資料庫列數,如使用INSERT、UPDATE、DELETE影響資料庫內容的SQL語法,會回傳數字


PDO::query($sql) 
執行在()中的SQL語法,與PHP-MYSQL中的mysql_query()屬同型function,回傳result set的SQL操作,需給執行回傳的值一個參數,以方便做陣列輸出


PDO::fetch() 
與mysql_fetch_array同樣效果的語法,若sql語法回傳不只一筆資料,需要以迴圈語法做處理

用法:
$data = $rs->fetch(); 


PDO::fetchAll()
將sql語法內容先全部存入到指定參數陣列,因此在此函數中不需要用迴圈處理,需要迴圈處理的是參數陣列

用法:
$data_array = $rs->fetchAll();


PDO::fetchAll(PDO::FETCH_ASSOC)
加入FETCH_ASSOC,可將存出來的陣列作關聯式對應,可去除掉原本會呼叫出來的陣列位置對應數據

如:
未加入: [a]=>1, [0]=>1, [b]=>2,[1]=>2
加入後: [a]=>1, [b]=>2

識情況加入,可合併應用PDO其它函數中



以上基本資料庫語法操作,若要進一步用到query最佳化及防範SQL injection的攻擊,需要開始瞭解以下的函式

Prepare,用法很多種,在此依官網測試了兩種方式,需注意代入的數只能用在條件式
官網連結:https://php.net/manual/en/pdo.prepare.php

官網範例
/* Execute a prepared statement by passing an array of values */
$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();

使用以上方式,在prepare後加入了sql語法,並增加array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)這段,可在execute時,使用索引值指定內容

若不加入array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY),差別在於語法的條件內容可用?代替,在execute是根據陣列位置放值

官網範例


/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));
$red = $sth->fetchAll();
$sth->execute(array(175, 'yellow'));
$yellow = $sth->fetchAll();

可從以上範例中看到,差別在於 ? 跟:colour ,嘗試過其它位置,資料表名稱、order by 條件,皆無法使用此方式代入


bind_param()

i: integer
d: double
s: string
b: a blob and will be sent in packets
是用來檢查型別的函式,使用方式如下
bind_param('is',$id,$content);


參考資料:
http://sofree.cc/github-gist/
http://pjchender.blogspot.tw/2015/03/blogger.html

PDO (PHP Data Object) 學習:
http://blog.yam.com/csylvia/article/72659816

PHP MySQL資料庫新增/修改/刪除操作:
http://www.coding5.com/coding5/works?transno=1000000008

Insert Data Into MySQL Using MySQLi and PDO:
http://www.w3schools.com/php/php_mysql_insert.asp

PHP+MYSQL 大量 INSERT 到資料庫的效能很差 ?
http://www.pigo.idv.tw/archives/2792

PHP執行多個命令列背景程式,並且用事件驅動方式獲得子行程的訊息
http://www.pigo.idv.tw/archives/2796

Php: PHP / MySQL同時多個查詢
http://codex.wiki/question/1305339-9953/

使用PDO存取資料庫(讀取、查詢、修改、更新)
連結


沒有留言 :

張貼留言