Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Các câu lệnh được chuẩn bị sẵn PDO Mệnh đề IN với các trình giữ chỗ được đặt tên không hoạt động như mong đợi

Điều này sẽ phù hợp với bạn:

Vì vậy, như đã nói trong phần nhận xét, bạn cần một trình giữ chỗ cho mỗi giá trị mà bạn muốn liên kết với mệnh đề IN.

Ở đây, đầu tiên tôi tạo mảng $ids chỉ chứa các id đơn giản, ví dụ:

[2, 3]

Sau đó, tôi cũng tạo mảng $preparedIds giữ chỗ giữ chỗ dưới dạng mảng, sau này bạn sử dụng trong câu lệnh đã chuẩn bị. Mảng này trông giống như sau:

[":id2", ":id3"]

Và tôi cũng tạo một mảng có tên là $preparedValues chứa $preparedIds dưới dạng khóa và $ids dưới dạng các giá trị mà sau này bạn có thể sử dụng cho execute() cuộc gọi. Mảng trông giống như sau:

[":id2" => 2, ":id3" => 3]

Sau đó, bạn có thể đi. Trong câu lệnh đã chuẩn bị, tôi chỉ implode() $preparedIds mảng, để câu lệnh SQL trông giống như sau:

... IN(:id2,:id3) ...

Và sau đó bạn có thể chỉ cần execute() truy vấn của bạn. Ở đó tôi vừa array_merge() $preparedValues của bạn mảng với mảng trình giữ chỗ khác.

<?php

    $ids = array_map(function($item){
        return $item->id;
    }, $entitlementsVOs);

    $preparedIds = array_map(function($v){
        return ":id$v";
    }, $ids);

    $preparedValues = array_combine($preparedIds, $ids);


    $timestart = (!empty($_GET['start']) ? $_GET['start'] : NULL );
    $timeend = (!empty($_GET['end']) ? $_GET['end'] : NULL );


    $statement = $this->connection->prepare("SELECT name AS title, timestart AS start, timestart + timeduration AS end FROM event WHERE courseid IN(" . implode(",", $preparedIds) . ") AND timestart >= :timestart AND timestart + timeduration <= :timeend");
    $statement->setFetchMode(\PDO::FETCH_CLASS, get_class(new EventVO()));

    if($statement->execute(array_merge($preparedValues, ["timestart" => $timestart, "timeend" => $timeend]))) {
        return $statement->fetchAll();
    } else {
        return null;
    }

?>

Ngoài ra, tôi nghĩ bạn muốn đặt câu lệnh if xung quanh truy vấn của mình, vì truy vấn của bạn sẽ không chạy nếu các giá trị của $timestart$timeend là KHÔNG.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql_connect ():Không thể thực hiện kết nối vì máy mục tiêu đã chủ động từ chối nó

  2. Visual Studio - Không thể liên kết bảng cơ sở dữ liệu MySql với DataSet

  3. Tạo UDF cho MySQL trong Delphi

  4. Không thể bỏ bảng:Ràng buộc khóa ngoại không thành công

  5. PHP nhiều lệnh MYSQL trong một truy vấn mysql_query ()