โดยทั่วไป สัญลักษณ์ :start
สำหรับตัวยึดตำแหน่งไม่ใช่ทั้งไวยากรณ์ SQL มาตรฐานหรือไวยากรณ์ Informix (ดั้งเดิม) คุณต้องใช้ ?
สำหรับตัวยึดตำแหน่ง ดังนั้น:
$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 ');
(และหากทุกอย่างจำเป็นต้องอยู่ในบรรทัดเดียวใน PHP ฉันขอโทษสำหรับความถูกต้องแม่นยำเพื่อความสะดวกในการอ่าน)
ขณะนี้ มีโอกาสที่ระบบ PDO จะแปลงสัญลักษณ์ :start
เป็น ?
โดยอัตโนมัติ ซึ่งในกรณีนี้เรามีปัญหาอื่น แต่ถ้าคุณไม่แน่ใจว่าสัญกรณ์ :name
ใช้งานได้ ... เหตุผลหนึ่งที่ไม่แน่ใจก็คือการโทร bindValue()
ดูเหมือนจะต้องการชื่อ มากกว่าตัวเลขที่ ?
น่าจะต้องการ รหัสของคุณมีข้อผิดพลาดตรวจสอบการโทร bindValue()
หรือไม่
รหัส ESQL/C นี้ใช้งานได้โดยสร้างผลลัพธ์ที่ฉันคาดหวัง
#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;
}
เอาท์พุต
4: systabauth
5: syscolauth
6: sysviews
7: sysusers
8: sysdepend
นี่แสดงให้เห็นว่าหากใช้สัญลักษณ์ตัวแทนอย่างถูกต้อง คุณจะสามารถใช้พารามิเตอร์สำหรับ SKIP และ FIRST ได้
หากคุณไม่สามารถหาวิธีใช้งาน PDO ได้ คุณอาจได้รับข้อบกพร่อง หากคุณสามารถรันโค้ดโดยตั้งค่าตัวแปรสภาพแวดล้อม SQLIDEBUG=2:/tmp/your_sub_dir/check
ให้เป็นค่าที่คล้ายกันได้ คุณควรค้นหาบันทึกสิ่งที่ถูกส่งไปยังเซิร์ฟเวอร์ (นอกเหนือจากการตั้งค่าการเชื่อมต่อ) ในไฟล์ที่มีชื่อ เช่น /tmp/your_sub_dir/check_21484_0_aedc1e0
รูปแบบตัวเลขจะแปรผันเล็กน้อย จากนั้นคุณสามารถรันโปรแกรม sqliprint
บนไฟล์และดูว่า PDO ใดที่ส่งไปยังเซิร์ฟเวอร์ มันจะเป็นวิธีที่รวดเร็วมากในการพิจารณาว่า PDO หรือ Informix มีข้อบกพร่องอยู่หรือไม่
ตัวอย่างเช่น ส่วนหนึ่งของผลลัพธ์ที่ฉันได้รับจาก sqliprint
คือ:
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
คุณจะเห็นคำสั่ง SQL ที่ส่งมาได้ชัดเจนมาก หากคุณไม่เห็นตัวยึดตำแหน่ง ?
แสดงว่ามีปัญหาที่ต้นทาง ไดรเวอร์ PDO สำหรับ Informix ทำงานไม่ถูกต้องหรือมีการใช้งานในทางที่ผิด หากคุณเห็นตัวยึดตำแหน่ง ?
เราคงประสบปัญหาอื่น แต่ฉันคงจะแปลกใจถ้านั่นคือปัญหา
ข้อแม้เดียวในกลไก SQLIDEBUG คือคุณต้องได้รับการตั้งค่าตัวแปรสภาพแวดล้อมในสภาพแวดล้อมของกระบวนการใดก็ตามที่เชื่อมต่อกับฐานข้อมูล สำหรับโปรแกรม ESQL/C แบบสแตนด์อโลนนั่นเป็นเรื่องเล็กน้อย หากคุณกำลังใช้งานผ่านเว็บเซิร์ฟเวอร์และ PHP นั่นอาจจะยุ่งยากกว่าแต่ก็สามารถทำได้
person
Jonathan Leffler
schedule
30.05.2012