如何使用PHP插入查询将当前时间戳插入到MySQL数据库?

46

在我的MySQL数据库中,我有一个具有以下结构的表

username - varchar
insert_time - timestamp

这个表是在MySQL中使用phpMyAdmin工具创建的,对于insert_time列,我将默认值设置为0000-00-00 00:00:00

现在的问题是,我需要稍后使用PHP脚本将此默认值更新为当前时间戳。

我尝试使用以下PHP代码:

$update_query = 'UPDATE db.tablename SET insert_time=now() '.
                'WHERE username='.$somename;

运行 PHP 脚本时失败,并无法将任何内容插入数据库。

我做错了什么?


如果插入查询失败(在查询中使用“or die()”),我已经设置了自定义错误消息来显示。 - arun nair
6个回答

56

你收到了什么错误信息?

我猜测你实际上的错误是因为你的 PHP 变量没有用引号括起来。请尝试这样做:

$update_query = "UPDATE db.tablename SET insert_time=now() WHERE username='" .$somename . "'"; 

5
是的!这就是问题所在。我想我现在应该睡觉了,因为这里已经是印度标准时间的深夜了。否则,这些问题会在整个代码中蔓延开来! - arun nair
4
现在使用NOW()是多余的,请使用UNIX_TIMESTAMP()。 - Nitin Bansal
@NitinBansal,你能提供一个MySQL的链接,证明它已经被弃用了吗?我找不到任何证据来支持你的说法。 - Ash Burlaczenko
@AshBurlaczenko他没有说它已被弃用。他说它是多余的。 - Lee Fuller
@LeeFuller,"redundant" 的意思是某个东西可以在没有另一个东西的情况下正常工作。NitinBansal 建议替换 now() 而不是删除它,因此我认为他们可能把词用错了。 - Ash Burlaczenko
很抱歉,这个 SQL 存在 SQL 注入漏洞,请小心。 - Rafal Kozlowski

17

这种格式用于获取当前时间戳并存储在 MySQL 中。

$date = date("Y-m-d H:i:s"); 

$update_query = "UPDATE db.tablename SET insert_time=".$date." WHERE username='" .$somename . "'"; 

15

您对于now()函数的使用是正确的。然而,您需要在整个查询语句周围使用一种引号类型,并在值周围使用另一种引号类型。

您可以修改查询语句,在开头和结尾处使用双引号,并在$somename周围使用单引号:

$update_query = "UPDATE db.tablename SET insert_time=now() WHERE username='$somename'";

3
这是解决方案,但插入数据库查询之前,你应该始终对变量进行转义。请参考 PDO http://php.net/pdo 作为数据库抽象层来协助处理此问题,或者至少在插入变量之前运行 mysql_real_escape_string($somename)。 - mjec
@mjec:你说得对,但我没有加上它是为了避免混乱。原始帖子可能在处理此行之前转义输入,或者这根本不是用户输入。 - George Cummins
更好:UNIX_TIMESTAMP() - Nitin Bansal

10

忘记将变量用引号括起来放入SQL语句中。

 $update_query = 
      "UPDATE db.tablename SET insert_time=NOW() WHERE username='" .$somename."'";

1

1

我不喜欢这些解决方案。

这是我如何做到的:

$update_query = "UPDATE db.tablename SET insert_time=now() WHERE username='" 
            . sqlEsc($somename) . "' ;";

然后我使用了自己的sqlEsc函数:

function sqlEsc($val) 
{
    global $mysqli;
    return mysqli_real_escape_string($mysqli, $val);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接