下面的函数是我写的使用PDO将表单数据动态插入到db中,它捕获表单名称和值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;
}
}
,但我仍然得到纯密码插入到数据库
这是Mysql吗?如果是这样,有几种方法可以做到这一点,而不需要做一些基于代码的事情:
http://www.w3schools.com/sql/func_now.asp http://www.kbedell.com/writing-projects/在散列密码方面,在循环中监听密码的密钥,创建一个特殊情况,将插入值设置为散列值。您也可以创建一个通用的"clean"方法来传递所有的值——至少这个"clean"函数会为恶意注入代码转义所有的插入数据,并且它还可以进行任何特殊情况的转换,而不会使您所展示的插入方法变得混乱:
> 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的插入一起工作。
如果不是Mysql,其他数据库也有类似的方法,postgres的例子非常类似于w3schools方法
in loop检查key是否为password,然后像下面那样散列
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
(然后它将自动在该行上添加日期和时间)