it-mot-dan-vi.com

Lỗi cú pháp SQL khi cố gắng lọc chế độ xem danh sách - cách xây dựng mệnh đề WHERE?

Tôi đã xây dựng một thành phần Joomla cho một trường học bằng cách sử dụng component-creator.com và bây giờ tôi đang cố gắng sửa đổi các tệp nguồn.

Chế độ xem hiện tại của tôi liệt kê tất cả phụ huynh và học sinh trong cơ sở dữ liệu của tôi, hiển thị cho tất cả người dùng đã đăng ký. Tôi đang cố gắng sửa đổi truy vấn SQL trong mô hình/student.php để chỉ hiển thị các sinh viên được liên kết với người dùng hiện đang đăng nhập. Tôi đã cố gắng làm điều này bằng cách sửa đổi mệnh đề where, nhưng tôi cứ bị lỗi cú pháp.

Dưới đây là mã gốc của mô hình/học sinh.php , hiển thị tất cả học sinh và phụ huynh cho bất kỳ ai có quyền xem biểu mẫu.

public function getItems()
    {
        $items = parent::getItems();

        foreach ($items as $item)
        {
            if (isset($item->parent) && $item->parent != '')
            {
                if (is_object($item->parent))
                {
                    $item->parent = \Joomla\Utilities\ArrayHelper::fromObject($item->parent);
                }

                $values = (is_array($item->parent)) ? $item->parent : explode(',', $item->parent);
                $textValue = array();

                foreach ($values as $value)
                {
                    $db = JFactory::getDbo();
                    $query = $db->getQuery(true);
                    $query
                            ->select('`#__users_2679886`.`name`')
                            ->from($db->quoteName('#__users', '#__users_2679886'))
                        ->where($db->quoteName('id') . ' = ' . $db->quote($db->escape($value)));
                    $db->setQuery($query);
                    $results = $db->loadObject();

                    if ($results)
                    {
                        $textValue[] = $results->name;
                    }
                }

                $item->parent = !empty($textValue) ? implode(', ', $textValue) : $item->parent;
            }

        }

        return $items;
    }

Và đây là phần mã tôi đã sửa đổi, tạo ra lỗi cú pháp:

            $db = JFactory::getDbo();
            $user = JFactory::getUser();
            $query = $db->getQuery(true);
            $query
                    ->select('`#__users_2679886`.`name`')
                    ->from($db->quoteName('#__users', '#__users_2679886'))
                ->where($db->quoteName('id') . ' = ' . $db->quote($db->escape($value)) AND parent.id = $user->id);
            $db->setQuery($query);
            $results = $db->loadObject();

Tôi chỉ đơn giản là cố gắng sửa đổi nguyên nhân WHERE bằng cách thêm AND parent.id = $user->id, nhưng lỗi cú pháp được trả về là: lỗi cú pháp, không mong muốn '=', mong đợi ',' hoặc ')'

Tôi đang tìm kiếm sự giúp đỡ để sửa đổi mã cụ thể của mình cũng như giải thích về mệnh đề WHERE, vì cú pháp SQL chuỗi của Joomla gây nhầm lẫn cho tôi và tôi sẽ cần phải thực hiện nhiều thao tác WHERE trong suốt thiết kế trang web của mình. Tôi đã tham khảo tại đâytại đây , nhưng dường như tôi không thể tìm thấy một hướng dẫn rõ ràng cho thấy cách xây dựng và xâu chuỗi câu lệnh WHERE.

Bất kỳ cái nhìn sâu sắc được đánh giá cao. Cảm ơn bạn.

3
Nathanael

Hãy thử thay đổi truy vấn của bạn thành như sau:

$query->select('#__users_2679886', 'name')
      ->from($db->qN('#__users', '#__users_2679886'))
      ->where($db->qN('id') . ' = ' . $db->q($value)
      ->where($db->qN('parent.id') . ' = ' . $user->id);

Vấn đề đã đến từ $db->q(parent.id = $user->id).

Ngoài ra, tôi đã thực hiện một số điều chỉnh cho truy vấn cho bạn.

Chỉ cần lưu ý rằng bạn không cần phải làm $db->quote($db->escape('XXX')), chỉ cần $db->quote('XXX') là ổn.

4
Lodder