เครื่องหมายคำถามหลีกหนี PHP PDO ดังนั้นจึงไม่คิดว่าจะเป็นตัวยึดตำแหน่ง

ฉันมีคำถามที่มีลักษณะดังนี้:

SELECT CONCAT('path/to/page/?id=', id) AS link FROM users WHERE name = ?

ฉันกำลังใช้ PDO เพื่อเตรียมคำสั่งนี้ และฉันได้รับข้อผิดพลาด

Invalid parameter number: number of bound variables does not match number of tokens

เพราะคิดว่าเครื่องหมายคำถามในสตริง CONCAT เป็นตัวยึดตำแหน่ง

มีวิธีใดบ้างที่จะหลีกเลี่ยงเครื่องหมายคำถามเพื่อให้ PDO รู้ว่าไม่ใช่ตัวยึดตำแหน่ง

โปรดอย่าแสดงความคิดเห็นเกี่ยวกับวิธีการอื่นในการรับลิงก์ ฉันกำลังเปลี่ยนโค้ดเก่าที่เข้าไปในเครื่องมือสร้างเทมเพลตเก่า ดังนั้นการค้นหาวิธีหลีกเลี่ยงเครื่องหมายคำถามจึงทำงานน้อยกว่าการไม่ใส่เครื่องหมายคำถามในการสืบค้น


person Tony Brix    schedule 25.08.2014    source แหล่งที่มา
comment
เท่าที่ฉันสามารถบอกได้ว่า PDO นั้นฉลาดพอที่จะเข้าใจว่าไม่มีตัวยึดตำแหน่งภายในสตริง คุณสามารถวางคำสั่ง PHP ทั้งหมดได้หรือไม่?   -  person Mchl    schedule 25.08.2014
comment
ขออภัยลืม 'จากผู้ใช้'   -  person Tony Brix    schedule 25.08.2014
comment
โปรดแสดงโค้ดเพิ่มเติมให้เราดู เป็นการยากที่จะบอกว่าเหตุใดจึงคิดเช่นนั้น   -  person Funk Forty Niner    schedule 25.08.2014
comment
ความผิดพลาดของฉัน PDO ถูกต้องแล้วแบบสอบถามของฉันมีลักษณะเช่นนี้: ... name = '?' ดังนั้น PDO ไม่คิดว่าฉันมีตัวยึดตำแหน่งในแบบสอบถาม ฉันรู้สึกประหลาดใจที่ไม่พบในเอกสารประกอบ PDO ว่าจะหลีกเลี่ยงเครื่องหมายคำถามด้วย '?' ได้อย่างไร   -  person Tony Brix    schedule 25.08.2014


คำตอบ (1)


PDO จะไม่สับสนกับเครื่องหมายคำถามภายในเครื่องหมายคำพูด ฉันเพิ่งทดสอบสิ่งนี้ด้วย PHP 5.5.15

$sql = "SELECT CONCAT('path/to/page/?id=', id) AS link FROM foo WHERE name = ?;";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, 'name');
$stmt->execute();
print_r($stmt->fetchAll());

ทำงานได้ดีโดยไม่มีข้อผิดพลาดเกี่ยวกับจำนวนพารามิเตอร์ที่ไม่ถูกต้อง ข้อผิดพลาดของคุณมีสาเหตุมาจากวิธีที่คุณผูกพารามิเตอร์ ไม่ใช่โดยไวยากรณ์ SQL

ฉันสงสัยว่าคุณไม่ได้แสดงแบบสอบถาม SQL ทั้งหมดให้เราทราบ เนื่องจาก WHERE ที่ไม่มี FROM ก็เป็นข้อผิดพลาดทางไวยากรณ์อยู่แล้ว ดังนั้น คุณต้องมีตัวยึดตำแหน่งพารามิเตอร์เพิ่มเติมที่คุณไม่ได้แสดงให้เราเห็น นอกจากนี้ยังจะเป็นประโยชน์หากคุณแสดงให้เราเห็นว่าคุณผูกพารามิเตอร์อย่างไร (หรือส่งพารามิเตอร์เพื่อดำเนินการ ())

person Bill Karwin    schedule 25.08.2014
comment
ฉันเห็นว่าคุณเป็นส่วนหนึ่งของ Code Detectives Network ;) +1 - ฉันก็คิดแบบเดียวกัน แต่ฉันอยากเห็นโค้ด จริง ของ OP ก่อนที่จะส่งคำตอบ บิลทำงานได้ดี - person Funk Forty Niner; 25.08.2014
comment
ฉันทำเครื่องหมายคำตอบนี้เพราะคุณถูกต้อง นี่เป็นหนึ่งในความผิดพลาดโง่ๆ ของคุณ ข้อความค้นหาของฉันมีลักษณะดังนี้: SELECT CONCAT('path/to/page/?id=', id) AS link FROM users WHERE name = '?' ดังนั้น PDO จึงไม่คิดว่าจะมีตัวยึดตำแหน่งใดๆ - person Tony Brix; 25.08.2014
comment
@UziTech แล้วทำไมคุณถึงโพสต์คำถามของคุณโดยไม่ใช่สิ่งที่คุณใช้จริงตั้งแต่แรก? คุณจะได้คำตอบเร็วขึ้น (ขยิบตา) - person Funk Forty Niner; 25.08.2014
comment
@Fred เนื่องจากมีข้อมูลที่ละเอียดอ่อนในการสืบค้นจริง - person Tony Brix; 25.08.2014
comment
@UziTech ฉันเข้าใจและเคารพในสิ่งนั้น อย่างไรก็ตาม คุณโพสต์ WHERE name = ? แต่บอกว่าจริงๆ แล้วคุณใช้ WHERE name = '?' โดยมีเครื่องหมายคำพูดล้อมรอบเครื่องหมายคำถาม นั่นคือสาเหตุ (พริบตา) - นั่นคือสิ่งที่ฉันหมายถึงตามจริง มันแค่ทำให้การคาดเดาหมดไป แต่บิลพบวิธีแก้ปัญหาแล้ว และนั่นก็ดี ไชโย - person Funk Forty Niner; 25.08.2014