带有问号占位符和IF语句的PHP PDO
我试图使用问号占位符更新一个表,松散地基于这个示例,现在的问题是我只想在变量有值时更新。 当使用命名的占位符时,类似这样的操作会如预期的那样起作用:带有问号占位符和IF语句的PHP PDO,php,mysql,pdo,prepared-statement,Php,Mysql,Pdo,Prepared Statement,我试图使用问号占位符更新一个表,松散地基于这个示例,现在的问题是我只想在变量有值时更新。 当使用命名的占位符时,类似这样的操作会如预期的那样起作用: $contactDetails= $db_con->prepare("UPDATE `userData` SET `name`= :name, `submitDate`= :submitDate, `contacts`= IF(:contacts = '', `co
$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[]='如果(“=”,
'.$k.,'.$v.')代码>
除此之外,它不会执行,整个字符串将添加到数据库行中,包括“IF…”
当查看查询日志时,它显示
更新用户数据集电子邮件='如果(\“\”=\“\”,
电子邮件,xxxx@xxx.com)“,…
等等
在我看来,IF是作为一个字符串而不是一个条件语句,有没有办法解决这个问题?
谢谢
与创建两个数组相反,我只创建一个字符串,其中包含所有变量,并在SQL中执行IF条件检查。
正如我之前所说,这是基于Kitet的这一点
<?php
$values=array();
//this will be an array of possible fields that are in your table
$possible=array('field1', 'field2', 'field3');
$i=0;
$len=count($_POST);
$query='update table_name set ';
foreach($_POST as $key => $value){
$k=htmlspecialchars($key);
$v=htmlspecialchars($value);
if(in_array($k, $possible)){
$query .= '`' .$k .'`' .'= IF("'.$v .'"= "", `' .$k .'`, "' .$v .'")'; //changes here!!!
if($i < ($len-1)) $query .= ', ';
$i++;
}
}
$query .= 'where table_id = '.$table_id;
$update_data= $db_con->prepare($query); // I prepare the statement here as a safety net
$update_data->execute(); // the execute it
?>
现在所有的工作都如期进行:)
我希望这能帮助其他人。这IF(“=”、“.k.”、“.v.”)代码>被视为文本/数据,而不是SQL。这就是为什么你要用prepares,对吧!?我想,WHERE。。联系人=''
更合适吗?(我不完全确定如何阅读这个问题——关于检查哪个值,等等——但应该使用WHERE子句来解决这个问题,或者,如果要检查的值是PHP中的值,那么如果不合适,就不要执行DML。)@djot我怎么能将其作为SQL而不是文本/数据来获得呢?因为除此之外其他一切都很好…@user2246674我不知道你的意思是什么?正在检查的值来自php变量,但它必须进入,因为它在$APPLIBE数组中,如果您查看链接,就会明白我的意思。因此,您只想在给定变量(哪一个?$k
,$v
)不为空时更新(将新数据设置为)contacts
,在这种情况下不起作用,因为要更新的字段的数量是可变的,所以我认为最好的办法是签入SQL。我想做的是删除IF条件周围的引号。注:循环在链接中,你无法将愚蠢的“全神贯注”循环与这里这样的特殊情况进行比较。只有对联系人的这一次验证
使“示例”完全无用。如果没有循环功能,它会变得更加复杂。不幸的是,查询字符串几乎和我需要的一样,只是IF被视为文本而不是SQL
<?php
$values=array();
//this will be an array of possible fields that are in your table
$possible=array('field1', 'field2', 'field3');
$i=0;
$len=count($_POST);
$query='update table_name set ';
foreach($_POST as $key => $value){
$k=htmlspecialchars($key);
$v=htmlspecialchars($value);
if(in_array($k, $possible)){
$query .= '`' .$k .'`' .'= IF("'.$v .'"= "", `' .$k .'`, "' .$v .'")'; //changes here!!!
if($i < ($len-1)) $query .= ', ';
$i++;
}
}
$query .= 'where table_id = '.$table_id;
$update_data= $db_con->prepare($query); // I prepare the statement here as a safety net
$update_data->execute(); // the execute it
?>