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
Libérer: 2024-10-19 15:28:30
original
458 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!