无法理解php / mysql中返回的0行

时间:2012-05-03 23:28:16

标签: php mysql pdo

我使用此方法获取SELECT语句的行计数,但它对LIMIT语句无法正常工作,因此我添加了代码以从sql字符串中删除LIMIT,但现在它根本不起作用!

当我最后开始使用LIMIT X, X的查询时,我不得不在顶部添加部分以从查询中删除该部分,因为此方法只返回一列 - 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-&gt; 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行?

1 个答案:

答案 0 :(得分:0)

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

如果这不是问题,假设dbQuerydbFetch工作正常但没有改变,那么您的表格是空的吗? :)

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