PDO BindValue 不起作用,但适用于直接粘贴
PDO BindValue doesn't work but works with direct paste
所以我有一些代码
//passed as function param
$clause[2] = "'2016-09-09' AND '2016-09-09'"
$sql = "SELECT {$columns} FROM `{$table}` WHERE `{$clause[0]}` {$clause[1]} :clause";
$stm = $this->db->prepare($sql);
$stm->bindValue("clause", $clause[2]);
if ($stm->execute()) {
return $stm->fetchAll(PDO::FETCH_OBJ);
}
d
//echo'd $sql
SELECT * FROM `deliveries` WHERE `delivery-date` BETWEEN :clause
如果我将 $sql
中的 :clause
替换为原始输入,'2016-09-09' AND '2016-09-09'
那么它就可以正常工作。一旦我尝试使用 :clause 或使用 ?
绑定它,它就会失败。我不知道该怎么办:(谢谢你的帮助!
你不能像那样绑定整个表达式。绑定值不仅仅是字符串替换。您可以在 SQL 查询 only 中绑定一个值,您通常会在其中放置一个标量值。例如,如果 BETWEEN
谓词需要两个值,则需要两个占位符。
此外,您不得在绑定值中加上引号。占位符恰好表示一个标量值这一事实使得引号变得不必要。
看起来您正在尝试创建一个通用函数,以便您可以设置任何您想要的条件,并且您的 $clause
数组应该包含列、运算符和值。
您将不得不编写代码以针对 IN()
或 BETWEEN
:
等多值谓词以不同方式格式化 SQL
$column = $clause[0];
$operator = $clause[1];
$valuesArray = (array) $clause[2];
switch ($operator) {
case 'IN':
$expression = "(" . implode(",", array_fill(1, count($valuesArray), "?") . ")";
break;
case 'BETWEEN':
$expression = "? AND ?";
break;
default:
$expression = "?";
}
$sql = "SELECT {$columns} FROM `{$table}` WHERE `{$column}` {$operator} {$expression}";
$stm = $this->db->prepare($sql);
$stm->execute($valuesArray);
return $stm->fetchAll(PDO::FETCH_OBJ);
我懒得测试 execute() 的 return 值,因为你应该只启用 PDO::ERRMODE_EXCEPTION
.
所以我有一些代码
//passed as function param
$clause[2] = "'2016-09-09' AND '2016-09-09'"
$sql = "SELECT {$columns} FROM `{$table}` WHERE `{$clause[0]}` {$clause[1]} :clause";
$stm = $this->db->prepare($sql);
$stm->bindValue("clause", $clause[2]);
if ($stm->execute()) {
return $stm->fetchAll(PDO::FETCH_OBJ);
}
d
//echo'd $sql
SELECT * FROM `deliveries` WHERE `delivery-date` BETWEEN :clause
如果我将 $sql
中的 :clause
替换为原始输入,'2016-09-09' AND '2016-09-09'
那么它就可以正常工作。一旦我尝试使用 :clause 或使用 ?
绑定它,它就会失败。我不知道该怎么办:(谢谢你的帮助!
你不能像那样绑定整个表达式。绑定值不仅仅是字符串替换。您可以在 SQL 查询 only 中绑定一个值,您通常会在其中放置一个标量值。例如,如果 BETWEEN
谓词需要两个值,则需要两个占位符。
此外,您不得在绑定值中加上引号。占位符恰好表示一个标量值这一事实使得引号变得不必要。
看起来您正在尝试创建一个通用函数,以便您可以设置任何您想要的条件,并且您的 $clause
数组应该包含列、运算符和值。
您将不得不编写代码以针对 IN()
或 BETWEEN
:
$column = $clause[0];
$operator = $clause[1];
$valuesArray = (array) $clause[2];
switch ($operator) {
case 'IN':
$expression = "(" . implode(",", array_fill(1, count($valuesArray), "?") . ")";
break;
case 'BETWEEN':
$expression = "? AND ?";
break;
default:
$expression = "?";
}
$sql = "SELECT {$columns} FROM `{$table}` WHERE `{$column}` {$operator} {$expression}";
$stm = $this->db->prepare($sql);
$stm->execute($valuesArray);
return $stm->fetchAll(PDO::FETCH_OBJ);
我懒得测试 execute() 的 return 值,因为你应该只启用 PDO::ERRMODE_EXCEPTION
.