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

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

WBOY
WBOYOriginal
2016-06-23 14:02:28796browse

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

	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的前半段不是都说了吗?用不用、用哪种,是由你自己决定的

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn