将日期作为变量插入时,PDO查询不返回数据

时间:2013-12-17 05:16:30

标签: mysql date pdo

我试图抓住OOP和PDO。做了一些教程。在教程中我得到了查询方法(因此不是我的...)

但我遇到了pdo查询的麻烦

我想从匹配日期的数据库中选择订单..... de date来自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(orderdate)= \'2013-12-16 \'时,它会返回所有数据但是当像上面那样插入我的日期时它不会.... / p> db类中的

方法如下所示

public function getAll($table, $where = NULL, $orderSort = NULL, $limit = NULL) {
    $this->query("SELECT * FROM {$table} {$where} {$orderSort} {$limit}")->error();
    return $this;
}

和db class中的查询方法

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;
}

为什么会这样?

1 个答案:

答案 0 :(得分:0)

  1. 您的直接问题是$dateInputQuery未加引号的事实。日期是字符串文字,应该引用。即使你可以轻松地在它周围添加引号,你真的不应该这个。见下一点。
  2. order是MySQL中的reserved word,因此表名应放在反引号中

    $data = $order->getAllOrders('`order`', "WHERE DATE(orderdate) = DATE('$dateInputQuery')", false, false);
                                  ^     ^                                 ^               ^
    
  3. 您未在query()函数中利用参数绑定。取而代之的是,您使用查询字符串插值,使您的代码容易受到sql注入的影响并减少prepared statements的使用。使用参数绑定时,不再需要引用参数值。
  4. 您的SQL查询不是索引友好的。您不应将任何函数(在您的情况下为DATE())应用于您要搜索的列(orderdate)。相反,您可以重写条件以将必要的转换/计算应用于常量参数。
  5. 您应该避免使用SELECT *。阅读Which is faster/best? SELECT * or SELECT column1, colum2, column3, etcWhy is using '*' to build a view bad?
  6. 据说你的查询看起来像

    $sql = "SELECT order_id, orderdate, ...
              FROM `order` 
             WHERE orderdate >= ? 
               AND orderdate <  ? + INTERVAL 1 DAY";
    

    你应该执行它

    $this->query($sql, array($dateInputQuery, $dateInputQuery));
    

    您应该传递值

    ,而不是传递整个子句(例如WHERE