“class DBStatement extends PDOStatement” 是不是可以在查詢的時候,返回原始行數?
本帖最後由 rainxies 於 2013-03-11 10:20:33 編輯
我看到到處都有這段代碼,但沒有一個地方告訴有什麼用?怎麼使用?
class Database extends PDO
{
function __construct()
{
parent::__construct('mysql:dbname=test;host=localhost', 'root', '');
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));
}
}
class DBStatement extends PDOStatement
{
public $dbh;
protected function __construct($dbh)
{
$this->dbh = $dbh;
$this->setFetchMode(PDO::FETCH_OBJ);
}
public function foundRows()
{
$rows = $this->dbh->prepare('SELECT found_rows() AS rows', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE));
$rows->execute();
$rowsCount = $rows->fetch(PDO::FETCH_OBJ)->rows;
$rows->closeCursor();
return $rowsCount;
}
}
我的理解是實現了查詢完成後,再調用foundRows可以返回原始記錄集行數
可以避免分頁時要執行2個SQL的問題(select count;select * )
不知是不是這樣?
如果是,該如何調用啊?
請大蝦們不吝賜教啊!!!感激涕零!!!
------解決方案--------------------
不要鑽牛角尖
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name LIMIT 10;
SELECT FOUND_ROWS();
和
SELECT COUNT(*) FROM tbl_name
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name LIMIT 10;
同樣是執行兩次查詢
在有 where 子句時,前者的效率要比後者高
php 的資料庫函數不允許一次執行多條 SQL 指令,是為了防範 SQL攻擊
比如($id 傳入參數)
select * from tbl_name where id=$id
當$id = '1;delete from tbl_name';時,查詢串變成
select * from tbl_name where id=1;delete from tbl_name
如果這個 delete from tbl_name 被執行的話,後果就可想而知了
雖然
select * from tbl_name where id='$id'
就可以防止這種情況的發生。
但是 php 並不能假定每個人都會將數值型資料用引號括起來