2010-10-22 4 views
0

J'ai une action de contrôleur qui utilise une requête SQL:CakePHP: ajouter des variables à interroger dans le contrôleur

$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')); 

Comme vous pouvez le voir à la fin, je veux utiliser une clause where avec la variable $ tag mais je Je ne sais pas comment la syntaxe irait. Comme je reçois l'erreur

Unknown column '$tag' in 'where clause' 

Quelqu'un peut-il me diriger dans la bonne direction?

Ta,

Jonesy

Répondre

-3

Modifier votre requête comme:

$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 
        ); 

et il fonctionnera.

+4

injection Saint SQL en attente de se produire, Batman! – deceze

+0

L'injection SQL évasive est hors de question actuellement. – fabrik

+0

Vous devriez au moins le noter cependant, l'OP ne semble pas trop préoccupé par cela. Utiliser votre code tel quel serait mauvais. – deceze

1

en php il y a une difference between single and double quotes ... essentiellement, des guillemets simples DonT évaluer les variables ... utiliser des guillemets doubles au lieu et je pense que LIKE aussi besoin des guillemets simples .. Je suis sûr de ne pas vraiment

"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'" 

je sais .. Je sais .. les gens vont commencer racontes injection sql .. et la nécessité de les scape ... caracters c'est une autre question =)

bonne chance!

4

Je vous recommande fortement d'utiliser le Cake ORM au lieu de requêtes brutes, surtout si vous souhaitez y connecter des paramètres d'URL. Les conditions sur les tables HABTM peuvent être difficiles, mais vous pouvez aussi créer vos jointures en utilisant la syntaxe ORM de Cake!

Lire le manuel, section 3.7.6.9 Joining tables.

+0

vous faites un bon point. Je vais mettre de côté un peu de temps pour apprendre le Gâteau ORM. Quels sont les principaux avantages cependant? pourquoi sont-ils tellement mieux qu'une requête sql brute? – iamjonesy

+2

Les avantages principaux sont une protection intégrée contre l'injection SQL, un couplage lâche aux sources de données, une meilleure portabilité, une lisibilité et une maintenabilité généralement améliorées, la prise en charge des rappels de modèles et la mise en cache des requêtes. Et c'est juste pour les opérations de lecture. L'ORM de Cake n'est pas le meilleur du monde, mais il offre des améliorations marquées par rapport au SQL brut. –

3

Si vous voulez utiliser ORM Cake, le code suivant doit fournir des résultats équivalents à votre requête SQL brute:

$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')); 
Questions connexes