2014-05-19 115 views
0

下面的函數是我使用PDO將表單數據動態插入到數據庫中的函數,它捕獲表單名稱和值attr以在PDO插入語句中填充cols和bindValues。我現在的問題是這樣的:如何在動態插入數據庫時​​插入時間和日期

我想在插入之前散列密碼,並且同時插入時間和日期。

public function reg_user($data) { 
      if($_SERVER['REQUEST_METHOD'] == 'POST'){ 
       $dataDB = array(); 
       foreach ($_POST as $k => $v) { 
        if (in_array($k,$this->valid_keys)) { 
        $dataDB[$k] = $v; 
        } 
       } 
     $this->cols = '`'.implode('`, `', array_keys($dataDB)).'`' ; 
     $this->values = ':' . implode(", :", array_keys($dataDB)); 
     $db = new db; 
       try{ 
        $stmt = $db->dbh->prepare ("INSERT INTO $this->table ($this->cols) VALUES ($this->values)"); 
        foreach ($dataDB as $k => $v) { 
          $stmt -> bindValue(':'.$k, $v); 
       } 
    $stmt->execute(); 
} catch (PDOException $e) { 
    $error = new Errors(); 
    echo "<b>".$error->displayError($e)."</b>"; 
} 

} 
} 

我修改了foreach循環在這個

foreach ($_POST as $k => $v) { 
        if (in_array($k,$this->valid_keys)) { 
        if($k == 'password'){ 
         $v = password_hash($v , PASSWORD_DEFAULT); 
        } 
        $dataDB[$k] = $v; 
        } 
       } 

,但我仍然得到明文口令插入到數據庫中。

回答

2

這是Mysql嗎?如果是的話有幾種方法可以做到這一點,而不做一些基於代碼:

http://www.w3schools.com/sql/func_now.asp

http://www.kbedell.com/writing-projects/

在散列密碼,在你的循環而言,監聽密碼的密鑰創建一個特殊的情況下,您將插入值設置爲哈希值。你也許可以創建一個通用的「乾淨」方法,你也可以傳遞所有的值 - 至少這個「乾淨的」函數可以逃避所有插入惡意注入代碼的數據,它也可以做任何特殊情況轉換而不會混淆插入方法告訴你:

> foreach ($_POST as $k => $v) { 
>     if (in_array($k,$this->valid_keys)) { 
>      $dataDB[$k] = clean($k, $v); 
>     } 
>     } 

乾淨可能類似於:

function clean($key, $val){ 
    if($key=="password") 
    { 
    $val = //hash pword here 
    } 
    return addslashes($val); //using addslashes as basic example 
} 

我發誓,我已經寫代碼,看起來幾乎相同,你的過去。這是一個很好的方法。你確實遇到了每個密鑰的特殊情況問題,例如你的密碼,因此自動化日期等內容可能會有所幫助。

或者,您可以在插入每條記錄時使用Now()。它稍微不太優雅,並且不適用於這些ORM-ish插入。

如果不是Mysql其他dbs有類似的方法,postgres的例子與w3schools方法非常相似。

1
在迴路校驗

如果密鑰在密碼哈希它像下面

foreach ($_POST as $k => $v) { 

    if (in_array($k,$this->valid_keys)) { 
    $dataDB[$k] = ($k=="password")?md5($v):$v; 
    } 
} 
//here add the date to the array like below 

$dataDB["datetime"]=date('d-m-y H:i:s'); 

或使datetime列作爲timestamp在你的表(然後它會自動添加該行的日期和時間)