提交时无法在数据库中插入时间戳
Can't insert timestamp in database when submitting
我有这个表格和流程页面。
在表单页面上,有两个隐藏的输入 id 和 reg_time 值在 "end " 处设置为 null 执行时 id 没有问题但在 reg_time 行下我得到 0000-00-00 00:00:00 时间戳设置
在 table 个用户中。
有什么建议吗?
function post($POST)
{
$POST = array_map('trim', $_POST);
$hash = "y$";
$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 = "y$";
$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 = "y$";
$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);
这样您将过滤掉所有字段名称。
作为奖励,您将能够为您的提交按钮分配自定义值 ;)
我有这个表格和流程页面。
在表单页面上,有两个隐藏的输入 id 和 reg_time 值在 "end " 处设置为 null 执行时 id 没有问题但在 reg_time 行下我得到 0000-00-00 00:00:00 时间戳设置
在 table 个用户中。
有什么建议吗?
function post($POST)
{
$POST = array_map('trim', $_POST);
$hash = "y$";
$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 = "y$";
$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 = "y$";
$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);
这样您将过滤掉所有字段名称。
作为奖励,您将能够为您的提交按钮分配自定义值 ;)