我正在尝试使用WebSQL与我的API同步,但是我收到以下错误:
语句字符串中的'?'与参数计数不匹配。
我正在关注this教程
我不知道发生了什么,我在这里错过了什么?
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');
}
}
);
});
}
答案 0 :(得分:1)
我可以在这里看到两个问题:
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');
}
}
);
});
}
答案 1 :(得分:1)
您应该使用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]);