Как убрать лишний апостроф - PullRequest
0 голосов
/ 17 мая 2019

Я написал SQL-запрос, чтобы найти желаемый результат для моего проекта. Я работал нормально с правильным выводом. Но внезапно он начал выдавать ошибку, и в запросе SQL появляется некоторая дополнительная апоатрофа. Как ее решить?

Я пытался добавить запрос к $this->db->query();, но все равно не помог.

public function getStudentConut($id) {
     $this->db->select('students.id')
            ->from('students')
            ->join('bp','students.pbp = bp.id','left')
            ->where(condition 1)
            ->where(condition 2);
    $query1 = $this->db->get_compiled_select(); 

    $this->db->select('students.id')
            ->from('students')
            ->join('bp','students.dbp = bp.id','left')
            ->where(condition 1)
            ->where(condition 2);
    $query2 = $this->db->get_compiled_select(); 

    $this->db->select('COUNT(id) as stud_count')
       ->from('('.$query1." UNION ALL ".$query2.') X')
       ->group_by('X.id');

    $results = $this->db->get();
    return $results->num_rows();
}

Он давал правильный счет ранее. Но без каких-либо новых изменений он начал выдавать ошибку.

Теперь я получаю ошибку:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с '. id`` WHERE ``bp. some_value`` IS NULL AND ``students .`schoo' в строке 2

SELECT COUNT (id) в виде Stud_count FROM (SELECT students. id`` FROM ``students`` LEFT JOIN ``bp`` ON ``students. pbp`` = ``bp. id`` WHERE ``bp .. Некоторые другие условия .. UNION ALL SELECT студентов . идентификатор FROM студентов LEFT JOIN п.о. ON студенты . DBP = п.о. . ID ..some other condition....) X GROUP BY X . id`

1 Ответ

0 голосов
/ 18 мая 2019

Я думаю, что проблема (по крайней мере с двойным `) в том, что CodeIgniter не очень хорош с подзапросами и тому подобным. По сути, каждый раз, когда вы получаете скомпилированный оператор select, он уже имеет escape-идентификаторы, а затем вы помещаете его в оператор from в конце, который добавит дополнительные escape-идентификаторы поверх этого.

`->from('('.$query1." UNION ALL ".$query2.') X')`

К сожалению, в отличие от других методов, таких как set, from не имеет 2-го параметра, который позволяет установить escape-значение на false (что, я думаю, вам нужно).

Я предлагаю попробовать это:

$this->db->_protect_identifiers = FALSE;
$this->db->select('COUNT(id) as stud_count')
       ->from('('.$query1." UNION ALL ".$query2.') X')
       ->group_by('X.id');
$results = $this->db->get();
$this->db->_protect_identifiers = TRUE;

, а также посмотрите на это: ->where(condition 2);, который, я уверен, не должен компилироваться из-за отсутствия кавычек. Вы, вероятно, не хотите, чтобы это сбежало, поэтому вы можете сделать ->where('condition 2', '', false); согласно: https://www.codeigniter.com/user_guide/database/query_builder.html#CI_DB_query_builder::where

Когда все остальное терпит неудачу, просто знайте, что CodeIgniter имеет некоторые ограничения для «продвинутых» запросов, и что, возможно, вам следует выписать его вручную в виде строки, используя $this->db->escape_str(...) для экранирования ввода пользовательского ввода и $this->db->query(...) для запуска SQL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...