【发布时间】:2013-09-23 00:04:00
【问题描述】:
我尝试使用问号占位符更新表,大致基于此示例link 现在问题是我只想在变量有值时更新。 当使用命名的占位符时,这样的事情可以按预期工作:
$contactDetails= $db_con->prepare("UPDATE `userData` SET
`name`= :name,
`submitDate`= :submitDate,
`contacts`= IF(:contacts = '', `contacts`, :contacts),
`email`= :email
WHERE `submit_id`= :submit_id");
现在在这种情况下,我使用问号占位符,基于上面提到的示例,并执行如下语句
$this_query= $db_con->prepare($query);
$this_query->execute($values);
所以我将$values[]=$v; 更改为$values[]= 'IF(""="",'.$k.','.$v .')';
并且它没有像例外那样执行,整个字符串被添加到数据库行中,包括 'IF...。
查看查询日志时显示
UPDATE userData SET email = 'IF( \"\"=\"\",email, xxxx@xxx.com)',…等等
在我看来,IF 是作为字符串而不是条件语句,有没有办法解决这个问题?
谢谢
【问题讨论】:
-
此
IF(""="",'.$k.','.$v .')';被视为文本/数据,而不是 SQL。这就是你使用准备的原因,对吧!? -
我觉得
WHERE .. AND contacts = ''会更合适? (我不完全确定如何阅读这个问题 - 关于正在检查哪个值等 - 但它应该可以仅使用 WHERE 子句来解决,或者,如果要检查的值是 in i> PHP,那么如果不合适就不要执行 DML。) -
@djot 我怎么能把它作为 SQL 而不是文本/数据?因为除此之外其他一切都很好......
-
@user2246674 我不确定你的意思?被检查的值来自一个 php var,但它必须进入,因为它在 $possible 数组中,如果你查看链接你会明白我的意思。
-
那么,您只想在给定变量(是哪个?
$k,$v)不为空时更新(设置新数据)contacts?
标签: php mysql pdo prepared-statement