【问题标题】:Pass parameter with a space in prepared statement在准备好的语句中传递带有空格的参数
【发布时间】:2023-03-12 22:19:01
【问题描述】:

从我的 PHP 动态生成的预处理语句(例如)如下所示:

SELECT COUNT(exuid) as result_count FROM full_db3 WHERE `Age Range` = :Age Range

Age Range 是我的列名之一。

这里的问题是在我的参数中“年龄”和“范围”之间有空格,但我不知道如何处理这个问题。查询是这样动态生成的(仅显示相关代码):

$all_attributes = $_POST['attris'];
    $sql = "SELECT COUNT(exuid) as result_count FROM {$table}";
    $any_condition = false;
    foreach($all_attributes as $key=>$val) {

       if (!empty($val) && in_array($key,$validKeys)) {
         if ($any_condition) {
           $sql .= ' AND `'.$key.'` = :'.$key;
         } else {
           $sql .= ' WHERE `'.$key.'` = :'.$key;
           $any_condition = true;
         }
       }
    }




 $stmt = $dbh->prepare($sql);

    foreach($all_attributes as $key=>$val) {

   if (!empty($val)  && in_array($key,$validKeys)) {
     $stmt ->bindValue(':'.$key, $val, PDO::PARAM_STR);
   }
}

$stmt->execute();

如果我将数据库中的列名更改为Age_Range,一切正常。出于多种原因,我希望能够排除该下划线,因为我在选择中显示我的列名并且所有下划线看起来都很糟糕。

【问题讨论】:

  • 在构建查询时,您不能在条件的右侧用下划线替换空格吗?还是参数名称必须与该 php mysql 库中的字段名称匹配?
  • ":" . str_replace(' ', '_', $key)
  • 你不能只修复架构
  • 我同意@Drew;最好为查询而不是输出定制字段名称。当实际显示结果时,您始终可以为结果中的字段添加别名。
  • 只是想知道 fred 在带有 ``` 的 cmets 中是如何做到的。高于我的工资等级。尤其是在我欠他 20 美元(加元)之后。

标签: php mysql pdo prepared-statement


【解决方案1】:

使用我的想法,并从 u_mulder 的评论中复制语法,这应该可行吗?

$all_attributes = $_POST['attris'];
$sql = "SELECT COUNT(exuid) as result_count FROM {$table}";
$any_condition = false;
foreach($all_attributes as $key=>$val) {

   if (!empty($val) && in_array($key,$validKeys)) {
     if ($any_condition) {
       $sql .= ' AND `'.$key.'` = :'.str_replace(' ', '_', $key);
     } else {
       $sql .= ' WHERE `'.$key.'` = :'.str_replace(' ', '_', $key);
       $any_condition = true;
     }
   }
}

它保留字段名称,只更改参数名称。

但是这个

$stmt ->bindValue(':'.$key, $val, PDO::PARAM_STR)

可能也需要改成这个

$stmt ->bindValue(':'.str_replace(' ', '_', $key), $val, PDO::PARAM_STR)

【讨论】:

  • 由于某种原因这不起作用。我怀疑这是因为查询的执行方式。查看我编辑的答案,该答案显示了这是如何完成的。我想参数是否与key同名真的没关系,只要传递正确的值即可。
  • @jonmrich 是的,由于参数名称已更改,因此也需要更改。见编辑。
  • 与编辑完美配合!谢谢你。现在......你能告诉我为什么这有效,这样我就不会再问同样的问题了吗?我不会想到它会像这样工作(无论有没有编辑)。
  • @jonmrich : 前缀部分是您的参数名称; ` 括起来的是字段名称。您的参数名称可以很容易地是:p1:p2 等...通过prepareing,您可以这样做,因此查询只需要解析一次(尽管在这种情况下没有任何好处;参数使您通过为您转义所有特殊字符,参数更安全。
  • 感谢您提供额外信息。在这里我肯定还有很多东西要学。
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多