「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;
同じクエリが 2 回実行されます
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
この tbl_name からの削除が実行された場合、その結果は想像できます
ですが
select * from tbl_name where id='$id'
これは防ぐことができます。
しかし、PHP は誰もが数値データを引用符で囲むことを想定できません