Mysqli ที่ใช้ประโยค AS ไม่ทำงาน

Aug 18 2020

ฉันมีสองตารางที่เข้าร่วม ทั้งสองมีคอลัมน์รหัส

$query ->select($db->quoteName(array(
'a.id',
'a.address_one',
'a.address_three',
'a.address_two',
'b.id AS myStuff',
'b.person_id'
'b.packages_id',
'b.payment_date',

)))

->from($db->quoteName('#__person','a')) ->join('INNER', $db->quoteName('#__licence', 'b') . ' ON (' . $db->quoteName('a.id') . ' = ' . $db->quoteName('b.person_id') . ')')
->where($db->quoteName('a.published') . ' = '. $db->quote('1'))
->where($db->quoteName('b.published') . ' = '. $db->quote('1'));

อย่างไรก็ตามประโยค AS ไม่ทำงานและแสดงข้อผิดพลาด

bแบบสอบถามกลับมามี id AS myStuff,

ค่อนข้างมากกว่า

b. idเป็น myStuff

ฉันได้ลองชุดค่าผสมทั้งหมดที่ฉันคิดได้สำหรับประโยคนี้ แต่ไม่ว่าฉันจะใช้อะไรก็ตามฉันได้รับข้อผิดพลาด

ใครช่วยบอกฉันว่ารูปแบบที่ถูกต้องสำหรับการใช้ประโยค AS ในแบบสอบถาม

อัปเดต

ฉันพบว่าถ้าฉันลบบรรทัด b.id AS แล้วเพิ่มแยกต่างหาก

$ query-> เลือก ('b.id AS myStuff');

แบบสอบถามใช้งานได้แม้ว่าเครื่องหมาย "จะหายไป ไม่แน่ใจว่าฉันพลาดวิธีอื่นในการจัดการทั้งหมดภายในข้อความค้นหาเดิมหรือไม่

คำตอบ

2 Sharky Aug 18 2020 at 21:29

quoteName()นามแฝงควรจะเป็นอาร์กิวเมนต์ที่สองที่จะ เมื่ออาร์กิวเมนต์แรกเป็นอาร์เรย์อาร์กิวเมนต์ที่สองควรเป็นอาร์เรย์ที่มีความยาวเท่ากัน nullสำหรับคอลัมน์โดยไม่ค่าคุณควรผ่าน ซึ่งดูไม่ดีในกรณีของคุณ:

$query ->select( $db->quoteName(
            array(
                'a.id',
                'a.address_one',
                'a.address_three',
                'a.address_two',
                'b.id',
                'b.person_id',
                'b.packages_id',
                'b.payment_date',
            ),
            array(
                null,
                null,
                null,
                null,
                'myStuff',
                null,
                null,
                null,
            )
        )
    )

คุณสามารถแยกคอลัมน์ด้วยนามแฝงตามที่คุณได้กล่าวไปแล้ว หากคุณต้องการเก็บไว้ (ซึ่งในความเป็นจริงไม่จำเป็นเว้นแต่ว่าตัวระบุจะมีคำหลักที่สงวนไว้) ให้รวมไว้ในการquoteName()เรียกแยกกัน:

$query->select( $db->quoteName(
        array(
            'a.id',
            'a.address_one',
            'a.address_three',
            'a.address_two',
            'b.person_id',
            'b.packages_id',
            'b.payment_date',
        )
    )
)
    ->select($db->quoteName('b.id', 'myStuff'));

โดยส่วนตัวแล้วฉันชอบส่งอาร์เรย์ของคอลัมน์ที่ยกมาทีละคอลัมน์ เขียนโค้ดได้มากกว่า แต่ยังอนุญาตให้ผสมคอลัมน์ที่มี / ไม่มีนามแฝงและนิพจน์ภายในการselect()โทรครั้งเดียว และยังเร็วกว่าเนื่องจากวิธีการquoteName()จัดการอาร์เรย์ในปัจจุบัน

$query->select(
    array(
        // Allows column without alias.
        $db->quoteName('a.id'), // Allows column with alias. $db->quoteName('b.id', 'myStuff'),
        // Allows expressions.
        COUNT(*),
    )
)