在准备好的语句中使用 space 传递参数
Pass parameter with a space in prepared statement
从我的 PHP 动态生成的准备好的语句(例如)如下所示:
SELECT COUNT(exuid) as result_count FROM full_db3 WHERE `Age Range` = :Age Range
Age Range
是我的专栏名称之一。
这里的问题是我的参数中 "Age" 和 "Range" 之间有 space,但我不确定如何处理这个问题。查询是这样动态生成的(只显示相关代码):
$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
,则一切正常。出于多种原因,我希望能够排除该下划线,因为我在 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 动态生成的准备好的语句(例如)如下所示:
SELECT COUNT(exuid) as result_count FROM full_db3 WHERE `Age Range` = :Age Range
Age Range
是我的专栏名称之一。
这里的问题是我的参数中 "Age" 和 "Range" 之间有 space,但我不确定如何处理这个问题。查询是这样动态生成的(只显示相关代码):
$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
,则一切正常。出于多种原因,我希望能够排除该下划线,因为我在 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)