【问题标题】:PHP PDO UPDATE user details - skip if input is blankPHP PDO UPDATE 用户详细信息 - 如果输入为空则跳过
【发布时间】:2015-12-16 21:19:48
【问题描述】:

我编写了一些 PHP PDO 代码来让我的网站用户更新他们的详细信息。

该代码旨在跳过任何空白输入字段,仅更新用户已输入详细信息的字段。

除了密码字段外,它工作正常。当我将所有表单留空并按“保存”时,除了密码仍会更改之外,一切都保持不变。

请在下面查看我的代码。

如果用户输入了新密码,我希望代码更新密码,否则我希望它保留已经在 mysql 表中的密码(密码是散列的)。

有人能告诉我正确的代码是什么吗?

PHP

    <?php
require('../../../private_html/db_connection/connection.php');

session_start();
    $ID = $_SESSION['ID'];

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "UPDATE user_accounts SET first_name = COALESCE(NULLIF(:fname, ''),first_name), surname = COALESCE(NULLIF(:sname, ''),surname), display_name = COALESCE(NULLIF(:dname, ''),display_name), email = COALESCE(NULLIF(:email, ''),email), password = COALESCE(NULLIF(:password, ''),password) WHERE account_number='$ID'";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':fname', $_POST['fname']);
    $stmt->bindParam(':sname', $_POST['sname']);
    $stmt->bindParam(':dname', $_POST['dname']);
    $stmt->bindParam(':email', $_POST['email']);
    $stmt->bindParam(':password', password_hash($_POST['password'], PASSWORD_DEFAULT));
    $stmt->execute();

    $query = $conn->prepare("SELECT * FROM user_accounts WHERE account_number='$ID'");
    $query->execute();

        if(($row = $query->fetch())){
            $_SESSION['ID'] = $row['account_number'];
            $_SESSION['first_name'] = $row['first_name'];
            $_SESSION['surname'] = $row['surname'];
            $_SESSION['display_name'] = $row['display_name'];
            $_SESSION['email'] = $row['email'];
            header("Location: ../../myaccount/mydetails/mydetails.php");
        }
    }
catch(PDOException $e)
    {
        echo 'Connection failed: ' . $e->getMessage();
        exit();
    }
?>

【问题讨论】:

标签: php mysql pdo null sql-update


【解决方案1】:

简单。空格也可以被散列,这就是为什么,所以...我们要设置一个空值,这样它就可以被 NULLIF 函数检测为空:

$stmt->bindParam(':dname', $_POST['dname']);
$stmt->bindParam(':email', $_POST['email']);

//If the password IS NOT '' or 0 or '0' or NULL
if(!empty($_POST['password'])) {
    $pass = password_hash($_POST['password'], PASSWORD_DEFAULT);
} else {
    $pass = '';
}

$stmt->bindParam(':password', $pass);

$stmt->execute();

或者像专业人士一样使用三元组!

//...

$pass = !empty($_POST['password']) ? password_hash($_POST['password'], PASSWORD_DEFAULT) : '';

$stmt->bindParam(':password', $pass);

$stmt->execute();

重要提示

请记住使用 trim() 函数值进行修剪,因为空格被认为是“东西”,并将通过 empty()!== '' 过滤器和 NULLIF(val, '')

【讨论】:

  • 我现在觉得很傻!感谢这些答案,两者都有效。胡安用哪一个最好?
  • 两者都是一样的,使用三元运算来避免3行-if else-
  • 太好了,我想我会使用三元方法,如果它更短并且同样好的话。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
相关资源
最近更新 更多