Rechercher une chaîne contenant des c aractères spéciaux


#1

Salut, comme mon titre l’inddique, je recherche dans des activerecords
ceux conformes à une chaîne de recherche qui peut être “L’Histoire”.
Dans ce cas, je reçois une exception ActiveRecord::StatementInvalid
avec le message

SQLite3::SQLException: unrecognized token: "! ": SELECT * FROM aliases
WHERE (text = ‘L’Histoire’) LIMIT 1

Que puis-je faire pour qu’au lieu d’avoir cette exception, j’aie des
résultats ?
Dans le même ordre idée, comment puis-je insérer des caractères comme
“ê” en Unicode dans ma base ?


Nicolas D.
N’imprimez ce mail que si vous ne savez pas le lire sur l’écran : les
électrons se recyclent bien, le papier, beaucoup moins bien.


#2

Salut,

SQLite3::SQLException: unrecognized token: "! ": SELECT * FROM aliases
WHERE (text = ‘L’Histoire’) LIMIT 1

J’écrirais, en SQL :

SELECT * FROM aliases WHERE text=‘L’‘Histoire’.


#3

Mathieu C. wrote the following on 13.01.2007 14:31 :

Salut,

SQLite3::SQLException: unrecognized token: "! ": SELECT * FROM aliases
WHERE (text = ‘L’Histoire’) LIMIT 1

J’écrirais, en SQL :

SELECT * FROM aliases WHERE text=‘L’‘Histoire’.

Si le problème existe c’est dû au fait que Nicolas construit le SQL à la
main. Il vaut mieux utiliser ActiveRecord pour construire la requête
avec des placeholders :

aliases = Alias.find(:all, :conditions => [ ‘text = ?’, “L’Histoire” ])

ActiveRecord se charge alors des séquences d’échappement et le SQL
généré est toujours correct…

Lionel


#4

Nicolas :

ActiveRecord se charge alors des séquences d’échappement et
le SQL généré est toujours correct…

AÏe, ce serait donc une sale histoire de mauvais type de chaîne,
puisque le code qui foire est :

Il aurait été judicieux de donner le code qui foire dès le début,
on aurait évité les suppositions “Ah il a ptêtre écrit le code SQL
à la main”

Les logs c’est bien, mais le code associé au log, c’est mieux…

page_alias = Alias.find :first, :conditions => “text = ‘#{page_name}’”

Je l’ai donc remplacé par

Il faut toujours passer par des placeholders (pb de SQL injections)

page_alias = Alias.find :first, :conditions => [“text = ?”, page_name]

Et bien sûr, ça marche. Merci donc pour le coup de main.

On peut aussi utiliser les finders dynamiques pour se simplifier
la vie, dans ton cas :

page_alias = Alias.find_by_text(page_name)

РJean-Fran̤ois.


#5

On 1/13/07, Lionel B. removed_email_address@domain.invalid wrote:

Si le problème existe c’est dû au fait que Nicolas construit le SQL à la
main.

Ben en fait, j’utilise ActiveRecord …

Il vaut mieux utiliser ActiveRecord pour construire la requête
avec des placeholders :

aliases = Alias.find(:all, :conditions => [ ‘text = ?’, “L’Histoire” ])

ActiveRecord se charge alors des séquences d’échappement et le SQL
généré est toujours correct…

AÏe, ce serait donc une sale histoire de mauvais type de chaîne,
puisque le code qui foire est :

page_alias = Alias.find :first, :conditions => "text = 

‘#{page_name}’"

Je l’ai donc remplacé par

page_alias = Alias.find :first, :conditions => ["text = ?", 

page_name]

Et bien sûr, ça marche. Merci donc pour le coup de main.


Nicolas D.
N’imprimez ce mail que si vous ne savez pas le lire sur l’écran : les
électrons se recyclent bien, le papier, beaucoup moins bien.


#6

On 1/14/07, Jean-François removed_email_address@domain.invalid wrote:

Nicolas :

Il aurait été judicieux de donner le code qui foire dès le début,
on aurait évité les suppositions “Ah il a ptêtre écrit le code SQL
à la main”

Désolé d’avoir oublié cette règle de base.

Les logs c’est bien, mais le code associé au log, c’est mieux…

Tiens, en parlant de ça, un des trucs qui me manque le plus avec
Rails, c’est l’écriture de logs à la log4j. Bien sûr, j’imagine qu’il
doit exister quelques chose de comparable, mais où ? et comment
fait-on pour définir un log level ? Bref, toutes les questions de base
sur les logs.

Il faut toujours passer par des placeholders (pb de SQL injections)

Faudra que je dise ça à l’auteur initial du code …

page_alias = Alias.find_by_text(page_name)

Il va retourner le premier alias, ou tous les alias ?

Merci encore pour le coup de main


Nicolas D.
N’imprimez ce mail que si vous ne savez pas le lire sur l’écran : les
électrons se recyclent bien, le papier, beaucoup moins bien.