Requête sur une sous-chaine

Bonjour,

Je voudrais ajouter dans un annuaire une action listant des personnes
par département. Pour cela, je voudrais m’inspirer de cette action qui
les liste par code postal :

def postcode
@people = Person.find(:all, :conditions => [“postcode = ?”,
params[:id]])
render :template => ‘people/index’
end

J’ai donc ajouté dans mon contrôleur cette action :

def department
@people = Person.find(:all, :conditions => [“postcode = ?”,
params[:id]])
render :template => ‘people/index’
end

Cependant, je ne sais pas comment écrire la requête pour qu’elle
consulte les 2 premiers caractères du champ “postcode” de chaque entrée
(afin d’en déduire le code départemental).

Merci pour votre aide.

bonjour,
un truc du style :
:conditions => [“postcode REGEXP "^??"”, params[:id][0…2]]

2008/6/13 Zangief I. [email protected]:

2008/6/13 guillaume belleguic [email protected]:

bonjour,
un truc du style :
:conditions => [“postcode REGEXP "^??"”, params[:id][0…2]]

Je crois que REGEXP n’est pas une fonction sur toute les BDD. J’aurais
plus fait un postcode LIKE “?%”

@people = Person.find(:all, :conditions => [“postcode = ?”,
end


Cyril M.

guillaume belleguic wrote:

bonjour,
un truc du style :
:conditions => [“postcode REGEXP "^??"”, params[:id][0…2]]

Merci pour votre réponse. Je viens d’essayer et voici la mise à jour de
mon action :

def department
@people = Person.find(:all, :conditions => [“postcode REGEXP
"/^[0-9]{2}/"”, params[:id]])
render :template => ‘people/index’
end

J’ai légèrement modifié l’expression régulière. Normalement ça devrait
fonctionner. Seulement lorsque j’exécute l’action (via l’adresse :
http://0.0.0.0:3000/people/department/75), je n’obtiens aucun résultat
(contrairement à l’autre action :
http://0.0.0.0:3000/people/postcode/75013).

Est-ce qu’il y a quelque chose que j’ai loupé ? Oo
Merci à vous :slight_smile:

Le 13 juin 2008 17:10, Zangief I. a écrit :

Cependant, je ne sais pas comment écrire la requête pour
qu’elle consulte les 2 premiers caractères du champ “postcode”
de chaque entrée (afin d’en déduire le code départemental).

Questions bêtes : ça va marcher avec la Corse ? La Guadeloupe ?
La Nouvelle-Calédonie ?

– Jean-François.


http://twitter.com/underflow_

Oops, je crois savoir pourquoi ça n’a pas fonctionné. En regardant les
logs, la requête est générée de cette façon :
SELECT * FROM people WHERE (postcode LIKE “‘75’%”)

Il faudrait que j’enlève les simples cotes autour du numéro de
département…

Voici la modification :
@people = Person.find(:all, :conditions => “postcode LIKE
“#{params[:id]}%””)

Jean-François Trân wrote:

Questions b�tes : �a va marcher avec la Corse ? La Guadeloupe ?
La Nouvelle-Cal�donie ?

Normalement oui, ça devrait, car les départements sont identifiés en
tant que chaîne de caractères. Ainsi, les départements avec des
caractères comme le département de la Corse-du-Sud qui correspond à “2A”
devrait être accessible.

2008/6/13 Zangief I. [email protected]:

Voici la modification :
@people = Person.find(:all, :conditions => “postcode LIKE
"#{params[:id]}%"”)

WARNING

SQL Injection detected

WARNING


Cyril M.

Le 13 juin 2008 18:42, Zangief I. a écrit :

Jean-François Trân wrote:

Questions bêtes : ça va marcher avec la Corse ? La Guadeloupe ?
La Nouvelle-Calédonie ?

Normalement oui, ça devrait, car les départements sont identifiés
en tant que chaîne de caractères. Ainsi, les départements avec
des caractères comme le département de la Corse-du-Sud qui
correspond à “2A” devrait être accessible.

Mais les codes postaux corses ne sont pas en 20 000 quelque chose ?

– Jean-François.


http://twitter.com/underflow_

Cyril M. wrote:

2008/6/13 Zangief I. [email protected]:

Voici la modification :
@people = Person.find(:all, :conditions => “postcode LIKE
"#{params[:id]}%"”)

WARNING

SQL Injection detected

WARNING

J’ai mis ça pour éviter les débordements :slight_smile:

code = params[:id].to_i
code = code.to_s
code = ‘0’ + code if code.length == 1
@people = Person.find(:all, :conditions => “postcode LIKE "#{code}%"”)