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).