ホームページ >バックエンド開発 >PHPチュートリアル >「class DBStatement extends PDOStatement」はクエリ時に元の行数を返すことができますか?

「class DBStatement extends PDOStatement」はクエリ時に元の行数を返すことができますか?

WBOY
WBOYオリジナル
2016-06-23 14:02:28833ブラウズ

このコードはどこでも見かけますが、それが何をするのかはどこにも記載されていません。使い方?

	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 を呼び出すと元のレコードセットの行番号を返すことができるということです
これにより、ページング (select count; select *) 中に 2 つの SQL を実行する問題を回避できます
これは本当ですか?
「はい」の場合、どのように呼びますか?

エビさん、アドバイスお願いします! ! !感謝の涙! ! !


ディスカッションへの返信 (解決策)

あまり混乱しないでください

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name LIMIT 10;
SELECT FOUND_ROWS() と
SELECT COUNT(*) FROMtbl_name
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name LIMIT 10;

同じクエリが 2 回実行されます
where 句がある場合、前者の方が後者よりも効率的です

SQL 攻撃を防ぐために、PHP データベース関数では複数の 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
これが 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 * FROMtbl_name LIMIT 10;

同じクエリが 2 回実行されます
いつ...
私は長年にわたって ASP.NET を開発してきました。
会社は SQL_CALC_FOUND_ROWS を使いたいと考えており、パフォーマンスを向上させたいと考えています。 LIMIT 句に関係なく、結果セットに含まれる行数を計算する MySQL。行数は SELECT FOUND_ROWS() を使用して復元できます。

SQL_CALC_FOUND_ROWS は、mysql でのみ使用可能なパラメータです。
SQL_CALC_FOUND_ROWS は、LIMIT 句に関係なく、結果セットに含まれる行数を計算するように MySQL に指示します。行数は SELECT FOUND_ROWS() を使用して復元できます。

はい、制限を考慮しないので使いたいです

それ以外の場合は、配列の長さを直接取得しても大丈夫です

#1の前半ですべてを言いましたね?使うか使わないかはあなた次第です

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。