Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在prepared语句中用空格传递参数_Php_Mysql_Pdo_Prepared Statement - Fatal编程技术网

Php 在prepared语句中用空格传递参数

Php 在prepared语句中用空格传递参数,php,mysql,pdo,prepared-statement,Php,Mysql,Pdo,Prepared Statement,作为示例,从my PHP动态生成的prepared语句如下所示: SELECT COUNT(exuid) as result_count FROM full_db3 WHERE `Age Range` = :Age Range 年龄范围是我的列名之一 这里的问题是在我的参数中有介于年龄和范围之间的空间,但我不确定如何处理这个问题。查询是动态生成的,因此仅显示相关代码: $all_attributes = $_POST['attris']; $sql = "SELECT COUNT(ex

作为示例,从my PHP动态生成的prepared语句如下所示:

SELECT COUNT(exuid) as result_count FROM full_db3 WHERE `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();

如果我将DB中的列名更改为Age_范围,那么一切都可以正常工作。出于许多原因,我希望能够排除该下划线,因为我在select中显示了我的列名,而所有的下划线看起来都很糟糕

用我的想法,从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)

在生成查询时,不能在条件的右侧用下划线替换空格吗?或者参数名必须与php mysql库中的字段名匹配吗?:。str_replace“”,''.',$key难道你就不能用@Drew-Through来修复这个模式吗;最好将字段名定制为在查询中使用,而不是输出。当结果中的字段实际显示时,您总是可以在其中使用别名。只是想知道fred是如何在带有“`”的注释中这样做的。高于我的工资等级。特别是在我欠他20加元之后。这不管用。我怀疑这是因为查询是如何执行的。查看我编辑过的答案,它显示了这是如何做到的。我想参数与键的名称是否相同并不重要,只要传递了正确的值。@jonmrich是的,因为参数名称已更改,所以也需要更改。请参阅编辑。与编辑完美配合!非常感谢。现在…你能告诉我为什么这样我就不会再问同样的问题了吗?我想不到它在有或没有编辑的情况下都会这样工作。@jonmrich:prefixed部分是您的参数名;所附的是字段名。您的参数名称也可以是:p1、:p2等。。。通过预处理,您可以使查询只需要解析一次,但在这种情况下没有任何好处;参数通过为您执行所有特殊字符转义,使您的参数更安全。感谢您提供的额外信息。在这里,我肯定还有很多东西要学。