2010-09-01 12 views
1

J'ai une base de données d'emplacements, l'utilisateur peut choisir parmi en tapant et saisie semi-automatique. Dans mon contrôleur CakePHP, je fais ceci:commande personnalisée CakePHP par clause pour jQuery autocomplete

$locations = $this->Location->find('all', array(
     'conditions' => array('Location.name like' => '%'.$term.'%'), 
     'fields' => array('Location.id', 'Location.name', 'Region.name'), 
     'order' => array(
      array('Location.name = "'.mysql_real_escape_string($term).'"' 
       => 'desc'), 
      'Location.name' 
     ), 
     'limit' => 10, 
     'recursive' => 1, 
    )); 

Il fonctionne parfaitement bien, mais il se sent comme un hack, et je préfère ne pas échapper à moi-même littéraux SQL.

La première commande par clause est nécessaire car un match parfait pourrait par ailleurs pas le faire en haut de la liste triée par ordre alphabétique.

Je considère déplacer l'égalité-test dans un champ virtuel, mais je ne pense pas que c'est une solution très élégante lorsque le terme de $ est dynamique.

Comment est-ce que je peux implémenter ceci d'une meilleure manière?

+0

Cela semble bien pour moi. Pensez à la façon dont vous l'écrivez si vous deviez écrire la version SQL, alors vous aurez une idée de son élégance. Si cela fonctionne, laissez-le. – Leo

+0

Est-ce que Cake n'échappe pas automatiquement à TOUS les sql? J'aurais deviné que cela échapperait à votre ordre par clause ainsi que tout le reste. –

+0

En fait, je me suis rendu compte que ce n'est pas un moteur de recherche, mais une simple complétion automatique, donc la solution * real * consiste à chercher un nom * commençant * avec le terme ($ term. '%'). Ensuite, l'ordre par correspondance exacte n'est plus nécessaire. – geon

Répondre

0

En ce qui concerne la structure de votre requête est écrit ceci est bien.

En ce qui concerne devoir échapper SQL vous, c'est from the Cookbook:

CakePHP vous protège déjà contre SQL Injection si vous utilisez ORM méthodes de CakePHP (comme find() et save()) et notation de tableau correcte (par exemple array ('field' => $ value)) au lieu de SQL brut. Pour sanitization contre XSS son généralement mieux pour sauver HTML brut dans la base de données sans modification et aseptiser au moment de la sortie /affichage.