0

我试图通过在构建查询之前运行一些逻辑操作来使我的 PDO 查询动态化。

但是,当当前构建查询时,不会返回任何结果,因为我引用的列名用引号括起来(至少我相信这是问题所在),我将如何删除字符串周围的引号?

逻辑运算与查询

       // Logical comparison
       if($psiA >= $psiB){
            $highestPsi = "high_psi";
       } else {
            $highestPsi = "flow_psi";
       }

       if($gpmA >= $gpmB){
            $highestGpm = "high_gpm";
       } else {
            $highestGpm = "flow_gpm";
       }

       var_dump($highestGpm);
       var_dump($highestPsi);

       // Set up query variables
       if( $pVal <= 0 && $gVal <= 0) {
           $sql = "SELECT * FROM pumps WHERE pump_type = :pType AND :thePsi >= :pVal AND :theGpm >= :gVal AND pump_category = :cVal";
       } else {
           $sql = "SELECT * FROM pumps WHERE pump_type = :pType AND :thePsi >= :pVal AND :theGpm >= :gVal AND pump_category = :cVal";
           var_dump($sql);
       }

        // Build and execute query
       $stmt = $connection->prepare( $sql );

       $stmt->bindParam(':pType', $pType, PDO::PARAM_STR);
       $stmt->bindParam(':pVal', $pVal, PDO::PARAM_STR);
       $stmt->bindParam(':gVal', $gVal, PDO::PARAM_STR);
       $stmt->bindParam(':cVal', $cVal, PDO::PARAM_STR);
       $stmt->bindParam(':thePsi', $highestPsi, PDO::PARAM_STR);
       $stmt->bindParam(':theGpm', $highestGpm, PDO::PARAM_STR);

       $stmt->execute(array( 
                      'pType'   => $pType, 
                      'pVal'    => $pVal, 
                      'gVal'    => $gVal,
                      'cVal'    => $cVal,
                      'thePsi'  => $highestPsi,
                      'theGpm'  => $highestGpm
        ));

我知道转储正在返回正确的列名,我确定我需要执行某种正则表达式来去除引号以使其正常工作。

任何指针将不胜感激。

4

2 回答 2

1

PDO 的预处理语句只能表示数据文字。因此,开发人员必须自己处理标识符 - PDO 对此没有任何帮助

因此,您必须使用任何其他库而不是 PDO,例如safeMysql

$sql = "SELECT * FROM pumps WHERE 
        pump_type = ?s AND ?n >= ?s AND ?n >= ?s AND pump_category = ?s";
$data = $db->getAll($sql, $pType, $highestPsi, $pVal, $highestGpm, $gVal, $cVal);

或者您必须手动格式化您的标识符。要格式化标识符,必须应用以下两条规则:

  • 将标识符括在反引号中。
  • 通过将它们加倍来逃避内部的反引号。

在这样的格式化之后,将 $table 变量插入到查询中是安全的。因此,代码将是:

$psi = "`".str_replace("`","``",$highestPsi)."`";
$sql = "SELECT * FROM pumps WHERE pump_type = :pType AND $psi ...";
于 2013-08-28T14:40:02.720 回答
0

不,引号并不是真正的问题。问题是您无法绑定任何结构元素,例如列名或表名。您只能绑定sprintf如果您需要动态更改列名,则必须使用良好的旧字符串连接/ 。

于 2013-08-28T14:33:16.660 回答