2014-09-06 142 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