如果范围是动态的,请选择两个日期时间之间的行

时间:2021-06-01 作者:Antti

我试图从数据库表中选择属于特定日期范围的行。范围由用户动态确定。

在我的数据库中,有一列名为;日期和时间;。它以以下格式存储日期:

2021-06-01 19:37:00

我正在尝试使用以下选项选择行:

function getEventsByDateRange(){

    $eventType = ($_POST["event"]);
    $dateRangeFrom = ($_POST["dateRangeFrom"]);
    $dateRangeTo = ($_POST["dateRangeTo"]);

    $formattedDateRangeFrom = date("Y-m-d H:i:s", strtotime($dateRangeFrom));
    $formattedDateRangeTo = date("Y-m-d H:i:s", strtotime($dateRangeTo));

    global $wpdb;

    $eventQueryResults = $wpdb->get_results("SELECT * FROM dailyevents 
    WHERE dateAndTime BETWEEN {$formattedDateRangeFrom} AND {$formattedDateRangeTo} ORDER BY dateAndTime DESC", ARRAY_A); 

    $jsonEncoded = json_encode($eventQueryResults, JSON_UNESCAPED_UNICODE);

    echo $jsonEncoded;

    exit();

}
但我一直在犯这样的错误:

<div id="error"><p class="wpdberror"><strong>WordPress database error:</strong> [You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near &#039;04:00:00 AND 2021-06-02 03:59:59 ORDER BY dateAndTime DESC&#039; at line 2]<br /><code>SELECT * FROM dailyevents 
    WHERE dateAndTime BETWEEN 2021-06-01 04:00:00 AND 2021-06-02 03:59:59 ORDER BY dateAndTime DESC</code></p></div>[]

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

这个错误本身并不是WordPress特有的,这意味着即使您使用phpMyAdmin或MySQL命令行界面执行相同的查询,并且日期没有括在引号中,您仍然会得到相同的错误。

因此,对于字符串文字,如2021-06-01 04:00:00 (a DATETIME literal) 在错误中,您需要将日期时间值用单引号(首选)或双引号括起来,例如。\'2021-06-01 04:00:00\'.

因此,您的查询应该是这样的(*为简洁起见包装):

$eventQueryResults = $wpdb->get_results( "
    SELECT * FROM dailyevents
    WHERE dateAndTime BETWEEN \'$formattedDateRangeFrom\' AND \'$formattedDateRangeTo\'
    ORDER BY dateAndTime DESC
", ARRAY_A );
这应该行得通,但现在有一个特定于WordPress的东西:通常建议使用wpdb::prepare() 准备SQL查询以便安全执行,特别是具有动态值的查询,这些值是用户或未知源直接输入的。

因此$wpdb->prepare(), 上述代码可以重写为:

// I know the variables store a date() value, but this is just to demonstrate
// wpdb::prepare() usage.

$query = $wpdb->prepare( "
    SELECT * FROM dailyevents
    WHERE dateAndTime BETWEEN %s AND %s
    ORDER BY dateAndTime DESC
", $formattedDateRangeFrom, $formattedDateRangeTo );

$eventQueryResults = $wpdb->get_results( $query, ARRAY_A );
我想你可能会发现这很有帮助:https://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double-quotes-and-backticks-in-mysql :)

也针对您的评论:“引用<我不知道你可以把变量名放在引号里,并且仍然让它们引用变量“;,你当然可以,就像在回应echo "value of blah: \'$blah\'"; — 只需确保变量是可访问的,即定义的和范围内的。

相关推荐

UPDATE_OPTION_{$OPTION}不工作(保存选项后执行功能)

下面是我的简单插件设置页面代码。它工作并保存一个选项(“EN”、“CZ”)。但是,我要做的是在保存选项后运行一个函数(见最下面)。我使用wordpress函数:do_action( "update_option_{$option}", mixed $old_value, mixed $value, string $option ) 有趣的是,上周同样的代码也起了作用;现在,我在函数中尝试回显的任何内容都不会被打印出来,所以我假设函数甚至没有开始运行。谁能给我指一下这里的正确方