【问题标题】:PHP PDO with question mark placeholders with an IF statement带有问号占位符和 IF 语句的 PHP PDO
【发布时间】: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


【解决方案1】:
<?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);

?>

【讨论】:

  • 在这种情况下不起作用,因为要更新的字段的数量是可变的,这就是为什么我认为最好的选择是检查 SQL。我试图做的是删除 IF 条件周围的那些引号。 PS。循环在链接中
  • 你无法将愚蠢的“做所有 - 闭眼”循环与像这里这样的特殊条件进行比较。只有contacts 的单一验证使“示例”完全无用。如果没有循环功能,它甚至会变得更加复杂。
  • 这很不幸,因为查询字符串几乎是我需要的,除了 IF 被视为文本而不是 SQL
【解决方案2】:

与创建 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

?>

现在一切都按预期工作了:) 我希望这对其他人有帮助。

【讨论】:

    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2013-03-21
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多