Quickie - remplace toutes les occurrences de '(apostrophe) par' '(deux apostrophes) dans un AnsiString (C ++)

StackOverflow https://stackoverflow.com/questions/463816

  •  19-08-2019
  •  | 
  •  

Question

Je pense que vous pouvez deviner le problème que j'ai. J'insère des noms de fichiers dans une base de données SQL dans C ++ Builder. Certains fichiers ont une apostrophe dans leur nom. Cela rompt la requête d'insertion SQL. la manière habituelle de résoudre ce problème consiste à doubler et apostrophes que vous voulez faire partie de la valeur du champ.

Par exemple, si je souhaite ajouter "george's" au champ "owner", la requête SQL sera "insérer dans la table (propriétaire), valeurs (" george's ")"

Je vais bien avec ce bit. Je dois juste faire remplacer les apostrophes simples par des doubles. AnsiString ne semble pas avoir de fonction intégrée pour cela. Existe-t-il un moyen simple de le faire sans avoir à inclure un nouveau fichier d’en-tête?

Était-ce utile?

La solution

En fait, j'ai moi-même la réponse ...

item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );

(il y a donc une fonction intégrée de remplacement dans AnsiString afterall)

Modifier: ajout de balises de code afin de pouvoir distinguer différentes citations

Autres conseils

Je n'ai pas utilisé AnsiString, mais je ferais essentiellement ce qui suit:

  • Inverser la recherche de guillemets simples dans votre chaîne
  • Regardez à gauche et à droite de l'index de guillemets simples actuel
  • S'il n'y a pas déjà une citation, insérez une citation après votre index actuel
  • Continuez à boucler jusqu'à atteindre l'index 0.

La méthode habituelle consiste à utiliser des instructions préparées au lieu de générer votre propre SQL. Recherchez Injection SQL pour une raison pour laquelle cela est mauvais. En gros, si vous oubliez de doubler les guillemets dans une instruction SQL si vous êtes dans une application, et qu'un attaquant peut soumettre une valeur dans cette instruction SQL, votre base de données est piratée. (Voir cette bande dessinée xkcd pour un exemple plein d'humour de ce qui peut arriver.)

Dans C ++ Builder, vous recherchez la fonction AnsiQuotedStr , dans SysUtils . Son inverse est AnsiExtractQuotedStr . Ce ne sont pas des méthodes du type AnsiString , car elles ne nécessitent pas une connaissance intime des éléments internes du type.

Plus important encore, vous devriez utiliser des requêtes paramétrées . Si les composants utilisés pour l'accès à la base de données ne les prennent pas en charge, procurez-vous une bibliothèque de base de données différente. Les choix de bases de données ne manquent pas, vous pouvez donc vous permettre d'être sélectif en ce qui concerne les fonctionnalités, et les requêtes paramétrées doivent figurer en haut de la liste.

Notez que malgré leurs noms, les fonctions AnsiX acceptent les paramètres UnicodeString , et non AnsiString , dans Delphi et C ++ Builder 2009.

Que se passe-t-il si vous le remplacez comme ça

item = StringReplace( item, "'", "\'", TReplaceFlags() );
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top