2

このメソッドを使用して SELECT ステートメントの行数を取得していましたが、LIMIT ステートメントでは正しく機能しなかったため、SQL 文字列から LIMIT を削除するコードを追加しましたが、まったく機能しません!

最後にa を持つクエリを使い始めたときLIMIT X, X、このメソッドは 1 つの列しか返さないため、上部にセクションを追加してその部分をクエリから削除するcount必要がありましたが、LIMIT オフセットにより何も返されませんでした。

function dbRowsCount($sql, $data) {

    # removes "LIMIT X,X" from query
    $no_limit_sql = $sql;
    $pos = stripos($sql, " LIMIT");
    if ($pos!==false) {
        $no_limit_sql = substr($sql, 0, $pos).";";
        # logErrors("original sql=".$sql);
        # logErrors("pos=".$pos."<br>new sql=".$no_limit_sql);
    }

    # query SELECT COUNT(*) instead of SELECT...
    # returns row-count
    $regex = '/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/is';     
    if (preg_match($regex, $no_limit_sql, $output) > 0) {
        dbQuery("SELECT COUNT(*) AS count FROM {$output[1]}", $data);
        $result = dbFetch();
        $last_rowcount = (int)$result["count"];
        if ($pos!==false) {
            # logErrors("after regex="."SELECT COUNT(*) AS count FROM {$output[1]}");
            # logErrors("row count=".$last_rowcount);
        }
        return $last_rowcount;
    } else {
        # logErrors("Oops! There was an error:<br>Regex did not match SQL.");
        return -1;
    }
}

これを MySQL に直接入力すると、count=8 になります。

SELECT COUNT(*) AS count FROM tbl_product WHERE 1 ORDER BY last_update DESC;

メソッドからの出力は、dbRowsCount($sql, $data)このクエリが同じ結果になることを示しています。

元の sql=SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC LIMIT ?, ?;
pos=59
new sql=SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC;
after regex=SELECT COUNT(*) AS count FROM tbl_product WHERE 1 ORDER BY last_update DESC;
行数=0

以前は機能していましたが、クエリから「LIMIT X、X」を削除するために追加した部分なしで返さrows=8れましたが、LIMITが0、Xの場合のみでした。LIMIT 5,5 を試したところ、オフセットのために列がフェッチされず、値に対して 0 行が返されました。

また、これを PDO で直接試してみましたが、int パラメーターと string パラメーターの両方で正しく機能しました。ただし、PDOStatement->rowCount() を使用します。(SELECT クエリには推奨されないため、上記の dbRowsCount メソッドを使用しました)。

function dbDebugTest() {
    global $db;
    # logErrors("Beginning dbDebugTest()");
    $stmt = $db->prepare("SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC LIMIT ?,?");
    $offset = "5";
    $display = "5";
    $stmt->execute(array($offset,$display));
    # logErrors("dbDebugTest() returned rows: ".$stmt->rowCount());
}

最初のメソッドが 0 行を返す原因は何ですか?

4

1 に答える 1

0

私が見ることができるのは、 aLIMITが存在する場合、クエリの後ろにセミコロンを追加することだけです。おそらくそれがあなたの問題の原因です。

dbQueryそれが問題ではない場合、とが正しく機能し、変更されていないと仮定するとdbFetch、テーブルは空ですか? :)

OP 回答$dataparams がなくなった場合でも、配列をクエリに転送していました (LIMIT X、X を削除したため)。

于 2012-05-03T23:32:22.747 に答える