【问题标题】:Compare DATETIME MySQL with DateTime PHP比较 DATETIME MySQL 和 DateTime PHP
【发布时间】:2019-04-06 08:35:47
【问题描述】:

我在比较使用 php 中的新 dateTime () 创建的日期和取自 Mysql 表的 DATETIME 字段的日期之间的日期时遇到问题。

使用以下代码,在 MySQL 表的 DATETIME 字段中保存日期:

$now = new DateTime();
$update = $mysqli->query('INSERT INTO bonus (idplayer,lastlogin) VALUES ("'.$_GET["idplayer"].'","'.$now.'")');

然后我想从表格中检索日期并将其与使用 php 代码创建的日期进行比较:

$resetTime = new DateTime();
date_time_set($resetTime, 12, 00, 00);
$lastLogin = $mysqli->query('SELECT lastlogin FROM bonus WHERE idplayer = "'.$_GET["idgiocatore"].'"');
if ($resetTime < $lastLogin) {
        echo "OK!<br>";
    }

使用此代码我无法比较日期,因为我收到错误消息(我什至无法回显从表中检索到的日期)。 谁能告诉我哪里错了,我该如何解决这个问题?

【问题讨论】:

  • 阅读 PHP 手册会告诉你 DateTime 是一个类,而不是一个字符串。请参阅:php.net/manual/en/class.datetime.php 你想要的更像是 PHP 中的 date('Y-m-d H:i:s')。这会生成一个可用于 MySQL 查询的字符串。见:php.net/manual/en/function.date.php 或使用datetime-&gt;format(),见:php.net/manual/en/datetime.format.php
  • 谢谢!我设法解决了一切!
  • $_GET["idgiocatore"] = '" OR 1 ORDER BY lastlogin DESC LIMIT 1 --' - 这样它按最大日期排序,然后只返回一行。 $lastLogin 也不是你想的那样。

标签: php mysql mysqli


【解决方案1】:

试试这个

$resetTime = (new DateTime)->format('Y-m-d 12:00:00'); //need it as a string
//$resetTime = date('Y-m-d 12:00:00'); //-- this is fine too

$stmt = $mysqli->parpare('SELECT lastlogin FROM bonus WHERE idplayer = ?');
$stmt->bind_param("s", .$_GET["idplayer"]);
$stmt->execute();
list($lastLogin) = $stmt->get_result()->fetch_array();

if ($resetTime < $lastLogin) {
        echo "OK!<br>";
}

基本上,您将查询结果集与您的时间戳进行比较,而不是第一行第一列的值。考虑你的代码:

$lastLogin = $mysqli->query('SELECT lastlogin FROM bonus WHERE idplayer = "'.$_GET["idgiocatore"].'"');
if ($resetTime < $lastLogin) {

mysqli::query

失败时返回 FALSE。对于成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,mysqli_query() 将返回一个 mysqli_result 对象。对于其他成功的查询,mysqli_query() 将返回 TRUE。

https://www.php.net/manual/en/mysqli.query.php

你的也充满了 SQL 注入错误,输入如下:

  $_GET["idgiocatore"] = '" OR 1 ORDER BY lastlogin DESC LIMIT 1 --'

会把你的查询变成这个

'SELECT lastlogin FROM bonus WHERE idplayer = "" OR 1 ORDER BY lastlogin DESC LIMIT 1 -- "'

-- 之后的所有内容都是注释,因此我们可以忽略结尾 "。这可以避免产生语法错误,并且是一种非常常见的策略(没什么新意)。

这将从数据库中选择所有记录,因为任何东西加上 OR 1 始终为真,然后它将按您的 lastlogin 值 DESC 对它们进行排序,因此最高值是第一个并且限制为 1 返回行,这只是因为我能够。基本上这将满足您的 if 条件 if ($resetTime &lt; $lastLogin) 我猜这是一件“好事”(对我来说,haxor)。

本质上这是因为您只是将用户输入直接粘贴到 SQL 中,因此如果公式正确,它将成为命令的一部分(对您来说不是一件好事)。

希望对你有帮助。

*PS 我使用 MySqli(通常我使用 PDO)已经是一个年龄(比如 6 岁),所以请原谅我那里的任何错误,其中大部分来自@987654322 上的基本教程@

最后一件事,而不是设置时间,考虑使用 MySql DATE() 函数将其完全删除:

$resetTime = (new DateTime)->format('Y-m-d');
//...
$stmt = $mysqli->parpare('SELECT DATE(lastlogin) FROM bonus WHERE idplayer = ?');

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 2016-04-12
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多