Javascript SQLite for Cordova 应用程序 - 使用字符串包含不区分大小写的子字符串的参数进行搜索

Javascript SQLite for Cordova app - search using parameters where a string contains a substring case-insenstive

在我的 Cordova 应用程序中,我需要查询 SQLite 数据库和 select 行,其中 EventName 列的值包含一个子字符串。我希望能够使用?保存值以避免 SQL 注入。我试过这个查询:

SELECT * FROM EventName WHERE 1 = 1 AND lower(EventName) LIKE lower('%?%');

这是我用来查询数据库的 JavaScript 代码:

function searchEvent(onSearch, eventName) {
    // First create the query string
    var params = [];
    var query = "SELECT * FROM Event WHERE 1 = 1";
    if (eventName != null && eventName != "") {
        query += " AND lower(EventName) LIKE lower('%?%')";
        params.push(eventName);
    }
    query += ";";
    console.log(query); // Log the query
    console.log(params); // Log the parameters
    // Then execute query statement
    db.transaction(function(tx) {
        tx.executeSql(query, params, function(tx, rs) {
            onSearch(rs);
        });
    }, function(err) {
        console.log(err); // This statement was executed
    });
}

这是记录的查询:

SELECT * FROM Event WHERE 1 = 1 AND lower(EventName) LIKE lower('%?%');

这是记录的参数:

[ 'myInput' ]

这是返回的错误:

{
    code: 5,
    messsage: 'number of \'?\'s in statement string does not match argument count'
}

如您所见,有 1 个 ? 占位符和 1 个输入参数,因此数字 DO 匹配。我认为这是因为 ? 在单引号 ('') 之间,所以它被认为是搜索字符串的一部分。我该如何解决这个问题?

编辑:

JavaScript 语句 "SELECT * FROM Event WHERE 1 = 1" + " AND lower(EventName) LIKE lower('%" + eventName + "%')" 没问题,但我想使用一种方法来保护我免受 SQL 注入

为了防止 eventName 从 SQL 注入,请使用 regEx 验证检查它以仅包含字母数字和白名单特定的特殊字符 /^[ A-Za-z0-9_@./#&+-]*$/。也试试这个正则表达式 /^[a-zA-Z0-9!@#$%\^\&*)(+=._-]+$/g。我不认为 ?将与 SQL SELECT 语句一起使用,因此您需要传递 +eventname+

希望对您有所帮助。