6

私は現在SQL_CALC_FOUND_ROWS、準備されたステートメントで実装する方法について頭を悩ませています。

私はページネーションクラスを書いていますが、明らかにクエリに LIMIT を追加したいだけでなく、行の総数を調べたいと思っています。

問題のクラスの例を次に示します。

$query = "select SQL_CALC_FOUND_ROWS id,title,location,salary,employer from jobs where region=38 limit 0,3";

if($stmt = $connection->prepare($query)) {
    $stmt->execute()or die($connection->error); //execute query
    $stmt->bind_result($id,$title,$location,$salary,$employer,$image);
    while($stmt->fetch()){
        $jobs[$x]['id']=$id;
        $jobs[$x]['title']=$title;
        $jobs[$x]['location']=$location;
        $jobs[$x]['salary']=$salary;
        $jobs[$x]['employer']=$employer;
        $jobs[$x]['image']=$image;
        $x++;
    }
    $stmt->close();//close statement
}

SQL_CALC_FOUND_ROWS実際の値を取得する方法について少し困惑していますか? 次のようなものを追加することを考えていました:

$stmt->store_result();
$count=$stmt->num_rows;

しかし、それは LIMIT に基づいた数を与えるだけなので、上記の例では、本来あるべき完全な 6 ではなく 3 になります。

4

2 に答える 2

9

なんとか理解できたので、将来興味のある人のために、以下に私の答えを詳しく説明します。

元のコード

$query="select SQL_CALC_FOUND_ROWS id,title,location,salary,employer from jobs where region=38 limit 0,3";

if($stmt = $connection->prepare($query)) {
        $stmt->execute()or die($connection->error); //execute query
        $stmt->bind_result($id,$title,$location,$salary,$employer,$image);
        while($stmt->fetch()){
            $jobs[$x]['id']=$id;
            $jobs[$x]['title']=$title;
            $jobs[$x]['location']=$location;
            $jobs[$x]['salary']=$salary;
            $jobs[$x]['employer']=$employer;
            $jobs[$x]['image']=$image;
            $x++;
        }
        $stmt->close();//close statement
    }

更新されたコード

$query="select SQL_CALC_FOUND_ROWS id,title,location,salary,employer from jobs where region=38 limit 0,3";

if($stmt = $connection->prepare($query)) {
        $stmt->execute()or die($connection->error); //execute query
        $stmt->bind_result($id,$title,$location,$salary,$employer,$image);
        while($stmt->fetch()){
            $jobs[$x]['id']=$id;
            $jobs[$x]['title']=$title;
            $jobs[$x]['location']=$location;
            $jobs[$x]['salary']=$salary;
            $jobs[$x]['employer']=$employer;
            $jobs[$x]['image']=$image;
            $x++;
        }
            //get total number of rows.
            $query="SELECT FOUND_ROWS()";
            $stmt = $connection->prepare($query);
            $stmt->execute();
            $stmt->bind_result($num);
            while($stmt->fetch()){
                $count=$num;
            }

        $stmt->close();//close statement
    }

おそらく別の方法でそれをより良くすることができますが、オンラインのどこにも良い例を見つけることができなかったようで、これはうまくいきます!

于 2012-10-24T13:50:59.110 に答える
0

結果を取得したい場合は、MySQLSQL_CALC_FOUND_ROWSでクエリを実行する必要があります。SELECT FOUND_ROWS()そのために、準備されたステートメントは必要ありません。query()メソッドを使用するだけです。

$connection->query('SELECT FOUND_ROWS()')->fetch_row()[0];

サポートされている PHP バージョンのいずれかを使用している場合に使用する必要がある mysqlnd を使用している場合は、コードをはるかに単純にすることができます。

// Enable error reporting instead of using or die($connection->error)
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$query = "SELECT SQL_CALC_FOUND_ROWS id,title,location,salary,employer 
    FROM jobs 
    WHERE region=38 
    LIMIT 0,3";
$stmt = $connection->prepare($query);
$stmt->execute();
$jobs = $stmt->fetch_all(MYSQLI_ASSOC);

// There is no need for prepared statement when using FOUND_ROWS()
$connection->query('SELECT FOUND_ROWS()')->fetch_row()[0];

ご覧のとおり、ループするfetch_all()よりも使用する方がはるかにクリーンです。while

警告

SQL_CALC_FOUND_ROWS クエリ修飾子および付随する FOUND_ROWS() 関数は、MySQL 8.0.17 で廃止され、将来の MySQL バージョンでは削除される予定です。代わりに、LIMIT を使用してクエリを実行し、次に COUNT(*) を使用して LIMIT を使用せずに 2 番目のクエリを実行して、追加の行があるかどうかを判断することを検討してください。たとえば、次のクエリの代わりに:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS(); 

代わりに次のクエリを使用してください。

SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
于 2019-12-27T21:25:14.780 に答える