2010-06-24 17 views
10

Tôi đang học các dây với PDO.PDO các tham số vị trí và được đặt tên như là một phần của truy vấn được chuẩn bị tương tự?

Đây là sql của tôi (số tham số có thể xuất hiện trong biến WHERE).

SELECT 
     ID, title 

    FROM 
     table 

    WHERE 
     something = ? 

    ORDER BY 
     :sort :dir 

    LIMIT 
     :start, :results 

Đây là mã của tôi:

 $query = $conn->prepare($sql); 

     if ($parameters) { 

      $i = 0; 
      foreach ($parameters AS $parameter) { 

       $i++; 
       $query->bindParam($i, $parameter); 

      } 

     } 

     $query->bindParam(':start', $pagination['start'], PDO::PARAM_INT); 
     $query->bindParam(':results', $pagination['results'], PDO::PARAM_INT); 
     $query->bindParam(':sort', $pagination['sort']); 
     $query->bindParam(':dir', $pagination['dir']); 

     $query->execute(); 

... và đây là ngoại lệ mà nó tạo ra:

Invalid parameter number: mixed named and positional parameters 

là nó không thể kết hợp tham số vị trí và tên trong cùng một truy vấn? Hay tôi đang thiếu một cái gì đó?

Cảm ơn!

+0

Tôi không chắc chắn về 'LIMIT', nhưng' ORDER BY' không chấp nhận tham số, ít nhất là không có trong phiên bản PHP mà tôi đang sử dụng (5.2.9) – jeroen

+0

MySQL sẽ không chấp nhận * giá trị được trích dẫn * đối với các mệnh đề 'LIMIT' và' ORDER BY', điều sẽ xảy ra khi các phần giữ chỗ đó được thay thế. Nó không phải là một vấn đề PHP ... và loại làm cho câu hỏi của bạn tranh luận. – Charles

Trả lời

9

Có, điều đó là không thể.

PDO.prepare

Bạn không thể sử dụng cả tên và thông số dấu hỏi dấu trong câu lệnh SQL tương tự; chọn một hoặc kiểu tham số khác.

+1

Ok cảm ơn thông tin. Xem xét tôi có một số biến của các tham số, là nó sau đó không thể ràng buộc các biến để ORDER BY và LIMIT mệnh đề? (Như tôi đã hiểu, bạn chỉ có thể làm điều này với các tham số được đặt tên. Nhưng các tham số được đặt tên không cho phép các tình huống có một số tham số không xác định.) – Travis

+1

Bạn không thể liên kết các tên cột, vì vậy bạn không thể liên kết: sắp xếp và : dir. Đặt tên cho tất cả các tham số. – Naktibalda

2

Sử dụng chức năng trình bao bọc, chức năng thay thế ngây thơ sẽ đủ.

if (strpos($sql, ":")) { 
    $i = -1; 
    while (strpos($sql, "?") && isset($parameters[++$i])) { 
     $parameters[":p$i"] = $parameters[$i]; 
     unset($parameters[$i]); 
     $sql = preg_replace("/[?]/", ":p$i", $sql, 1); 
    } 
} 

Trộn $ sắp xếp và $ dir trực tiếp vào truy vấn $ sql. Hai định danh này là các định danh SQL, không phải là dữ liệu.

Các vấn đề liên quan