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

Posted

技术标签:

【中文标题】提交时无法在数据库中插入时间戳【英文标题】:Can't insert timestamp in database when submitting 【发布时间】:2016-11-19 23:05:13 【问题描述】:

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

  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 那么你期望什么? 为什么id没问题? &lt;input type="hidden" name="reg_time" value = "null"&gt; 如果您想要当前日期,请使用NOW() 为什么插入reg_time null? 可能 id 在表users 中设置为唯一的自动增量。要获取时间戳,请尝试使用 null CURRENT_TIMESTAMP 【参考方案1】:

您的问题很常见。

许多学习者无法从由四个字母“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;  

但是,这不是您的代码的主要问题。最糟糕的消息是您的代码是severely vulnerable to sql injection,尽管绑定看似正确。

为了安全起见,请让您的函数接受允许字段列表,并将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);

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

作为奖励,您可以为提交按钮分配自定义值;)

【讨论】:

以上是关于提交时无法在数据库中插入时间戳的主要内容,如果未能解决你的问题,请参考以下文章

在时间戳列中插入 Null 时,雪花复制到失败

当数据重复且我没有时间戳时避免重复插入的建议

将日期插入 MySQL 数据库时如何忽略时间戳

oracle插入数据时怎么插入当前时间

java.sql.SQLException:ORA-00932:不一致的数据类型:预期 DATE 在插入 Null 时间戳时得到 BINARY

将数据插入另一个表时触发以更新带有时间戳的表