Mysql PDO BindValue不';不起作用,但可直接粘贴

Mysql PDO BindValue不';不起作用,但可直接粘贴,mysql,pdo,bindvalue,Mysql,Pdo,Bindvalue,所以我有一些代码 //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]); i

所以我有一些代码

//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
中的
:子句
'2016-09-09'和'2016-09-09'
,那么它可以正常工作。只要我尝试使用:子句或使用
将其绑定,它就会失败。我不知道该怎么办:(感谢您的帮助!

您不能像那样绑定整个表达式。绑定值不仅仅是字符串替换。您可以仅在SQL查询中绑定一个值,通常在其中放置一个标量值。如果您需要两个值,例如
之间的
谓词,则需要两个占位符

此外,不能在绑定值中加引号。占位符只表示一个标量值这一事实使引号变得不必要

看起来您正在尝试生成一个通用函数,以便可以生成所需的任何条件,
$子句
数组应该包含列、运算符和值

对于多值谓词,如
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()的返回值因为您应该只启用
PDO::ERRMODE_EXCEPTION

您知道表达式和值之间的区别吗?您只能绑定值。没有其他内容。没有表名,没有列名,没有一些随机构造的动态SQL。这太微不足道了,会让人感到困惑。想法是您提供了很好的SQL,然后告诉他们MySQL“嘿,这里我想要值”,然后以
:param_name
和MySQL的形式放置好的占位符,将值视为字符串/int,并将整个内容粘贴到磁盘上。此外,您是否知道
composer
和公制吨库可以帮助您忘记手动执行PDO操作?感谢您的回复,现在已完全清除:)没有我应该意识到的表达哈哈。谢谢你的澄清!好吧,我很高兴我帮助了你。现在去做一些很棒的东西:)