我正在更新我的代码以使用 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/