如何在动态插入数据库时​​插入时间和日期

时间:2014-05-19 16:16:44

标签: php arrays oop pdo

下面的函数是我用PDO动态地将表格数据插入数据库的过程,它抓取表单名称和值attr来填充PDO insert语句中的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 个答案:

答案 0 :(得分: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);
>                   }
>                 }

clean看起来像:

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 :(得分: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');

或在表格中将日期时间列设为timestamp(然后它会自动在该行上添加日期和时间)