插入日期作为变量时,PDO查询不返回数据
我试图获得OOP和PDO的保留。做了一些教程。在本教程中我得到的查询方法(所以那不是我的...)插入日期作为变量时,PDO查询不返回数据
,但具有与PDO查询
我想从数据库中选择匹配的日期订单的烦恼IM .....德日期来自一个datepicker并返回2012年12月16日,例如为此
$dateInputQuery = date("Y-m-d", strtotime(Input::get('datepick'))); $data = $order->getAllOrders('order', 'WHERE DATE(orderdate) = DATE({$dateInputQuery})', false, false);
奇怪的是,当我替换WHERE子句WHERE DATE(订购日期)= \“2013年12月16日\”它返回的所有数据,但插入我的日期时,像上面它不......。他DB类的方法是这样的
public function getAll($table, $where = NULL, $orderSort = NULL, $limit = NULL) { $this->query("SELECT * FROM {$table} {$where} {$orderSort} {$limit}")->error();
return $this;
}
和查询在DB类
public function query($sql, $params = array()) { //reset error
$this->_error = false;
if ($this->_query = $this->_pdo->prepare($sql)) {
$x = 1;
if (count($params)) {
foreach ($params as $param) {
$this->_query->bindValue($x,$param);
$x++;
}
}
if ($this->_query->execute()) {
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
} else {
$this->_error = true;
}
}
return $this;
}
为什么是这种方法吗?
回答:
- 立即解决问题造成的事实,
$dateInputQuery
是加引号。 Date是一个字符串,应该引用它。即使你可以很容易地添加报价,你真的不应该这样做。见下一点。 order
是MySQL中的reserved word,因此表名应放在反引号$data = $order->getAllOrders('`order`', "WHERE DATE(orderdate) = DATE('$dateInputQuery')", false, false);
^ ^ ^ ^
- 你不利用参数
query()
功能结合。取而代之的是,你使用查询字符串插值,使你的代码容易受到sql注入的影响,并减少prepared statements的使用。当你使用参数绑定时,你不再需要引用参数值。 - 您的sql查询不适合索引。您不应将任何功能(在您的案例
DATE()
中)应用于您正在搜索的列(orderdate
)。相反,您可以重写您的条件,以对常量参数应用必要的转换/计算。 - 您应该避免使用
SELECT *
。阅读Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc和Why is using '*' to build a view bad?
话虽这么说,您的查询应该是这个样子
$sql = "SELECT order_id, orderdate, ... FROM `order`
WHERE orderdate >= ?
AND orderdate < ? + INTERVAL 1 DAY";
你应该执行它
$this->query($sql, array($dateInputQuery, $dateInputQuery));
不是传递整个条款(例如WHERE
),你应该通过值
以上是 插入日期作为变量时,PDO查询不返回数据 的全部内容, 来源链接: utcz.com/qa/262557.html