【问题标题】:PHP PDO dynamic WHERE clausePHP PDO 动态 WHERE 子句
【发布时间】:2014-09-06 05:15:46
【问题描述】:

我有一个简单的函数,它根据一些标准从数据库表中返回一个计数。

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,并且在将 were 作为参数化值传递时遇到了麻烦。我正在尝试执行以下操作(不起作用):

$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);

但是,这似乎与参数化值的精神背道而驰……还有其他建议吗?

谢谢

【问题讨论】:

  • 能不能不给函数加个额外的参数,$Users = MyCount("TABLE","CRITERIA","VALUE");那么您可以使用 ...WHERE $CRITERIA = :VALUE 检查 PDO,然后绑定值?
  • 好主意,但另一种方法的灵活性是我可以传递更复杂的查询 - 例如已删除=0 AND (Email='' OR Phone='')
  • 换个更好的扩展就好了,反正你可以绑定表名和列名,那里只能白名单输入
  • @Ghost:应该是“你可以绑定表名...”
  • @DanMan 抱歉打错了,是的,我的意思是 cannot,请原谅我的困惑

标签: php mysql sql pdo


【解决方案1】:

这一行是问题:

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

您只能在 PDO 中绑定值 (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);

【讨论】:

  • 这是我的想法……但我不知道表名,所以谢谢。
猜你喜欢
  • 2020-04-11
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2019-10-12
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多