ホームページ >バックエンド開発 >PHPチュートリアル >「class DBStatement extends PDOStatement」はクエリ時に元の行数を返すことができますか?
このコードはどこでも見かけますが、それが何をするのかはどこにも記載されていません。使い方?
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; } }
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の前半ですべてを言いましたね?使うか使わないかはあなた次第です