Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有问号占位符和IF语句的PHP PDO_Php_Mysql_Pdo_Prepared Statement - Fatal编程技术网

带有问号占位符和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

?>