Heim  >  Artikel  >  Backend-Entwicklung  >  “class DBStatement extends PDOStatement” 是否可以在查询的时候,返回原始行数

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

WBOY
WBOYOriginal
2016-06-13 12:52:10798Durchsuche

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

本帖最后由 rainxies 于 2013-03-11 10:20:33 编辑 我看到到处都有这段代码,但没有一个地方告诉有什么用?怎么使用?
<br />
	class Database extends PDO<br />
	{<br />
	    function __construct()<br />
	    {<br />
	        parent::__construct('mysql:dbname=test;host=localhost', 'root', '');<br />
	        $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));<br />
	    }<br />
	}<br />
	<br />
	class DBStatement extends PDOStatement<br />
	{<br />
	    public $dbh;<br />
	<br />
	    protected function __construct($dbh)<br />
	    {<br />
	        $this->dbh = $dbh;<br />
	        $this->setFetchMode(PDO::FETCH_OBJ);<br />
	    }<br />
	    <br />
	    public function foundRows()<br />
	    {<br />
	        $rows = $this->dbh->prepare('SELECT found_rows() AS rows', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE));<br />
	        $rows->execute();<br />
	        $rowsCount = $rows->fetch(PDO::FETCH_OBJ)->rows;<br />
	        $rows->closeCursor();<br />
	        return $rowsCount;<br />
	    }<br />
	}<br />


我的理解是实现了查询完成后,再调用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 并不能假定每个人都会将数值型数据用引号括起来


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn