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