Количество символов "?" В строке оператора не соответствует количеству аргументов
Я пытаюсь сделать синхронизацию с моим 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 ответа
Я вижу две проблемы здесь:
- executeSql принимает 3 параметра:
sql
,params
,callback
, И то и другоеparams
а такжеcallback
необязательны, но если вы хотите указатьcallback
Вы должны указатьparams
тоже. Не объединяйте значения, предоставленные пользователем. Вы можете в конечном итоге с 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]);