>백엔드 개발 >PHP 튜토리얼 >“class DBStatement extends PDOStatement” 是不是可以在查询的时候,返回原始行数?

“class DBStatement extends PDOStatement” 是不是可以在查询的时候,返回原始行数?

WBOY
WBOY원래의
2016-06-23 14:02:28829검색

我看到到处都有这段代码,但没有一个地方告诉有什么用?怎么使用?

	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 并不能假定每个人都会将数值型数据用引号括起来


您的建议是老老实实写个select count语句了?是吧?

不要钻牛角尖
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;

同样是执行两次查询
在有……

SQL注入我倒是比较了解,开发ASP.NET蛮多年了
现在公司要用PHP,看SQL_CALC_FOUND_ROWS貌似不错,想提高下性能

不要钻牛角尖
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;

同样是执行两次查询
在有……

SQL_CALC_FOUND_ROWS 是只在 mysql 才有的参数
SQL_CALC_FOUND_ROWS告知MySQL计算有多少行应位于结果集合中,不考虑任何LIMIT子句。行的数目可以使用SELECT FOUND_ROWS()恢复。

SQL_CALC_FOUND_ROWS 是只在 mysql 才有的参数
SQL_CALC_FOUND_ROWS告知MySQL计算有多少行应位于结果集合中,不考虑任何LIMIT子句。行的数目可以使用SELECT FOUND_ROWS()恢复。

对,正因为不考虑limit,我才想用它

否则直接取array的长度不就OK

#1的前半段不是都说了吗?用不用、用哪种,是由你自己决定的

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.