SQLite用户名模糊查询报SQLITE_RANGE列索引越界错误
问题原因
报错核心是SQL参数占位符写法错误,这也是语句在SQLite CLI能运行、代码中执行报错的根本原因:
- 你把参数占位符
?写在了双引号包裹的字符串常量"%?%"内部,SQLite的预编译解析器不会把字符串内部的?识别成可替换的参数占位符,只会把它当成普通的问号字符处理。也就是说你在CLI里执行这条语句时,实际匹配的是username字段包含字面量?的记录,根本不是你想要的关键词模糊匹配效果。 - 代码执行时你会按预期给这条SQL传入1个绑定参数,但预编译后的SQL实际没有可接收参数的占位符,传入参数数量和语句要求的参数数量不匹配,就会抛出
SQLITE_RANGE: column index out of range错误。
修复方案
不要把参数占位符包裹在带通配符的字符串常量里,两种标准写法都可以,都能保留参数绑定的防注入能力:
- 方案1:在代码侧拼接通配符
SQL语句里只保留独立的占位符:
执行传参时,把用户输入的搜索关键词和通配符拼成完整的匹配串再传入即可,比如用户输入SELECT * FROM users WHERE username LIKE ? LIMIT 25;abc,实际传入的参数值就是%abc%。 - 方案2:在SQL侧拼接通配符
如果不想在代码层处理字符串拼接,可以用SQLite的字符串拼接语法,保证?是独立的占位符:
这种写法执行时直接传入用户输入的原始搜索关键词即可,不需要额外处理通配符。SELECT * FROM users WHERE username LIKE '%' || ? || '%' LIMIT 25;
注意事项
不要为了绕过报错直接把用户输入拼接到SQL语句里(比如直接拼成LIKE "%abc%"的硬编码形式),会留下SQL注入风险,也无法复用预编译SQL语句,性能和安全性都没有保障。
内容的提问来源于stack exchange,提问作者chomeable
相关产品推荐
相关产品推荐

