Forum: Rails France rechercher une chaîne contenant des c aractères spéciaux

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Nicolas D. (Guest)
on 2007-01-19 17:30
(Received via mailing list)
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.
Mathieu C. (Guest)
on 2007-01-19 17:31
(Received via mailing list)
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'.
Lionel B. (Guest)
on 2007-09-26 00:38
(Received via mailing list)
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
Nicolas D. (Guest)
on 2007-09-26 00:52
(Received via mailing list)
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.
Jean-François (Guest)
on 2007-09-26 01:11
(Received via mailing list)
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.
Nicolas D. (Guest)
on 2007-09-26 01:19
(Received via mailing list)
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.
This topic is locked and can not be replied to.