PHP PDO带有问号占位符和IF语句

时间:2013-09-23 00:04:00

标签: php mysql pdo prepared-statement

我试图使用问号占位符更新表格,基于此示例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( \"\"=\"\",电子邮件, xxxx@xxx.com)',…等等 在我看来,IF作为字符串而不是条件语句,有没有办法解决这个问题? 感谢

2 个答案:

答案 0 :(得分:0)

<?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);

?>

答案 1 :(得分:0)

与创建2个数组相反,我只创建一个包含所有变量的字符串,并在SQL中进行IF条件检查。 正如我之前所说,这是基于Kitet的example

<?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

?>

现在一切正常如预期:) 我希望这可以帮助其他人。