Long chaine SQL (ou autre)

Petite question d'esthétique dans le code. J'ai de longues requêtes SQL que je place dans des chaine que j'utilise avec format(string: [argc]) du sytle


 


let query = "SELECT table1.id, table 2.id, table2.nom, table2.adresse "


"FROM table1, table 2 " +


"WHERE table1.id = table2.id "+


"AND table2.nom LIKE '%@% "


 


Je ne trouve pas cela hyper élégant. Comment gérez-vous ce problème ?


 


Idéalement je souhaiterai les mettre dans un fichier un peu comme les localized strings mais je ne sais pas trop comment m'y prendre.


 


D'avance merci de vos réponses


Mots clés:

Réponses

  • Fais des DAO ?


    Déjà  il faudrait commencer par utiliser des preparedStatements non ?


     


    Si des DAO étaient de trop pour les 4 ou 5 requêtes que tu as (si tu n'en as que 4 ou 5, hein) alors encapsule le tout dans une struct avec des membres static ça cachera tout ces vilains paÌ‚tés de code.


  • muqaddarmuqaddar Administrateur

    Sur mes très longues requêtes (bien plus longues), j'utilise plutôt 1 variable par clause: une var qui s'appelle select, 1 var qui s'appelle from, 1 var qui s'appelle innerjoin...etc. Ensuite, une seule concaténation pour tout.


    ça fait plus de code, mais c'est plus propre., et il n'y a pas de variable définie sur plusieurs lignes...




  • Fais des DAO ?


    Déjà  il faudrait commencer par utiliser des preparedStatements non ?


     


    Si des DAO étaient de trop pour les 4 ou 5 requêtes que tu as (si tu n'en as que 4 ou 5, hein) alors encapsule le tout dans une struct avec des membres static ça cachera tout ces vilains paÌ‚tés de code.




    C'est quoi des DAO ?

  • AliGatorAliGator Membre, Modérateur
    +1 pour les preparedStatements, c'est fait pour en SQL justement et plus adapté (et surtout plus sécurisé !!) qu'un stringWithFormat d'autant que ça va formatter correctement chaque type de données y compris si tu as descaractères à  échapper.

    Parce que là  dans ta solution y'a de gros risques d'injection SQL (sympa, je peux totalement pourrir ta base, voire effacer ta base ou extraire des mots de passe de ta base, en choisissant la bonne chaà®ne, c'est quand même méchant...

    Pour se faire il faut utiliser la fonction "sqlite3_prepare_v2" de libsqlite (après je sais pas ce que tu utilises comme framework, si tu utilises direct la lib SQLite ou un wrapper genre FMDB autour, mais si c'est le cas FMDB doit bien avoir un wrapper autour de cette méthode)

    https://en.wikipedia.org/wiki/Prepared_statement
  • muqaddarmuqaddar Administrateur

    Oui, FMDB a un wrapper avec "?" pour éviter l'injection.


  • M'enfin les gars à  votre âge, il ne faut plus avoir peur des injections. C'est impressionnant les aiguilles, mais cela ne fait (presque) pas mal.

  • Merci pour les infos sur les injections. Je n'y avait pas pensé mais dans mon cas aucun risque la base de données est interrogé uniquement sur une date calculée. Mais j'y penserai quand l'utilisateur il s'agira d'une donnée sosie par un utilisateur.


     


    Du coup on s'éloigne du sujet : Est-il possible de stocker les requêtes SQL dans un fichier texte à  la sauce NSLocalized ?


Connectez-vous ou Inscrivez-vous pour répondre.