提交时无法在数据库中插入时间戳


Can't insert timestamp in database when submitting

我有这个表单和流程页面。
在表单页面上,有两个隐藏的输入 id 和 reg_time 值在"结束"处设置为 null 执行时 id 没有问题,但在我得到 0000-00-00 00:00:00 时间戳集reg_time行下在表用户中。有什么建议吗?

  function post($POST)
 {   
   $POST = array_map('trim', $_POST);
   $hash = "$2y$10$";
   $salt = "nekiludistringzahash22";
   $his = $hash . $salt;
   $POST['pass'] = crypt($_POST['pass'],$his);
   return $POST;  
 }
 $sql = "insert into users values(:" . implode(",:", array_keys(post($_POST))) . ");";


try{
     $db = new PDO('mysql:host=localhost;charset=utf8;dbname=dbname','root','');
     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 }catch (PDOException $e) 
{
     die("Conn problem " . $e->getMessage());
} 
$reg = $db->prepare($sql);
$reg->execute(post($_POST));

和形式

 <form action="exp2.php" method="post">
<input type="hidden" name="id" value="null">
<input type="text"name="uname">
<input type="text"name="pass">
<input type="text"name="name">
<input type="text"name="lname">
<input type="submit">
<input type="hidden" name="reg_time" value = "null">
</form>

你的问题很常见。

许多学习者无法从由四个字母"NULL"组成的字符串中分辨出NULL值。而后者绝对没有特殊意义。

还有坏消息:HTTP协议是基于文本的。这意味着使用 HTTP 方法只能发送字符串以外的任何内容,因此不能通过 HTTP POST 发送NULL值。

要使此代码正常工作,您必须在服务器端添加 NULL,就像您为密码执行此操作一样:

function post($POST)
{   
   $POST = array_map('trim', $_POST);
   $hash = "$2y$10$";
   $salt = "nekiludistringzahash22";
   $his = $hash . $salt;
   $POST['pass'] = crypt($_POST['pass'],$his);
   $POST['reg_time'] = NULL;
   $POST['id'] = NULL;
   return $POST;  
}

但是,这不是代码的主要问题。最糟糕的消息是,你的代码非常容易受到SQL注入的影响,尽管绑定看似正确。

为了安全起见,请使函数接受允许字段的列表,并为缺少的字段分配一个NULL值:

function post($allowed)
{   
    $post = array();
    foreach ($allowed as $key)
    {
       if (isset($_POST[$key])) $post[$key] = trim($_POST[$key]);
       else $_POST[$key] = NULL;
   }
   $hash = "$2y$10$";
   $salt = "nekiludistringzahash22";
   $his = $hash . $salt;
   $POST['pass'] = crypt($_POST['pass'],$his);
}

然后这样称呼它:

$post = post(array('id','uname','pass','name','lname','reg_time'));
$sql = "insert into users values(:" . implode(",:", array_keys($post)).");";
$reg = $db->prepare($sql);
$reg->execute($post);

这样,您将过滤掉所有字段名称。

作为奖励,您将能够为提交按钮分配自定义值;)