通过php在mysql中使用空值更新datetime
我用这段代码将我的datatime字段更新为NULL, php版本7.3.7通过php在mysql中使用空值更新datetime,php,mysql,Php,Mysql,我用这段代码将我的datatime字段更新为NULL, php版本7.3.7 if($_POST['value']=='0000-00-00 00:00:00'){ $timestamp=NULL; }else { $dateTime = $_POST['value']; $timestamp = date('Y-m-d H:i', strtotime($_POST['value'])); } $query="update forms s
if($_POST['value']=='0000-00-00 00:00:00'){
$timestamp=NULL;
}else {
$dateTime = $_POST['value'];
$timestamp = date('Y-m-d H:i', strtotime($_POST['value']));
}
$query="update forms set $_POST[limitInputField]='$timestamp' where formid='$_POST[formId]'";
$result=$dbCnn->query($query)or die($dbCnn->error);
当$timestamp为空时,它给出错误:
第1行的farsifor\m.forms.enddate列的datetime值“”不正确
但当我在查询中引用“NULL”并删除$timestamp左右的引号时,如果
$timestamp为null,它可以正常工作,但如果$timestamp值不为null,则会出现错误
if($_POST['value']=='0000-00-00 00:00:00'){
$timestamp="NULL";
}else {
$dateTime = $_POST['value'];
$timestamp = date('Y-m-d H:i', strtotime($_POST['value']));
}
$query="update forms set $_POST[limitInputField]=$timestamp where formid='$_POST[formId]'";
$result=$dbCnn->query($query)or die($dbCnn->error);
您可以通过对代码稍作更改来解决此问题(请注意单引号和双引号): 这样,如果在时间戳中设置空值,查询将如下所示:
update forms set limitInputField=NULL where formid='123'
update forms set limitInputField='2019-09-03 17:08' where formid='123'
但是如果你把一个值放进去,它会是这样的:
update forms set limitInputField=NULL where formid='123'
update forms set limitInputField='2019-09-03 17:08' where formid='123'
重要的是要注意,在设置值时,NULL周围没有引号,但日期周围有引号。学习使用准备好的语句;并且不要注入post变量来“构建”查询。尽管如此: 你可以使用方便。在以下示例中,特定值
0000-00-00 00:00:00
将转换为空值:
UPDATE forms SET col = NULLIF(:timestamp, '0000-00-00 00:00:00') WHERE formid = :formid
或者你可以简单地:
UPDATE forms SET col = :timestamp WHERE formid = :formid
并使用PHP传递包含字符串的变量。使用准备好的语句。NULL与空字符串不同,因此它出错。使用准备好的语句可以绕过这个问题。这是使用说明,还有其他方法吗?我的代码在PHP5.6中正常工作。但是7.3.7中没有,在mysql中你可以使用now()函数,我很惊讶它在5.6中可以工作。预处理语句和参数绑定是将数据传递到SQL查询中最安全的方法,可以避免大量麻烦。由于您留下了SQL注入漏洞,这个答案可能会被否决。为了便于理解,我只是基于他的代码。另外,要让SQL注入通过日期函数工作,必须是一个非常聪明的黑客P(但谢谢你指出这一点。我是新来这里投稿的。)关于
$\u POST[limitInputField]
呢<代码>$\u POST[formId]?始终使用准备好的语句。如何在prapare语句中使用这种查询?