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

может не добавить дополнительный параметр в функции $ Users = MyCount ("TABLE", "критерии", "VALUE «); то вы можете проверить с помощью PDO с помощью ... WHERE $ CRITERIA =: VALUE, а затем привязать значение? –

+0

Хорошая идея, но гибкость другого метода заключалась в том, что я мог бы передавать более полные запросы - например, Deleted = 0 AND (Email = '' OR Phone = '') – JezB

+0

Хорошо, что вы переключаетесь на лучшее расширение, в любом случае вы можете связывать имена таблиц и имена столбцов, вы можете вводить только белый список – Ghost

ответ

2

Эта линия является вопрос:

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

Вы можете только связать значения (field= :value) в PDO вы можете не имена связываются таблицы или имена столбцов или пользовательские динамического где положение.

Таким образом, вы просто построить запрос вручную:

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

+0

Работаю, другие способы не работают для меня, tks. – Florida

Смежные вопросы