1

我在 phpMyAdmin 中检查了这个,它返回了 1 个结果:

    SELECT id, name
      FROM tbl_product_category
INNER JOIN tbl_product_cat_basket AS basket
        ON id = basket.cat_id
     WHERE basket.product_id = 2
     LIMIT 0,1

然后我在 phpMyAdmin 中检查了这个,它返回了 COUNT = 1:

    SELECT COUNT(*)
      FROM tbl_product_category
INNER JOIN tbl_product_cat_basket AS basket
        ON id = basket.cat_id
     WHERE basket.product_id = 2
     LIMIT 0,1

现在我不明白为什么这会导致$rows返回空字符串或 null:

function getProductCategory($product_id) {
    $sql = "SELECT id, name FROM tbl_product_category
        INNER JOIN tbl_product_cat_basket AS basket
                ON id = basket.cat_id
             WHERE basket.product_id = ?
             LIMIT 0,1;";
    $data = array((int)$product_id);
    $rows = dbRowsCount($sql, $data);
logErrors("getProductCategory(".$product_id.") returned rows: ".$rows);
    if ($rows == 1) {
        dbQuery($sql, $data);
        return dbFetch();
    } else {
        return null;
    }
}

logErrors方法给了我这个输出:

getProductCategory(1) 返回行:
getProductCategory(2) 返回行:
getProductCategory(3) 返回行:
getProductCategory(4) 返回行:
getProductCategory(5) 返回行:

所以我null从方法中返回。

我的dbRowsCount(...)方法将 SQL 转换为 a SELECT COUNT(*),然后dbQuery(...)执行真正的查询。这很奇怪,因为dbRowsCount(...)到目前为止,我的其他查询总是返回正确的行。

无论如何,这里是:

function dbRowsCount($sql, $data) {
    global $db, $query;
    $regex = '/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/i';
    if (preg_match($regex, $sql, $output) > 0) {
        $query = $db->prepare("SELECT COUNT(*) FROM {$output[1]}");
        $query->setFetchMode(PDO::FETCH_NUM);
        if ($data != null)
            $query->execute($data);
        else
            $query->execute();
        if (!$query) {
            echo "Oops! There was an error: PDOStatement returned false.";
            exit;
        }
        return $query->fetchColumn();
    }
    return false;
}

那么出了什么问题呢?


编辑

这是我的程序的一些输出:[原始查询] [正则表达式后查询]

SELECT id, name FROM tbl_product_category INNER JOIN tbl_product_cat_basket AS basket ON id = basket.cat_id WHERE basket.product_id = ? LIMIT 0,1;
SELECT COUNT(*) FROM tbl_product_category

getProductCategory(1) returned rows: 7
SELECT id, name FROM tbl_product_category INNER JOIN tbl_product_cat_basket AS basket ON id = basket.cat_id WHERE basket.product_id = ? LIMIT 0,1;
SELECT COUNT(*) FROM tbl_product_category

getProductCategory(2) returned rows: 7
SELECT id, name FROM tbl_product_category INNER JOIN tbl_product_cat_basket AS basket ON id = basket.cat_id WHERE basket.product_id = ? LIMIT 0,1;
SELECT COUNT(*) FROM tbl_product_category

getProductCategory(3) returned rows: 7
SELECT id, name FROM tbl_product_category INNER JOIN tbl_product_cat_basket AS basket ON id = basket.cat_id WHERE basket.product_id = ? LIMIT 0,1;
SELECT COUNT(*) FROM tbl_product_category

getProductCategory(4) returned rows: 7
SELECT id, name FROM tbl_product_category INNER JOIN tbl_product_cat_basket AS basket ON id = basket.cat_id WHERE basket.product_id = ? LIMIT 0,1;
SELECT COUNT(*) FROM tbl_product_category

getProductCategory(5) returned rows: 7
SELECT id, name FROM tbl_product_category INNER JOIN tbl_product_cat_basket AS basket ON id = basket.cat_id WHERE basket.product_id = ? LIMIT 0,1;
SELECT COUNT(*) FROM tbl_product_category

getProductCategory(6) returned rows: 7
SELECT id, name FROM tbl_product_category INNER JOIN tbl_product_cat_basket AS basket ON id = basket.cat_id WHERE basket.product_id = ? LIMIT 0,1;
SELECT COUNT(*) FROM tbl_product_category

getProductCategory(7) returned rows: 7
SELECT id, name FROM tbl_product_category INNER JOIN tbl_product_cat_basket AS basket ON id = basket.cat_id WHERE basket.product_id = ? LIMIT 0,1;
SELECT COUNT(*) FROM tbl_product_category

getProductCategory(8) returned rows: 7
SELECT id, name FROM tbl_product_category INNER JOIN tbl_product_cat_basket AS basket ON id = basket.cat_id WHERE basket.product_id = ? LIMIT 0,1;
SELECT COUNT(*) FROM tbl_product_category

getProductCategory(9) returned rows: 7
SELECT * FROM tbl_store_admin WHERE php_sesskey=?;
SELECT COUNT(*) FROM tbl_store_admin WHERE php_sesskey=?;

SELECT * FROM tbl_menu_cat_basket WHERE menu_id=?;
SELECT COUNT(*) FROM tbl_menu_cat_basket WHERE menu_id=?;

SELECT * FROM tbl_menu_cat_basket WHERE menu_id=?;
SELECT COUNT(*) FROM tbl_menu_cat_basket WHERE menu_id=?;

SELECT * FROM tbl_menu_cat_basket WHERE menu_id=?;
SELECT COUNT(*) FROM tbl_menu_cat_basket WHERE menu_id=?;

SELECT * FROM tbl_menu_cat_basket WHERE menu_id=?;
SELECT COUNT(*) FROM tbl_menu_cat_basket WHERE menu_id=?;

SELECT * FROM tbl_menu_cat_basket WHERE menu_id=?;
SELECT COUNT(*) FROM tbl_menu_cat_basket WHERE menu_id=?;

SELECT * FROM tbl_menu_cat_basket WHERE menu_id=?;
SELECT COUNT(*) FROM tbl_menu_cat_basket WHERE menu_id=?;

SELECT * FROM tbl_menu_cat_basket WHERE menu_id=?;
SELECT COUNT(*) FROM tbl_menu_cat_basket WHERE menu_id=?;

SELECT * FROM tbl_product ORDER BY last_update ASC;
SELECT COUNT(*) FROM tbl_product ORDER BY last_update ASC;
4

2 回答 2

2

您的 RegeExp 不匹配,它缺少 dot-all 标志(总共 / 是)。

.也会导致匹配字符串中的换行符。

于 2012-04-30T22:14:11.887 回答
1

看来您的正则表达式没有返回正确的结果。由于您只是在寻找第一次出现FROM并在此之后返回所有内容,为什么不直接使用stristr

$output = stristr($sql, 'FROM');    // $output includes 'FROM'
if ($output !== false)
{
    $query = $db->prepare("SELECT COUNT(*) {$output}");
    // etc.
于 2012-04-30T22:34:35.420 回答