2012-04-30 12 views
1

我在phpMyAdmin檢查這一點,它返回1個結果:奇怪的行數的回報/ MySQL的PDO

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做一個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; 
+0

'$ output [1]'看起來像什麼? – jeroen

+0

'var_dump(「SELECT COUNT(*)FROM {$ output [1]}」);' – zerkms

+0

@jeroen @zerkms由於某種原因,它現在開始返回$ rows = 7!和正則表達式的輸出是這樣的:'SELECT COUNT(*)FROM tbl_product_category'這是錯誤的 – Ozzy

回答

2

您RegeExp不匹配,它缺少了點狀所有標誌(/總共)。

這會導致.也與字符串中的換行符匹配。

+0

我想你錯過了'FROM'導致其與'SELECT'在同一行,但是我有一個'FROM'那裏。 – Ozzy

+0

的確,我做到了,對我感到羞恥。 – ccKep

+1

也許是因爲你錯過了regexp中的多行標誌?嘗試/ im而不是/ i – ccKep

1

看來你的正則表達式沒有返回正確的結果。由於您只查找FROM的第一個匹配項,並在此之後返回所有內容,爲什麼不使用stristr

$output = stristr($sql, 'FROM'); // $output includes 'FROM' 
if ($output !== false) 
{ 
    $query = $db->prepare("SELECT COUNT(*) {$output}"); 
    // etc.