我需要运行检查以确定在过去24小时内是否有一行插入数据库。不管我做什么,它总是回来说我已经创建了一行。 (我是否将INTERVAL 1天更改为INTERVAL 1个月,INTERVAL 1年,INTERVAL 1秒等)
有人可以告诉我我做错了什么以及如何解决这个问题?此外,您可以提供有关如何调试此信息的任何信息都很棒。
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
答案 0 :(得分:2)
$stmt
是语句对象,而不是查询的结果。
(您已准备好查询但尚未执行。)
我建议您仔细阅读文档,所有您需要的就是:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php
具体而言,您正在寻找如何执行准备好的查询($stmt
)以及如何检索结果集。
文档页面上的示例代码。
如果您仍然处于困境,请查看您要拨打的方法。 http://php.net/manual/en/mysqli.prepare.php
它的返回结果是成功时的语句对象 - 否则为false。
PHP不是严格的类型 - 意味着它会尝试比较事物"逻辑上"而不是"严格"。一个对象是" true" (在你的条件陈述中) - 因此它打印出你看到的内容。
对于调试,您只需使用:
echo "<pre>"; var_dump($stmt);
(或者如果你想认真对待,请使用xdebug和NetBeans&#39;断点和检查:https://netbeans.org/kb/docs/php/debugging.html
这将输出变量的详细信息 - 这可能会有所帮助。
如果您来自其他语言,请告诉我,有人可能会提示您让您跑得更快。 :)
答案 1 :(得分:1)
您的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();
}
?>
答案 2 :(得分:0)
您没有执行查询!
您可以尝试将其更改为:
$response = $mysqli->query("...");
执行它是:
$stmt ->execute();