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

PDO bindParam cho ngày không hoạt động

Đây là vấn đề chính của bạn:

if ($stmt->fetchColumn()>=1) {
    $result = $stmt->fetchAll();
}
else{
    $result = 'nope';
}

Lệnh gọi fetchColumn () tiến bộ kết quả qua hàng đầu tiên của nó. Sau đó, khi bạn gọi fetchAll (), nó chỉ tìm nạp phần còn lại hàng. Nó không thể quay lại và lấy hàng đầu tiên, điều đó đã bị mất. Vì vậy, nếu kết quả truy vấn của bạn chỉ có một hàng, bạn sẽ không bao giờ thấy nó.

Thay vào đó, tôi sẽ đề xuất mã này:

$result = $stmt->fetchAll();
if (empty($result)) {
  $result = "nope";
}

Các mẹo khác:

Không bao giờ đặt trình giữ chỗ tham số bên trong dấu ngoặc kép. Nếu bạn làm vậy, chúng không phải là trình giữ chỗ tham số nữa, chúng chỉ là các chuỗi theo nghĩa đen như ":befDate". Đây không phải là các ký tự ngày hợp lệ.

Các tham số trong một biểu thức như BETWEEN :befDate AND :aftDate không sản xuất BETWEEN 2016-07-17 AND 2016-07-25 như một truy vấn. Các tham số không bao giờ trở thành các biểu thức như vậy, chúng luôn trở thành một giá trị vô hướng (ví dụ:một ký tự ngày được trích dẫn) cho mỗi tham số.

Tôi đã thử mã của bạn. Đầu tiên, tôi đã bật nhật ký truy vấn chung MySQL:

mysql> SET GLOBAL general_log = ON;

Bây giờ tôi có thể thấy chính xác những gì MySQL nghĩ là truy vấn được gửi bởi PDO. Tôi đã chạy tập lệnh PHP và đọc nhật ký truy vấn chung của mình (/var/lib/mysql/localhost.log trên máy ảo của tôi):

160716 19:26:16     8 Connect   [email protected] on test
            8 Query SELECT * FROM `flights` WHERE `date` BETWEEN NULL AND NULL 
                     AND `from` = NULL 
                     AND `to` = NULL 
                     AND `weight` >= NULL
            8 Quit  

À, tôi quên đặt giá trị cho các biến liên kết với các tham số. Nếu bạn không có giá trị nào trong bất kỳ biến nào trong số này, nó sẽ giải thích lý do tại sao kết quả của bạn trống, bởi vì bất kỳ so sánh nào với NULL đều không đúng. Vì vậy, tôi đã chỉnh sửa PHP để đặt các giá trị mẫu cho các biến trước.

$befDate = '2016-07-21';
$aftDate = '2016-07-28';
$from = 1;
$to = 2;
$weight = 10;

Tôi đã chạy lại truy vấn và trong nhật ký, tôi thấy như sau:

160716 19:33:17    13 Query SELECT * FROM `flights` WHERE `date` BETWEEN '2016-07-21' AND '2016-07-28' 
                     AND `from` = 1 
                     AND `to` = 2 
                     AND `weight` >= 10

Điều này chứng tỏ rằng PDO đặt dấu ngoặc kép xung quanh một giá trị được tham số hóa (nếu đó là một chuỗi hoặc một ngày).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách so sánh ngày tháng sử dụng giữa mệnh đề trong chế độ ngủ đông

  2. Tham chiếu đến cùng một bảng cả mục tiêu CẬP NHẬT và nguồn dữ liệu trong MySql

  3. chọn truy vấn và đếm dựa trên điều kiện

  4. Gửi vị trí địa lý của người dùng đến máy chủ mỗi phút

  5. PHP gán câu lệnh select để thả xuống các giá trị danh sách