【问题标题】:Check if a MySQL row was inserted within the last 24 hours using PHP/MySQL? [closed]检查是否在过去 24 小时内使用 PHP/MySQL 插入了 MySQL 行? [关闭]
【发布时间】:2015-08-20 22:53:01
【问题描述】:

我需要运行检查以确定是否在过去 24 小时内将行插入到数据库中。无论我做什么,它总是回来说我已经创建了一行。 (我是否将INTERVAL 1 DAY更改为INTERVAL 1 Month、INTERVAL 1 Year、INTERVAL 1 Second等)

谁能告诉我我做错了什么以及如何解决它?此外,您可以提供有关如何调试此功能的任何信息。

if ($stmt = $mysqli->prepare( "SELECT * FROM votes WHERE id = " . $id . " AND cdate >= now() - INTERVAL 1 DAY")) {
  echo 'Row created within the last 24 hours';
} else {
  echo 'Row not created within the last 24 hours';
}

数据库表包含cdate 列,并设置为DATETIME,默认为CURRENT_TIMESTAMP。这是2015-08-20 21:14:30 值之一的示例

【问题讨论】:

  • 你也没有“准备”任何东西,所以只需使用query 而不是prepare

标签: php mysql sql datetime


【解决方案1】:

$stmt 是语句对象,而不是查询的结果。 (您已准备好查询但尚未执行。)

我建议你仔细阅读文档,你需要的都在这里:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

具体来说,您正在寻找如何执行准备好的查询 ($stmt) 以及如何检索结果集。

文档页面上的示例代码。


如果您仍然卡住,请查找您正在调用的方法。 http://php.net/manual/en/mysqli.prepare.php

成功则返回一个语句对象,否则返回false。

PHP 不是类型严格的——这意味着它会尝试“逻辑地”而不是“严格地”比较事物。一个对象是“真”(在你的条件语句中)——因此它会打印出你所看到的。

对于调试,您可以简单地使用:

echo "<pre>"; var_dump($stmt);

(或者如果你想认真的话,可以使用带有 NetBeans 断点和检查的 xdebug:https://netbeans.org/kb/docs/php/debugging.html

这将输出变量的详细信息 - 这可能会有所帮助。

如果您使用其他语言,请告诉我,有人可能会提示您让您跑得更快。 :)

【讨论】:

    【解决方案2】:

    你的if 语句没有多大意义,因为你实际上并没有评估任何东西,你只是准备一个要执行的语句(但你也忘记了执行它)。假设您的 SQL 语句有效,这将执行结果并正确检查行数:

    <?php
        $query = "SELECT * FROM votes WHERE id = " . $id . " AND cdate >= now() - INTERVAL 1 DAY";
        if ($stmt = $mysqli->prepare($query)) {
    
            /* execute query */
            $stmt->execute();
    
            /* store result */
            $stmt->store_result();
    
            $num_rows = $stmt->num_rows;
    
            if ($num_rows > 0) {
                echo 'Row created within the last 24 hours';
            } else {
                echo 'Row not created within the last 24 hours';
            }
    
            /* close statement */
            $stmt->close();
        }
    ?>
    

    【讨论】:

    • 谢谢蒂姆。我尝试了您的代码,但在将 INTERVAL 1 DAY 更改为 INTERVAL 1 MONTH 后,它一直显示“已创建行...”。有任何想法吗?该行(表中只有一个)是大约两个小时前创建的,所以如果我将间隔增加到一个月,它应该找不到任何行,对吗?
    • 您能否回显$query 并通过 phpMyAdmin 之类的工具运行它以验证它是 PHP 而不是 SQL 语句不起作用?
    • 尝试了您的建议,该行显示在 phpMyAdmin 中的查询结果中。任何想法为什么?
    • 您在$id 周围使用引号吗?试试$query = "SELECT * FROM votes WHERE id = '" . $id . "' AND cdate &gt;= now() - INTERVAL 1 DAY";
    【解决方案3】:

    你没有执行你的查询!

    你可以试试改成:

    $response = $mysqli->query("...");
    

    执行它是:

    $stmt ->execute();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2014-11-29
      • 2018-01-31
      • 2018-06-24
      • 1970-01-01
      相关资源
      最近更新 更多