MySqli Prepared语句使用now()插入,并根据经过的时间删除


MySqli Prepared Statements inserting using now(), and deleting based on time passed

我花了4个小时试图在数据库中编写一个简单的插入日期时间,重新读取该值并查看经过了多少时间。我在PHP中看到了一个又一个可怕的例子(我的ISP只有PHP 5.2.1),而不是5.3。好吧,经过几个小时的阅读。。我找到了一个让我高兴的解决方案,但我不知道如何让它以我需要的方式发挥作用。。。代码是…

create temporary table Data
( dt DateTime );
insert Data values
    (now() - INTERVAL 23 MINUTE);
select
    TIME_FORMAT(
      TIMEDIFF(now(), dt)
     ,'%i minute(s) ago'
   )
from Data;

我正在使用PREPARED语句(PS)。。。PS,我不知道如何将其转换为程序风格。我当时在想,而不是?我现在会放(),但后来我不知道该放什么值。我还想。。。我只需将DB更改为INT,然后将PHP时间()值粘贴在其中,并在阅读时对其进行一些计算。这是我的另一个选择,但。。。这将使SQL完成"工作",所以……这可以转换为PS吗?

谢谢!

我只想…

用now()更新一条记录,然后找出自从我写下该记录以来已经过去了多少时间,如果已经过了足够的时间,就删除它。

显示上述代码工作的网站是…

http://sqlize.com/r1mlXcM62V

我花了一整天的时间才弄清楚这一切,看起来我做到了。奇怪的是,SQL实际上很容易,PHP很容易。我年纪大了,我的大脑已经生疏了(已经17年多没有编程了)。我在脑海中想象它应该如何工作,而一些需要几秒钟时间才能研究和弄清楚的事情需要几个小时。所以…我找到了一个解决方案。。。

$query = "SELECT TIMESTAMPDIFF(MINUTE, `sesstoken1created`,now()) FROM pcssecurity";

只是我必须把它改成DELETE语句,所以我在想。。。

$query = "DELETE FROM pcssecurity WHERE TIMESTAMPDIFF(MINUTE, `sesstoken1created`,now()) > 16";

这将删除发现的所有大于16分钟的时间戳。作品我也在研究如果没有变量可以绑定该怎么办。。不包括BIND变量可以吗。。。并且看起来它在没有绑定变量的情况下工作。

解决方案

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_USER_PASSWORD, DB_NAME) or die(DB_CONNECT_ERROR .  __LINE__);
$stmt = mysqli_stmt_init($dbc);
$query = "DELETE FROM tablename WHERE TIMESTAMPDIFF(MINUTE, `datetimefieldhere`,now()) > " . SESSION_TOKEN_EXPIRES_IN_MINUTES;
$result = mysqli_stmt_prepare($stmt, $query);
$result = mysqli_stmt_execute($stmt);
$result = mysqli_stmt_affected_rows($stmt);
if ($result === -1) { // some error happened
    die('CreateNewToken insert failed');
}