2014-05-19 80 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在你的表(然后它会自动添加该行的日期和时间)