有没有办法在SQL Update语句中添加PHP IF语句

时间:2014-01-23 21:00:22

标签: php mysql

这是来自个人资料更新页面;因此,如果某人将email2从tom@aol.com更改为tommy@aol.com,我希望将email2_verified重置为unverified

我的代码是..

    $updateSQL = sprintf("UPDATE user SET uname=%s,email=%s, email2=%s  WHERE `uid`=%s && `pass_code`=%s",
            GetSQLValueString($_POST['uname'], "text"), 
            GetSQLValueString($_POST['email'], "text"),
            GetSQLValueString($_POST['email2'], "text"),
            GetSQLValueString($_POST['uid'], "int"),
            GetSQLValueString($password, "text"));

我还有一个字段email2_verified;目标是..如果email2发生了变化,我想要unverified; 有没有办法在sql语句中添加if语句,其作用类似于以下代码..?

    $updateSQL = sprintf("UPDATE user SET uname=%s,email=%s, email2=%s  
    WHERE `uid`=%s && `pass_code`=%s,email2_verified=%s",


    if($_POST['email2']){ // **has not changed** 
    GetSQLValueString($_POST['uname'], "text"),
    GetSQLValueString($_POST['email'], "text"), 
    }        

    if($_POST['email2']){ //**has changed**                
     GetSQLValueString("unverified","text"),
    }

    GetSQLValueString($_POST['email2'], "text"),
    GetSQLValueString($_POST['uid'], "int"),
    GetSQLValueString($password, "text"));

我猜(最常见的方式是)我可能需要创建一个在update语句之前运行的select语句并且

    if htmlentities($post['email2']) <> $row['email2']
            use update statement 1 
    else
            use update statement 2

是最好的方法还是有一个我不知道的PHP功能可以动态做到这一点?

3 个答案:

答案 0 :(得分:2)

您可以通过使用预先准备好的陈述来达到此目的。

意味着:您将使用占位符创建查询。然后你可以这样写:

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");

if(condition) {
    $stmt->bind_param('sssd', $code, $language, $official, $percent);
} else {
    $stmt->bind_param('abc', dbc, $language2, $officia2l, $percent2);
}
$stmt->execute;

检查此链接以获取有关语句的更多信息:

https://php.net/manual/de/mysqli-stmt.bind-param.php

答案 1 :(得分:1)

您可以在MySQL中创建一个触发器。

DELIMITER //

CREATE TRIGGER detect_email_change BEFORE UPDATE ON user FOR EACH ROW
  BEGIN
    IF NEW.email2 != OLD.email2 THEN
      SET NEW.email2_verified = "unverified";
    END IF;
  END;//

DELIMITER ;

然后你只需要更新email2字段,触发器将处理其余的事情。

答案 2 :(得分:0)

就这样做(我正在使用你的代码):

<?php   

  if ($_POST['email2']) { 
    // has changed

    $sql = "UPDATE user SET uname=%s,email=%s, email2=%s " .  
           ",email2_verified=%s " . 
           "WHERE `uid`=%s && `pass_code`=%s";

    $updateSQL = sprintf(
      $sql,
      GetSQLValueString($_POST['uname'], "text"),
      GetSQLValueString($_POST['email'], "text"),
      GetSQLValueString("unverified","text")
      GetSQLValueString($_POST['email2'], "text"),
      GetSQLValueString($_POST['uid'], "int"),
      GetSQLValueString($password, "text")
    );



  } else {

    $sql = "UPDATE user SET uname=%s,email=%s, email2=%s " .  
           "WHERE `uid`=%s && `pass_code`=%s";

    $updateSQL = sprintf(
      $sql,
      GetSQLValueString($_POST['uname'], "text"),
      GetSQLValueString($_POST['email'], "text"),
      GetSQLValueString($_POST['email2'], "text"),
      GetSQLValueString($_POST['uid'], "int"),
      GetSQLValueString($password, "text")
    );

  }

如果您需要SQL解决方案,请使用Kouber Saparev answer