Maison  >  Article  >  développement back-end  >  Comment résoudre les problèmes de substitution de paramètres dans SQLite lors de l'utilisation de séquences ou de chaînes ?

Comment résoudre les problèmes de substitution de paramètres dans SQLite lors de l'utilisation de séquences ou de chaînes ?

DDD
DDDoriginal
2024-10-19 15:28:30459parcourir

How to Resolve Parameter Substitution Issues in SQLite When Using Sequences vs. Strings?

Dépannage des problèmes de substitution de paramètres dans SQLite

Vous rencontrez des problèmes lors de l'utilisation de la substitution de paramètres dans SQLite3 avec Python ? Voici une enquête approfondie et une résolution.

Pour tenter d'empêcher les injections SQL, la substitution de paramètres à l'aide de '?' est conseillé. Cependant, une erreur peut survenir lors de l'utilisation de cette approche. Par exemple, avec le code suivant :

<code class="python">for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
    self.cursor.close()</code>

L'erreur "sqlite3.ProgrammingError : nombre incorrect de liaisons fournies" se produit, indiquant que l'instruction spécifie une liaison, alors que huit sont fournies. Ce problème provient de la création initiale de la table de base de données. Le module responsable de la création de la base de données contient huit liaisons, ce qui entraîne une incompatibilité.

<code class="python">cursor.execute("""CREATE TABLE Equipment 
    (id INTEGER PRIMARY KEY, 
    name TEXT,
    price INTEGER, 
    weight REAL, 
    info TEXT, 
    ammo_cap INTEGER, 
    availability_west TEXT,
    availability_east TEXT)""")</code>

Ironiquement, en remplaçant « ? » avec un '%s' moins sécurisé résout le problème :

<code class="python">for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
    self.cursor.close()</code>

La raison de ce paradoxe réside dans la manière dont Cursor.execute() accepte son deuxième paramètre. Au lieu d'une seule chaîne, il attend une séquence, mais vous transmettez une chaîne de longueur huit.

Pour résoudre ce problème, ajustez le code comme suit :

<code class="python">self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])</code>

Cette modification garantit que la substitution de paramètres fonctionne comme prévu. Assurez-vous toujours que le deuxième paramètre transmis à Cursor.execute() correspond au nombre de liaisons spécifié dans l'instruction SQL.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn