PDO,检查空字符串,如果为空则不更新


PDO, check for empty string and don't update if empty

如果我在没有任何参数的情况下edit_profile()运行我的函数,那么空字符串将写入数据库。例如,如果$input['email']为空,我希望UPDATE不更新此列。

我尝试做:

SET email = IF(LENGTH(:email)=0, email, :email),

它不起作用,我不确定如何使用 PDO 执行上述操作。

function edit_profile($input) {
    //
    $user_id = 1;
    //
    try {
    //
        $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USERNAME, DB_PASSWORD);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $conn->prepare('UPDATE users SET
                                    email = :email,
                                    password = :password,
                                    name_surname = :name_surname,
                                    age = :age,
                                    sex = :sex,
                                    education = :education,
                                    avatar = :avatar
                                    WHERE id = :id');

                $stmt->execute(array(
                    ':id'           => $user_id,
                    ':email'        => $input['email'],
                    ':password'     => $input['password'],
                    ':name_surname' => $input['name_surname'],
                    ':age'          => $input['age'],
                    ':sex'          => $input['sex'],
                    ':education'    => $input['education'],
                    ':avatar'       => $input['avatar']
                ));

        echo $stmt->rowCount(); // 1
    //
    } catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    }
    //
}
edit_profile();

尝试

UPDATE users SET
email = COALESCE(NULLIF(:email, ''),email),
password = :password,
name_surname = :name_surname,
age = :age,
sex = :sex,
education = :education,
avatar = :avatar
WHERE id = :id

我基本上是在尝试使用 COALESCE (http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce) 仅在不为空的情况下使用 :email。如果为 null,请使用旧email

如果:email是空字符串而不是简单的NULL,我添加了NULLIF将空字符串转换为NULL ;)

SET email = IF(LENGTH(:email1)=0, email, :email2)
$stmt->execute(array(
                ':id'           => $user_id,
                ':email1'        => $input['email'],
                ':email2'        => $input['email'],
                ':password'     => $input['password'],
                ':name_surname' => $input['name_surname'],
                ':age'          => $input['age'],
                ':sex'          => $input['sex'],
                ':education'    => $input['education'],
                ':avatar'       => $input['avatar']
));