官網介紹: 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)
連線
PDO連線方式後,是以物件來操作對應,在程式面可以此區分操作功能
參考資料:
https://php.net/manual/zh/ref.pdo-mysql.connection.php
執行資料庫語法
PDO::exec($sql)
回傳受影響的資料庫列數,如使用INSERT、UPDATE、DELETE影響資料庫內容的SQL語法,會回傳數字
PDO::query($sql)
PDO::query($sql)
執行在()中的SQL語法,與PHP-MYSQL中的mysql_query()屬同型function,回傳result set的SQL操作,需給執行回傳的值一個參數,以方便做陣列輸出
PDO::fetch()
與mysql_fetch_array同樣效果的語法,若sql語法回傳不只一筆資料,需要以迴圈語法做處理
用法:
$data = $rs->fetch();
用法:
$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存取資料庫(讀取、查詢、修改、更新)
連結
沒有留言 :
張貼留言