Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

PDO bindParam untuk tanggal tidak berfungsi

Ini adalah masalah utama Anda:

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

Panggilan ke fetchColumn() memajukan hasil yang ditetapkan melewati baris pertamanya. Kemudian ketika Anda memanggil fetchAll(), itu hanya mengambil sisa baris. Itu tidak bisa kembali dan mengambil baris pertama, itu hilang. Jadi, jika hasil kueri Anda hanya memiliki satu baris, Anda tidak akan pernah melihatnya.

Sebagai gantinya, saya akan menyarankan kode ini:

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

Kiat lainnya:

Jangan pernah menempatkan placeholder parameter di dalam tanda kutip. Jika Anda melakukannya, mereka bukan penampung parameter lagi, itu hanya string literal seperti ":befDate". Ini bukan literal tanggal yang valid.

Parameter dalam ekspresi seperti BETWEEN :befDate AND :aftDate jangan tampilkan BETWEEN 2016-07-17 AND 2016-07-25 sebagai kueri. Parameter tidak pernah menjadi ekspresi seperti itu, mereka selalu menjadi nilai skalar (misalnya literal tanggal yang dikutip) per parameter.

Saya mencoba kode Anda. Pertama saya mengaktifkan log kueri umum MySQL:

mysql> SET GLOBAL general_log = ON;

Sekarang saya dapat melihat dengan tepat apa yang menurut MySQL adalah kueri yang dikirimkan oleh PDO. Saya menjalankan skrip PHP, dan membaca log kueri umum saya (/var/lib/mysql/localhost.log di mesin virtual saya):

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  

Ah, saya lupa menetapkan nilai untuk variabel yang terikat pada parameter. Jika Anda tidak memiliki nilai di salah satu variabel ini, itu akan menjelaskan mengapa hasil Anda kosong, karena perbandingan apa pun dengan NULL tidak benar. Jadi saya mengedit PHP untuk menetapkan nilai sampel ke variabel terlebih dahulu.

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

Saya menjalankan kueri lagi, dan di log saya melihat yang berikut:

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

Ini membuktikan bahwa PDO memang menempatkan tanda kutip di sekitar nilai parameter (jika berupa string atau tanggal).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Temukan karakter % dalam kueri LIKE

  2. Format Waktu Php

  3. Bagaimana cara menggunakan bidang alfanumerik dengan klausa BETWEEN di Mysql?

  4. Apakah kode ini aman dari injeksi SQL?

  5. Aplikasi Django multi-penyewa:mengubah koneksi basis data per permintaan?