2013-12-17 29 views
0

我试图获得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; 
} 

为什么是这种方法吗?

+0

仔细检查$ dateInputQuery实际上是在for你期望的垫子。 – Robbert

回答

0
  1. 立即解决问题造成的事实,$dateInputQuery是加引号。 Date是一个字符串,应该引用它。即使你可以很容易地添加报价,你真的不应该这样做。见下一点。
  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?

话虽这么说,您的查询应该是这个样子

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

你应该执行它

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

不是传递整个条款(例如WHERE),你应该通过值

+0

即使我添加引号它不会工作(只是为了检查),谢谢你的休息,生病试试吧!我只是不明白2次$ sql 1作为参数在数组和1查询(这是我的...),但为什么双? – rZaaaa

+0

@rZaaaa如果你正确引用它,它应该工作。也看到更新的答案。您应该将表名称反向标记,因为'order'是MySQL中的保留字。现在你绝对没有必要第二次通过'$ sql',它只是一个错字。更正了答案。 – peterm

+0

我做了所有笔记的工作,现在就开始工作。我猜参数绑定是(主要)问题......我确实在日期变量周围添加了适当的引号,但是de PDO不会接受它。只作为参数..但它更好,我想,但谢谢! – rZaaaa