2013-12-17 9 views
0

임 OOP 및 PDO를 보류하려고합니다. 일부 자습서를 했어. 튜토리얼에서 나는 (... 그래서 광산은하지 먹으 렴)변수를 날짜로 삽입 할 때 PDO 쿼리가 데이터를 반환하지 않습니다.

하지만

내가 날짜를 일치 데이터베이스에서 주문을 선택하려는 PDO 쿼리와 문제를 가진 메신저 ..... 드를 쿼리 방법을 가지고 날짜는 날짜 선택기에서 오는 이상한 일이

$dateInputQuery = date("Y-m-d", strtotime(Input::get('datepick'))); 
$data = $order->getAllOrders('order', 'WHERE DATE(orderdate) = DATE({$dateInputQuery})', false, false); 

그 때문에 예를 들어 2012년 12월 16일을 반환 나는 그것을 '\ 2013년 12월 16일'DATE (주문일)에 WHERE 절 = \를 교체 할 때 모든 데이터를 반환하지만 위와 같이 날짜를 삽입 할 때 .........

그는이 방법은

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

이 왜 DB 클래스에서이

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

및 쿼리 방법과 같은 클래스 DB 정보?

+0

$ dateInputQuery가 실제로 매트 당신이 기대합니다. – Robbert

답변

0
  1. 즉각적인 문제는 $dateInputQuery의 인용 부호가 없습니다. 날짜는 문자열 리터럴이므로 따옴표로 묶어야합니다. 그리고 비록 당신은 쉽게 주위에 따옴표를 추가 할 수 있습니다 정말하지 말아야이. 다음 부분을 참조하십시오.
  2. order 따라서 테이블 이름 당신은 query() 기능에 바인딩 매개 변수를 활용하지 않는 역 따옴표

    $data = $order->getAllOrders('`order`', "WHERE DATE(orderdate) = DATE('$dateInputQuery')", false, false); 
              ^ ^        ^   ^
    
  3. 에 넣어되어야한다, MySQL의에서 reserved word입니다. 대신에 쿼리 문자열 보간법을 사용하여 코드를 SQL injection에 취약하게두고 prepared statements의 사용을 줄입니다. 매개 변수 바인딩을 사용할 때 더 이상 매개 변수 값을 인용 할 필요가 없습니다.
  4. SQL 쿼리는 인덱스와 호환되지 않습니다. 검색하는 열 (orderdate)에 어떤 함수 (귀하의 경우 DATE())를 적용해서는 안됩니다. 대신 조건을 다시 작성하여 상수 인 인수에 필요한 변환/계산을 적용 할 수 있습니다.
  5. 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"; 
    

    처럼 보일 것이다 그리고 당신은 대신에 통과해야합니다 (예 : WHERE)을 전체 절을 전달하는 그것을

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

    을 실행해야한다고 말했다되고 그건

+0

비록 내가 따옴표를 추가한다고해도 (단지 점검하기 위해) 작동하지 않을 것이다, 나머지를 위해 고맙다, 아프다! 나는 배열에있는 매개 변수로 2 번 $ SQL 1을 이해하지 못한다. 그리고 쿼리에서 1 개는 내 것이고 ... 왜 더블이 될까? – rZaaaa

+0

@rZaaaa 올바르게 인용하면 올바르게 작동합니다. 또한 업데이트 된 답변을 참조하십시오. 'order'는 MySQL에서 예약어이기 때문에 테이블 이름을 역 틱으로 두어야합니다.이제는'$ sql'을 두 번 입력 할 필요가 전혀 없습니다. 단지 오타였습니다. 대답에서 그것을 정정했다. – peterm

+0

나는 모든 노트와 그 작업을 지금 만들었습니다. 나는 매개 변수 바인딩이 (주된) 문제라고 생각한다. 나는 date var 주위에 적절한 따옴표를 넣었지만, PDO는 그냥 가져 가지 않을 것이다. 오직 param ..하지만 그게 더 나은 생각,하지만 고마워! – rZaaaa

관련 문제