Количество символов "?" В строке оператора не соответствует количеству аргументов

Я пытаюсь сделать синхронизацию с моим API, используя WebSQL, но я получаю следующую ошибку:

число символов "?" в строке оператора не соответствует количеству аргументов.

Я следовал этому уроку

Я не знаю, что происходит, что мне здесь не хватает?

function createTable() {
            db.transaction(
                function (tx) {

                    tx.executeSql('CREATE TABLE IF NOT EXISTS COUNTRY (id, countryName, countryCode)');
                    tx.executeSql('CREATE TABLE IF NOT EXISTS LOCATION (id, locationName)');
                    tx.executeSql("CREATE TABLE IF NOT EXISTS clientes (" +
                    "clientes_id Integer PRIMARY KEY AUTOINCREMENT, " +
                    "_criado Text, " +
                    "_modificado Text, " +
                    "_status Text, " +
                    "id_rm Integer, " +
                    "credencial_id Integer, " +
                    "informacao_adicional, " +
                    "nome, " +
                    "tipo, " +
                    "CONSTRAINT unique_clientes_id UNIQUE ('clientes_id'))");
                    tx.executeSql('CREATE INDEX IF NOT EXISTS "clientes.index_clientes_id" ON "clientes"("clientes_id");');



                },
                txErrorHandler,
                function () {
                    log('clientes table created successfully');
                }
            );
        }
function getLastSync() {
            db.transaction(
                function (tx) {
                    var sql = "SELECT MAX(_modificado) as lastS FROM clientes";


                    tx.executeSql(sql,
                        function (tx, results) {


                            var lastSync = results.rows.item(0).lastS;
                            console.log(lastSync);

                        }
                    );

                },
                txErrorHandler,
                function () {
                    log('error');
                }
            );
        }

        function getChanges(syncURL, modifiedSince) {


            ServiceClientes.getAll(syncURL, modifiedSince).success(function (data) {
                log("The server returned " + data.length + " changes that occurred after " + modifiedSince);
            }).error(function (error) {
                console.log(error);
            });


        }

        function applyChanges() {

            angular.forEach(data.dados, function (item) {
                db.transaction(
                    function (tx) {
                        log(item.nome + " : " + item.tipo_pessoa);

                        tx.executeSql('INSERT OR REPLACE INTO clientes (nome, tipo, ' +
                        '_criado,' +
                        '_modificado , ' +
                        '_status, ' +
                        'id_rm, ' +
                        'informacao_adicional ) VALUES (?,?,?,?,?,?,?)',
                        [item.nome, item.tipo_pessoa, item.criado, item.modificado, item.status, item.id, item.informacoes_adicionais]);
                    },
                    txErrorHandler,
                    function (tx) {
                    }
                );
            });
        }

        function sync(syncURL) {


            getLastSync(function (lastSync) {
                getChanges(syncURL, lastSync, function (changes) {
                        if (changes.length > 0) {
                            applyChanges(changes);
                        } else {
                            console.log('Nothing to synchronize');
                        }

                    }
                );
            });

        }

2 ответа

Я вижу две проблемы здесь:

  1. executeSql принимает 3 параметра: sql, params, callback, И то и другое params а также callback необязательны, но если вы хотите указать callback Вы должны указать params тоже.
  2. Не объединяйте значения, предоставленные пользователем. Вы можете в конечном итоге с sql-Incetion. Вместо этого используйте параметры.

    function createTable() {
        db.transaction(
            function (tx) {
    
                tx.executeSql('CREATE TABLE IF NOT EXISTS COUNTRY (id, countryName, countryCode)');
                tx.executeSql('CREATE TABLE IF NOT EXISTS LOCATION (id, locationName)');
                tx.executeSql("CREATE TABLE IF NOT EXISTS clientes (" +
                "clientes_id Integer PRIMARY KEY AUTOINCREMENT, " +
                "_criado Text, " +
                "_modificado Text, " +
                "_status Text, " +
                "id_rm Integer, " +
                "credencial_id Integer, " +
                "informacao_adicional, " +
                "nome, " +
                "tipo, " +
                "CONSTRAINT unique_clientes_id UNIQUE ('clientes_id'))");
                tx.executeSql('CREATE INDEX IF NOT EXISTS "clientes.index_clientes_id" ON "clientes"("clientes_id");');
    
    
    
            },
            txErrorHandler,
            function () {
                log('clientes table created successfully');
            }
        );
    }
    function getLastSync() {
        db.transaction(
            function (tx) {
                var sql = "SELECT MAX(_modificado) as lastS FROM clientes";
    
    
                tx.executeSql(sql, [],
                    function (tx, results) {
    
    
                        var lastSync = results.rows.item(0).lastS;
                        console.log(lastSync);
    
                    }
                );
    
            },
            txErrorHandler,
            function () {
                log('error');
            }
        );
    }
    
    function getChanges(syncURL, modifiedSince) {
    
    
        ServiceClientes.getAll(syncURL, modifiedSince).success(function (data) {
            log("The server returned " + data.length + " changes that occurred after " + modifiedSince);
        }).error(function (error) {
            console.log(error);
        });
    
    
    }
    
    function applyChanges() {
    
        angular.forEach(data.dados, function (item) {
            db.transaction(
                function (tx) {
                    log(item.nome + " : " + item.tipo_pessoa);
    
                    tx.executeSql('INSERT OR REPLACE INTO clientes (nome, tipo, ' +
                    '_criado,' +
                    '_modificado , ' +
                    '_status, ' +
                    'id_rm, ' +
                    'informacao_adicional ) VALUES (?,?,?,?,?,?,?)',[item.nome, item.tipo_pessoa, item.criado, item.modificado, item.status, item.id,item.informacoes_adicionais]);
                },
                txErrorHandler,
                function (tx) {
                }
            );
        });
    }
    
    function sync(syncURL) {
    
    
        getLastSync(function (lastSync) {
            getChanges(syncURL, lastSync, function (changes) {
                    if (changes.length > 0) {
                        applyChanges(changes);
                    } else {
                        console.log('Nothing to synchronize');
                    }
    
                }
            );
        });
    
    }
    

Вы должны использовать второй аргумент executeSql передавать ваши данные в параметризованный SQL-запрос, а не объединять их. Конкатенация - это плохая практика, и вы можете использовать кавычку или вопросительный знак в одном из полей, что может привести к ошибке, которую вы описываете.

Так что используйте что-то вроде:

tx.executeSql('INSERT OR REPLACE INTO clientes (nome, tipo, ' +
              '_criado,' +
              '_modificado , ' +
              '_status, ' +
              'id_rm, ' +
              'informacao_adicional ) VALUES (?,?,?,?,?,?,?)',
       [item.nome, item.tipo_pessoa, item.criado, item.modificado, item.status, item.id, item.informacoes_adicionais]);
Другие вопросы по тегам