2015-09-19 28 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