php - ข้อผิดพลาดทางไวยากรณ์ SQL ไม่มีตัวดำเนินการในนิพจน์แบบสอบถาม - Ms Access DB
ฉันมีรหัสใน PHPRunner (หลังจากบันทึกที่อัปเดตแล้ว) เพื่ออัปเดตตารางหลักที่มีจำนวนชั่วโมงทำงานทั้งหมดตามตารางรายละเอียด (หลายรายการ) แต่เมื่อฉันเพิ่มส่วนคำสั่ง sencond WHERE ลงใน $strUpdate ฉันได้รับไวยากรณ์ ข้อผิดพลาด
ฉันเปลี่ยนรหัสหลายครั้งและไม่ทำงานกับส่วนคำสั่ง WHERE และ AND ถ้าฉันลบ AND (Date=$values[DateField1])
และนำ () ออก โปรแกรมจะคำนวณผลรวม ปัญหาเดียวก็คือมันจะเพิ่มผลรวมลงในช่องชั่วโมงของตารางหลักทั้งหมดของฉัน แทนที่จะเป็นช่องสำหรับวันที่นั้นเท่านั้น .
$mykey=$values["OwnerID"];
$mykey1=$values["DateField1"];
global $conn;
$str = "เลือก SUM(ชั่วโมง)เป็น [ชม.] จากการเข้าร่วม WHERE OwnerID=\'{$mykey}\' จัดกลุ่มตาม DateField1";
$rs = db_query($str);
$value = db_fetch_numarray($ rs);
$total=$value[0];
$strUpdate = "อัปเดตชุด HrsOT `DailyHrs`=\'{$total}\' โดยที่ ((OwnerID=\'{$mykey} \') AND (Date=$values[DateField1])";
db_exec($strUpdate,$conn);
return true;
ฉันได้ดูโค้ดตัวอย่างและอ่าน หน้าแบบสอบถาม sql / msaccess ออนไลน์และไม่พบสาเหตุของข้อผิดพลาด ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก
Answer
วิธีแก้ไข:
2 WHERE clause
นั่นคือข้อผิดพลาด (หรือ) ปัญหาที่นี่ คุณไม่สามารถมี WHERE
2 อนุประโยคในคำสั่ง SQL เดียว เว้นแต่จะเป็นข้อความค้นหาย่อยหรือรูปแบบอื่น แทนที่จะลองผสมเงื่อนไขโดยใช้ตัวดำเนินการเงื่อนไข AND
OR
Answer
วิธีแก้ไข:
ฉันไม่สามารถทำให้คิวรีอัปเดตใช้งานได้ ทุกอย่างดูเหมือนปกติดีแต่ตารางไม่ได้รับการอัปเดต หลังจากเปลี่ยนตารางหลายครั้ง ฉันจึงสร้างฟิลด์เชื่อมโยงใหม่ระหว่างมาสเตอร์ และตารางรายละเอียด และทำให้แบบสอบถามของฉันง่ายขึ้นโดยเอาส่วนคำสั่ง AND ออก ทั้งหมดทำงานและโพสต์ที่นี่สำหรับทุกคนที่สนใจ
$mykey=$values["MasterID"];
global $conn;
$str = ("SELECT SUM(Hours) FROM Attendance WHERE
MasterID=$mykey"
);
$rs = db_query($str,$conn);
$value = db_fetch_numarray($rs);
$total=$value[0];
$sql = ("UPDATE HrsOT SET DailyHrs=\'$total\' WHERE
ID=".$values["MasterID"]);
DB::Exec($sql,$conn);
return true;
Answer
วิธีแก้ไข:
เพียงกำหนดพารามิเตอร์ของค่าวันที่ ตอนนี้ คุณรวมตัวแปร (รู้จักใน PHP เท่านั้น) $values[DateField1]
โดยตรงในคำสั่ง SQL ไม่เหมือนตัวแปรสองตัวแรกที่คุณสอดแทรกตัวแปรเหล่านี้: $total
และ $mykey
ดังนั้น ในการเรียกใช้แบบสอบถามนี้ โปรแกรม Access จะไม่รู้จักเอนทิตีนี้
อย่างไรก็ตาม หากคุณกำหนดพารามิเตอร์ (หลีกเลี่ยงการต่อข้อมูล) ด้วยคำสั่งที่เตรียมไว้ คุณจะสามารถส่งผ่านค่าของชั้นแอปพลิเคชันไปยังชั้นฐานข้อมูลได้อย่างมีประสิทธิภาพ ด้านล่างนี้คือแถลงการณ์ที่เตรียมไว้ในเวอร์ชัน PHPRunner นอกจากนี้ สำหรับ MS Access วันที่สตริงจะไม่ถูกประเมินหากไม่มีการแปลงด้วย CDate
หรือปิดตัวอักษรด้วย octothorpes, #
ด้านล่างนี้ถือว่า $total
และ $mykey
เป็นตัวเลข
$sql = DB:: PreparSQL(
"UPDATE HrsOT SET [DailyHrs]= :1 WHERE ((OwnerID = \':2\') AND ([Date] = CDate(\':3\'))", \ n $total,
$mykey,
$values[DateField1]
);
DB::Exec( $sql );
Source