PHP PDO 更新用户详细信息 - 如果输入为空则跳过
PHP PDO UPDATE user details - skip if input is blank
我写了一些 PHP PDO 代码让我的网站用户更新他们的详细信息。
该代码旨在跳过任何空白输入字段,仅更新用户已输入详细信息的字段。
它工作正常,除了密码字段。当我将所有表格留空并按 'Save' 时,除了仍然更改的密码外,一切都保持不变。
请看下面我的代码。
如果用户输入了新密码,我希望代码更新密码,否则我希望它保留已经在 mysql table 中的密码(密码经过哈希处理).
有人能告诉我正确的代码是什么吗?
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();
}
?>
简单。空白 space 也可以被散列,这就是为什么,所以...我们要设置一个空值,以便 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 与 trim()
函数值,因为空 space 被视为 'something' 并将传递 empty()
或 !== ''
过滤器和 NULLIF(val, '')
我写了一些 PHP PDO 代码让我的网站用户更新他们的详细信息。
该代码旨在跳过任何空白输入字段,仅更新用户已输入详细信息的字段。
它工作正常,除了密码字段。当我将所有表格留空并按 'Save' 时,除了仍然更改的密码外,一切都保持不变。
请看下面我的代码。
如果用户输入了新密码,我希望代码更新密码,否则我希望它保留已经在 mysql table 中的密码(密码经过哈希处理).
有人能告诉我正确的代码是什么吗?
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();
}
?>
简单。空白 space 也可以被散列,这就是为什么,所以...我们要设置一个空值,以便 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 与 trim()
函数值,因为空 space 被视为 'something' 并将传递 empty()
或 !== ''
过滤器和 NULLIF(val, '')