CakePHP: добавить переменные для запроса в контроллере - PullRequest
0 голосов
/ 22 октября 2010

У меня есть действие контроллера, которое использует SQL-запрос:

    $tag = $this->params['tag'];

    $this->set('projects', $this->Project->query('SELECT * FROM projects INNER JOIN projects_tags ON projects.id = projects_tags.project_id INNER JOIN tags on projects_tags.tag_id = tags.id WHERE tags.tag LIKE $tag'));

Как вы можете видеть в конце, я хочу использовать предложение where с переменной $ tag, но я не уверен, каксинтаксис пошел бы.Как я получаю ошибку

Unknown column '$tag' in 'where clause'

Может ли кто-нибудь направить меня в правильном направлении?

Та,

Джонси

Ответы [ 5 ]

4 голосов
/ 22 октября 2010

Я бы настоятельно рекомендовал вам использовать Cake ORM вместо необработанных запросов, особенно если вы собираетесь вставить в него параметры URL.Условия для таблиц HABTM могут быть сложными, но вы также можете создавать свои объединения, используя синтаксис Cake ORM!

Прочтите руководство, раздел 3.7.6.9 Объединение таблиц .

3 голосов
/ 22 октября 2010

Если вы хотите использовать ORM в Cake, следующий код должен предоставить результаты, эквивалентные вашему необработанному SQL-запросу:

$this->loadModel('ProjectsTag'); // Load the joining table as pseudo-model

// Define temporary belongsTo relationships between the pseudo-model and the two real models
$this->ProjectsTag->bindModel(array(
    'belongsTo' => array('Project','Tag')
));

// Retrieve all the join-table records with matching Tag.tag values
$result_set = $this->ProjectsTag->find('all',array(
    'conditions' => array('Tag.tag LIKE' => "%{$tag}%")
));

// Extract the associated Project records from the result-set
$projects = Set::extract('/Project', $result_set);

// Make the set of Project records available to the view
$this->set(compact('projects'));
1 голос
/ 22 октября 2010

Я бы, по крайней мере, рассмотрел возможность использования функций санитарной обработки cakephp в ваших строках тегов, если они получены от пользователя. См. http://book.cakephp.org/view/1183/Data-Sanitization или, если в качестве базы данных используется mysql, по крайней мере, рассмотрите возможность использования http://www.php.net/manual/en/function.mysql-escape-string.php или сделайте что-нибудь для фильтрации своего пользовательского ввода. Но лучше всего использовать материалы из CakePHP.

1 голос
/ 22 октября 2010

в php есть разница между одинарными и двойными кавычками ... в основном, одинарные кавычки не оценивают переменные ... вместо них используйте двойные кавычки И я думаю, что LIKE понадобятся и одинарные кавычки ... я не совсем уверен

"SELECT * FROM projects INNER JOIN projects_tags ON projects.id = projects_tags.project_id INNER JOIN tags on projects_tags.tag_id = tags.id WHERE tags.tag LIKE '$tag'"

я знаю .. я знаю .. люди начнут говорить о инъекции sql .. и необходимости бросать кулачки ... это другой вопрос =)

удачи!

0 голосов
/ 22 октября 2010

Измените ваш запрос как:

$this->set('projects',
$this->Project->query("SELECT * FROM projects
                       INNER JOIN projects_tags
                       ON projects.id = projects_tags.project_id
                       INNER JOIN tags ON projects_tags.tag_id = tags.id
                       WHERE tags.tag LIKE '" . $tag . "'") //problem was here
                     );

и он будет работать.

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