SQLite 动态 WHERE 子句不起作用

Posted

技术标签:

【中文标题】SQLite 动态 WHERE 子句不起作用【英文标题】:SQLite dynamic WHERE Clause not working 【发布时间】:2018-08-04 13:31:23 【问题描述】:

当单击搜索按钮时,应该会出现一个表,其中包含包含所选列表项名称的所有记录,但由于某种原因,它无法正常工作,因为该表根本没有出现。有谁知道如何解决这个问题?

HTML

<!DOCTYPE html>
<html>

<head>
    <title>World</title>

    <meta name="viewport" content="width=default-width; user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1" />

    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min.css" />
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min.js"></script>
</head>

<body onload="init()">
    <div data-role="page" id="myform">
        <div data-role="header">
            <h1>World</h1>
        </div>

        <div data-role="content">
            <form>
                <table cellpadding="2" cellspacing="2">
                    <tr>
                        <td>Continent</td>
                        <td>
                            <select id="continent" required>
                                <option value="Africa">Africa</option>
                                <option value="Antarctica">Antarctica</option>
                                <option value="Asia">Asia</option>
                                <option value="Europe">Europe</option>
                                <option value="North America">North America</option>
                                <option value="Oceania">Oceania</option>
                                <option value="South America">South America</option>
                            </select>
                        </td>
                    <td>
                        <input type="button" value="Search" class="btn-form" data-icon="search" onclick="search()">
                        </td>
                    </tr>
                </table>
            </form>

            <div id="result"></div>
    </div>
</body>

</html>

JavaScript

var db = openDatabase('helloworld', '1.0', 'World', 5 * 1024 * 1024);

function init() 
    "use strict";

    db.transaction(function (tx) 
        tx.executeSql('DROP TABLE continents');
        tx.executeSql('CREATE TABLE IF NOT EXISTS continents(id INTEGER PRIMARY KEY AUTOINCREMENT, continent TEXT)');


        //Record 1
        tx.executeSql('INSERT INTO continents(continent) values("Africa")');
        tx.executeSql('INSERT INTO continents(continent) values("Antarctica")');
        tx.executeSql('INSERT INTO continents(continent) values("Asia")');
        tx.executeSql('INSERT INTO continents(continent) values("North America")');
        tx.executeSql('INSERT INTO continents(continent) values("Oceania")');
        tx.executeSql('INSERT INTO continents(continent) values("South America")');        
    );


function search(id) 
    "use strict";

    db.transaction(function (tx) 
        tx.executeSql('SELECT * FROM continents WHERE continent = ?', [continent], function (tx, results) 
            var n = results.rows.length;
            var s = '<h2>Results</h2>';
            s += '<table cellpadding="3" cellspacing="3" border="1">'; 
            s += '<tr><th>ID</th><th>Continent</th></tr>';
            for (var i = 0; i < n; i++) 
                var work = results.rows.item(i);
                s += '<tr>';
                s += '<td>' + work.id + '</td>';
                s += '<td>' + work.continent + '</td>';
                s += '</tr>';
            
            s += '</table>';
            document.getElementById('result').innerHTML = s;
        );
    );

【问题讨论】:

那么问题出在哪里?你能 console.log(s) 看看它是否包含预期的数据吗?还是您遇到错误? 我看到 [continent] 被传递给 tx.executeSql 但我看不到 continent 的定义位置。您的意思是使用id 作为占位符的值吗? 不,continent 是在 CREATE TABLE 命令中定义的。 continents 表是在数据库中创建的,但这与 javascript 中的 continent 变量没有任何关系。如果您在该函数中调用console.log(continent),它会说明什么? @muistooshort 你指的是tx.executeSql('SELECT * FROM continents WHERE continent = ?', [continent], function (tx, results) 行吗?请记住,continenet 代表用户从选择列表中选择的项目。 【参考方案1】:

正如@mu-is-too-short 所说,您没有定义在 where 子句中使用的 JavaScript 变量 continent。另一点是搜索函数希望接收一个参数 (id),但在调用该函数时您不发送任何参数。不过,最后一个现在无所谓了……

一种可能的解决方法是,在执行查询之前,将所选选项保存在名为 continent 的 JavaScript 变量中,这样您就不必更改大量代码。

var continent = $('#continent').find(":selected").text();

喜欢这篇文章:jQuery Get Selected Option From Dropdown

另外你还要关闭一个&lt;div&gt;

让我知道这是否有效。

【讨论】:

以上是关于SQLite 动态 WHERE 子句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 WHERE 子句的查询不起作用

Sql where子句不起作用

为啥我的 WHERE 子句在我的组合框中不起作用

用于有序字符串的 postgresql where 子句不起作用

BigQuery 的 WHERE 子句中的 SELECT 语句不起作用

Crystal Reports v13.0.2000.0.:为啥“where”子句在子报表中不起作用?