php - 使用 PHP PDO 查询 MySQL 中的 DATE

标签 php mysql sql date pdo

我正在更新我的代码以使用 PHP PDO...我遇到了一个 sql 查询

 $sql = "SELECT COUNT(id) AS number_of_item FROM ".$db_table_prefix."item_table 
WHERE id > 0 
    AND date_visited BETWEEN 
    CAST('$start_date' AS DATE ) 
    AND CAST('$end_date' AS DATE )";

我用这个替换

$this->sql = "SELECT COUNT(id) AS number_of_items FROM item_table
                      WHERE id > :id AND date_visited
                      BETWEEN CAST(:start_date AS DATE )
                      AND CAST(:end_date AS DATE )";
        $this->prepare($this->sql);
        $this->bind(':id', 0);
        $this->bind(':start_date', $date_start);
        $this->bind(':end_date', $date_end);

        $this->execute();

        sizeof($this->multiple_fetch()) > 0 ? $this->result_set = $this->multiple_fetch() : $this->result_set = 404;

        return $this->result_set;

我的数据库中有满足所有条件的条目,但我的新代码给出了这个结果

array (size=1)   0 => 
    array (size=1)
      'number_of_items' => int 0

我的问题是,我做错了什么吗?有没有更好的方法或不同的方式来使用

CAST(... AS DATE)

在 PDO 中?

UPDATE

这是我的绑定(bind)方法的样子

function bind($placeholder, $value, $type = null){
        if (is_null($type)) {
            switch (true) {
                case is_int($value):
                    $type = \PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = \PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = \PDO::PARAM_NULL;
                    break;
                default:
                    $type = \PDO::PARAM_STR;
            }
        }
        $this->stmt->bindValue($placeholder, $value, $type);
    }

我的 $date_start 和 date_end 值分别是 2016-11-01 和 2016-11-30。我的数据库(item_table)中有大约 101 个虚拟条目,date_visited 为 2016-11-18

最佳答案

正如我在评论中建议的,您可以使用以下代码:

$date_start = date('Y-m-d', strtotime($start_date));
$date_end = date('Y-m-d', strtotime($date_end));

将变量内容转换为 MySQL 需要的格式

现在,当你说你之前已经做过但它不起作用时,我假设在这个转换和将它们绑定(bind)到你在代码中更改它们的sql语句之间的某个地方,所以你要么可以在绑定(bind)它们之前立即转换它们,或者按照您的建议在绑定(bind)中转换它们,如下所示:

$this->bind(':start_date', date('Y-m-d', strtotime($start_date)));

然后你的查询将如下所示

$this->sql = "SELECT COUNT(id) AS number_of_items FROM item_table
                      WHERE id > :id AND date_visited
                      BETWEEN :start_date
                      AND :end_date";

总而言之,您可以使用这两种方法之一。它们中的任何一个都应该可以工作,但您可以使用您更熟悉的任何一个:

<强>1。在绑定(bind)变量之前转换它们

$date_start = date('Y-m-d', strtotime($start_date));
$date_end = date('Y-m-d', strtotime($date_end));

$this->sql = "SELECT COUNT(id) AS number_of_items FROM item_table
                      WHERE id > :id AND date_visited
                      BETWEEN :start_date
                      AND :end_date";
$this->prepare($this->sql);
$this->bind(':id', 0);
$this->bind(':start_date', $date_start);
$this->bind(':end_date', $date_end);
// rest of your code

<强>2。绑定(bind)期间转换变量

$this->sql = "SELECT COUNT(id) AS number_of_items FROM item_table
                      WHERE id > :id AND date_visited
                      BETWEEN :start_date
                      AND :end_date";
$this->prepare($this->sql);
$this->bind(':id', 0);
$this->bind(':start_date', date('Y-m-d', strtotime($start_date)));
$this->bind(':end_date', date('Y-m-d', strtotime($date_end)););
// rest of your code

关于php - 使用 PHP PDO 查询 MySQL 中的 DATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40698346/

相关文章:

mysql - 嵌套 SELECT 计算两个表的平均值

SQL 内连接 3 个表?

mysql - 如何检查哪个 ID 具有另一个属性的所有不同值?

mysql - 如何在 Laravel SQL 查询中一起使用 `GroupBy` 和 `join`

php - 如何将 now() 转换为时间戳

php - 表达式语言 Symfony 组件 - 无法验证空字符串

php - 如何在一张 "loop"中获取属于用户的所有图像

PHP变量传递在数据库调用中不起作用

php - 使用 php 在 mysqldb 中搜索

mysql - 在同一张表上使用 JOIN 更新 MySQL 表?