我试图使用问号占位符更新表格,松散地基于此示例链接,现在问题是我只想在变量有值时更新。使用命名占位符时,如下所示:
$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( '"'"='"'",
电子邮件, xxxx@xxx.com)',…
等在我看来,IF 是作为字符串而不是条件语句,有没有办法解决这个问题?谢谢
<?php
$values = ARRAY();
$sql_query = "UPDATE `userData` SET `name`= ?, `submitDate`= ?, ";
$values[] = $variable_name; //:name, now ?
$values[] = $variable_date; //:submitDate, now ?
if (!empty($v)) {
$sql_query .= "`contacts`= ?,";
$values[] = $v; //:contacts, now ?
}
$sql_query .= "`email`= ? WHERE `submit_id`= ?;";
$values[] = $variable_email; //:email, now ?
$values[] = $variable_submit_id; //:submit_id, now ?
$contactDetails= $db_con->prepare($sql_query);
$this_query->execute($values);
?>
与创建 2 个数组相反,我只创建一个包含所有变量的字符串,并在 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
?>
现在一切都按预期工作:)我希望这对其他人有所帮助。