使用序列與字串時如何解決 SQLite 中的參數替換問題?

DDD
發布: 2024-10-19 15:28:30
原創
459 人瀏覽過

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

排查 SQLite 中的參數替換問題

在 Python 中使用 SQLite3 中的參數替換時遇到問題?這裡有一個深入的調查和解決方案。

為了防止 SQL 注入,使用「?」進行參數替換是可取的。然而,使用這種方法時可能會出現錯誤。例如,使用以下程式碼:

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

出現錯誤“sqlite3.ProgrammingError:提供的綁定數量不正確”,表示該語句指定了一個綁定,而提供了八個。此問題源自於資料庫表的初始建立。負責資料庫建立的模組包含八個綁定,這會導致不匹配。

<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>
登入後複製

諷刺的是,替換為「?」使用較不安全的'%s' 可以解決問題:

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

這個悖論背後的原因在於Cursor.execute () 接受第二個參數的方式。它需要一個序列,而不是單一字串,但您傳遞的是長度為 8 的字串。

要修正此問題,請將程式碼調整為以下內容:

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

此修改確保參數替換按預期工作。始終確保傳遞給 Cursor.execute() 的第二個參數對應於 SQL 語句中指定的綁定數量。

以上是使用序列與字串時如何解決 SQLite 中的參數替換問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!