gpt4 book ai didi

PHP PDO UPDATE 用户详细信息 - 如果输入为空则跳过

转载 作者:行者123 更新时间:2023-11-29 02:54:02 25 4
gpt4 key购买 nike

我已经编写了一些 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();
}
?>

最佳答案

简单。空格也可以被散列,这就是为什么,所以......我们要设置一个空值,这样它就可以被 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();

或者像 PRO 一样使用三元组!

//...

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

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

$stmt->execute();

重要提示

请记住使用 trim() 函数值进行修剪,因为空格被认为是“某物”,并且会传递给 empty()!== ' ' 过滤器和 NULLIF(val, '')

关于PHP PDO UPDATE 用户详细信息 - 如果输入为空则跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32673800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com