2015-09-19 39 views
2

我已经编写了一些PHP PDO代码来让我的网站用户更新其详细信息。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(); 
    } 
?> 

回答

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(); 

还是不喜欢它与一个PRO三元!

//... 

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

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

$stmt->execute(); 

重要提示

记住与trim()函数值修剪,因为空的空间被认为是“东西”,并通过empty()!== ''过滤器和NULLIF(val, '')

+0

我现在觉得傻了!感谢这些答案,这两个工作。哪一个最适合使用Juan? – CyrilWalrus

+0

两者都是一样的,三元操作用于避免3行 - if else- –

+1

非常好,我想我会使用三元法,那么如果它更短并且一样好。再次感谢您的帮助! – CyrilWalrus