2013-10-06 110 views
2

傍晚的人,MySQL查詢運行時沒有錯誤,但沒有填充數據庫

有另一個「看着這麼長的時刻」。

此代碼在運行時返回成功消息,但沒有任何數據輸入到數據庫表中,沒有錯誤被拋出,我知道從_post接收到所有正確的值,但我看不到有什麼問題,我有一個幾乎相同的查詢在另一個頁面上,它工作正常。

任何人都可以看到代碼的問題?

if (isset($_POST['username']) && $_POST['username'] !== '') 
{ 

    $salted = md5($_POST['pass1'] . 'salt'); 

    try 
    { 
    $sql = 'INSERT INTO users SET 
     username = :username, 
     firstname = :firstname, 
     lastname = :lastname, 
     email = :email, 
     password = $salted, 
     joined = CURDATE()'; 
    $s = $PDO->prepare($sql); 
    $s -> bindValue(':username', $_POST['username']); 
    $s -> bindValue(':firstname', $_POST['firstname']); 
    $s -> bindValue(':lastname', $_POST['lastname']); 
    $s -> bindValue(':email', $_POST['email']); 
    $s -> execute(); 

    } 
    catch (PDOException $e) 
    { 
    $error = 'Error adding submitted user.'; 
    echo $error; 
    exit(); 
    } 

    ?> <div class="alert alert-success">User added to the database.</div> <?php 

} 
+1

你的價值'$ salted'必須是單引號作爲一個字符串''$ salted''。雖然MD5哈希本質上是注入安全的,但您也可以像其他所有參數一樣將其綁定爲參數。 –

+3

@CORRUPT INSERT INTO ... SET在MySQL中有效,雖然不常用。這是您鏈接的文檔中的第二個語法示例。 –

+0

請知道MD5被認爲是一個非常弱的散列,不適合現代Web應用程序。 –

回答

1

在這裏總結評論,爲了有一個答案。標記的社區Wiki。

  • INSERT語句中的字符串應加引號。

    password = '$salted', 
    
  • 無論如何,您應該使用參數。

    password = :password, 
    
        . . . 
    
        $s -> bindValue(':password', $salted); 
    
  • MD5不是現代強密碼存儲的首選散列函數。 SHA1也不是。
    請嘗試使用SHA256或Bcrypt。

    $salted = hash('sha256', $_POST['pass1'] . 'salt'); 
    
  • 鹽醃是更好,如果你使用的每個用戶隨機鹽字符串。

  • 確保您的PDO實例是configured to throw exceptions

    $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    
  • 始終捕捉PDO異常的錯誤消息,即使你做不輸出給用戶。

    error_log($e->getMessage()); 
    
+0

感謝您的支持。非常感激。如果我沒有在我的PHP/MySQL知識中留下10年的差距,那麼事情會變得容易多了! :) – Holo

相關問題