2014-09-06 186 views
1

我有一個簡單的函數,它根據某些條件從數據庫表中返回一個計數。PHP PDO動態WHERE子句

function MyCount($strTable, $strCriteria) { 
    $strSQL = "SELECT COUNT(*) FROM " . $strTable . " "; 
    if (trim($strCriteria) != "") $strSQL .= "WHERE " . $strCriteria; 
    $results = mysql_query($strSQL, $objConn); 
    $row = mysql_fetch_array($results); 
    return $row[0]; 
} 

它非常有用的在1行代碼很快得到一個數值,例如:

$Users = MyCount("Users", "Deleted = 0"); 

不過,我現在想移動到PDO時遇到傳入分別爲麻煩參數化值。我試圖做類似下面的(不工作):

$objQuery=$objConn->prepare("SELECT count(*) as TheCount FROM :table_name WHERE :criteria"); 
$objQuery->bindParam(':table_name', $strTable); 
$objQuery->bindParam(':criteria', $strCriteria); 

我想最明顯的是:

$objQuery=$objConn->prepare("SELECT count(*) as TheCount FROM :table_name WHERE ".$strCriteria"); 
$objQuery->bindParam(':table_name', $strTable); 

但是,這似乎違背的參數化精神價值觀......有沒有人有任何其他建議?

感謝

+0

你能不能一個額外的參數添加到函數,$用戶= mycount的( 「TABLE」, 「標準」,「價值「);那麼你可以用PDO檢查... WHERE $ CRITERIA =:VALUE,然後綁定該值? – 2014-09-06 05:26:51

+0

好主意,但另一種方法的靈活性是我可以傳入更多complecx查詢 - 例如刪除= 0 AND(電子郵件='或OR電話='') – JezB 2014-09-06 05:31:03

+0

它很好,你切換到一個更好的擴展,無論如何,你可以綁定表名和列名,你只能在那裏輸入白名單 – Ghost 2014-09-06 05:37:51

回答

2

此行是問題:在PDO

$objQuery->bindParam(':table_name', $strTable); 

只能綁定值(field= :value)你不能綁定表名或列名或用戶定製的動態where子句。

所以你剛纔手動構建查詢:

SELECT count(*) as TheCount FROM `$strTable` WHERE $strCriteria 

function my_count($strTable, $strCriteria, $objConn) 
{ 
    $sql ="SELECT count(*) as TheCount FROM $strTable WHERE $strCriteria"; 
    $objQuery=$objConn->query($sql); 
    $row =$objQuery->fetch(); 

    return $row['TheCount']; 
} 


$Users = my_count("Users", "Deleted = 0", $objConn); 
+0

這是我認爲...但我不知道表名,非常感謝。 – JezB 2014-09-06 06:19:22

+0

工作,其他方式不適合我,tks。 – Florida 2015-10-22 02:59:28