2

我正在使用这种方法来获取 SELECT 语句的行数,但是对于 LIMIT 语句它不能正常工作,所以我添加了代码来从 sql 字符串中删除 LIMIT,但现在它根本不起作用!

当我开始使用LIMIT X, X末尾带有 a 的查询时,我必须在顶部添加部分以从查询中删除该部分,因为此方法仅返回一列 -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;
在 regex=SELECT COUNT(*) AS count FROM tbl_product WHERE 1 ORDER BY last_update DESC 之后;
行数=0

它以前工作过,它没有返回rows=8我为从查询中删除“LIMIT X,X”而添加的部分,但只有当 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

我所能看到的是,当LIMIT存在 a 时,您在查询后面添加一个分号。也许这就是你的问题的原因。

如果这不是问题,假设dbQuery并且dbFetch工作正常并且没有改变,那么您的表是空的?:)

OP 答案$data当不再有参数时,我仍在将数组转发给查询(因为我删除了 LIMIT X,X)

于 2012-05-03T23:32:22.747 回答