Secara umum, notasi :start
untuk placeholder bukanlah sintaks SQL standar atau sintaks Informix (asli). Anda perlu menggunakan ?
untuk placeholder, jadi:
$sql= $conn->prepare('SELECT SKIP ? FIRST 5 TRIM(loc_esi_id)
FROM customer t1
JOIN customer_ts_data t2 ON t1.customer_num = t2.customer_num
WHERE t1.customer_num = ? AND ');
(dan jika semuanya harus dalam satu baris di PHP, saya minta maaf karena telah mengorbankan akurasi demi keterbacaan).
Sekarang, ada kemungkinan sistem PDO mengubah notasi :start
menjadi ?
secara otomatis, dalam hal ini kita menghadapi masalah yang berbeda. Namun kecuali Anda yakin bahwa notasi :name
berfungsi, ... Salah satu alasan untuk tidak yakin adalah bahwa panggilan bindValue()
sepertinya memerlukan nama, bukan nomor yang mungkin diperlukan oleh ?
. Apakah kesalahan kode Anda memeriksa panggilan bindValue()
?
Kode ESQL/C ini berfungsi, menghasilkan output yang saya harapkan.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
$ char *dbase = "stores";
$ int num_skip = 3;
$ int num_fetch = 5;
if (argc > 2)
{
fprintf(stderr, "Usage: %s [dbase]\n", argv[0]);
exit(1);
}
if (argc == 2)
dbase = argv[1];
exec sql whenever error stop;
exec sql connect to :dbase;
exec sql prepare p from "select skip ? first ? tabid, tabname from informix.systables";
exec sql declare c cursor for p;
exec sql open c using :num_skip, :num_fetch;
while (sqlca.sqlcode == 0)
{
$ int4 tabid;
$ varchar tabname[129];
exec sql fetch c into :tabid, :tabname;
if (sqlca.sqlcode != 0)
break;
printf("%d: %s\n", tabid, tabname);
}
exec sql close c;
exec sql free c;
exec sql free p;
exec sql disconnect all;
return 0;
}
Keluaran
4: systabauth
5: syscolauth
6: sysviews
7: sysusers
8: sysdepend
Hal ini menunjukkan bahwa jika notasi placeholder digunakan dengan benar, maka Anda dapat menggunakan parameter untuk SKIP dan FIRST.
Jika Anda tidak dapat menemukan cara agar ini berfungsi dengan PDO, Anda mungkin mendapatkan bug. Jika Anda dapat menjalankan kode Anda dengan variabel lingkungan SQLIDEBUG=2:/tmp/your_sub_dir/check
yang disetel ke nilai serupa, maka Anda akan menemukan catatan tentang apa yang dikirim ke server (selain pengaturan koneksi) dalam file dengan nama seperti /tmp/your_sub_dir/check_21484_0_aedc1e0
. Pola angkanya sedikit bervariasi. Anda kemudian dapat menjalankan program sqliprint
pada file tersebut dan melihat apa yang dikirim PDO ke server. Ini akan menjadi cara yang sangat cepat untuk menentukan apakah PDO atau Informix mempunyai bug di dalamnya.
Misalnya, bagian dari keluaran yang saya dapatkan dari sqliprint
adalah:
C->S (20) Time: 2012-05-29 17:55:08.65225
SQ_CONNECT
"stores" [6]
"stores" [6]
C->S (72) Time: 2012-05-29 17:55:08.65239
SQ_PREPARE
# values: 2
CMD.....: "select skip ? first ? tabid, tabname from informix.systables" [60]
SQ_NDESCRIBE
SQ_WANTDONE
SQ_EOT
Anda dapat melihat pernyataan SQL yang dikirim dengan sangat jelas. Jika Anda tidak melihat ?
placeholder, berarti ada masalah di bagian hulu; baik driver PDO untuk Informix tidak berfungsi dengan benar, atau sedang disalahgunakan. Jika Anda melihat placeholder ?
, kita akan menghadapi masalah yang berbeda, tapi saya akan terkejut jika itu masalahnya.
Satu-satunya peringatan dalam mekanisme SQLIDEBUG adalah Anda perlu mengatur variabel lingkungan di lingkungan proses mana pun yang terhubung ke database. Untuk program ESQL/C mandiri, itu sepele. Jika Anda menggunakan server web dan PHP, itu mungkin lebih rumit tetapi bisa dilakukan.
person
Jonathan Leffler
schedule
30.05.2012