好驚嚇的一件事,
之前一直以為
$stm = $db->prepare("select * from tablename where ID = :ID");
$stm->bindValue(":ID", $ID, PDO::PARAM_INT);

運作原理. 應該是把 $ID 轉成數字, 然後 Bind 進SQL 內去跑.
結果居然不是...
PDO 的作法是, 判斷. $ID 是不是數字,
如果是數字 在SQL 內就不加單引號.
就會變成 select * from tablename where ID = 5 ;
如果是字串5的話 就把他加上單引號去跑...
變成 select * from tablename where ID = '5';
@@ 所以在. bind 數字進去, 還是要自己先轉成數字型態比較保險.


會發現這個錯誤是因為在做分頁
$offset = $_GET["offset"];
$offset = ($offset == "" || !is_numeric($offset)) ? 0 : $offset;
$stm = $db->prepare("select * from tablename limit :offset, 20);
$stm->bindValue(":offset", $offset, PDO::PARAM_INT);

這樣居然有錯. PDO 一直把. offset 加上單引號, 也就是SQL 就會變成
select * from tablename limit '10', 20 ;
一整個就跑不出來阿~~~

$offset = $_GET["offset"];
$offset = ($offset == "" || !is_numeric($offset)) ? 0 : (int)$offset;
$stm = $db->prepare("select * from tablename limit :offset, 20);
$stm->bindValue(":offset", $offset, PDO::PARAM_INT);

這樣就可以跑了

peeress 發表在 痞客邦 PIXNET 留言(0) 人氣()