Multiples Inserts with JS (works in the browser but in the app generated by phonegap build not)

Asked

Viewed 75 times

0

Updating by the @Sveen indication solution, in exchange var for const, but it only worked in the browser, in the app it continues replicating only one value:

for (var i in dados.valor) {
const query = "INSERT INTO teste ...";    
localDB.transaction(function(transaction){
    transaction.executeSql(query);
});
}

This is the snippet with the JSON data to be imported:

var dados = { "valor": [ 
        {'cod': 72214600, 'rep_img': '', 'descricao': 'Chave phillips 1/4\" x 6\" VONDER', 'aplic': 'Indicada para fixar e soltar parafusos com fenda cruzada/phillips', 'destaque': 'Produzida em aço cromo vanádio\, proporcionando maior resistência e durabilidade. Possui acabamento niquelado que confere maior resistência contra oxidação/corrosão. Conta com ponta magnetizada que facilita tanto a colocação quanto a retirada de parafusos em locais de difícil acesso\, além de cabo anatômico em polipropileno que garante maior conforto para o operador.', 'unid': 'PC', 'categoria': 'manuais', 'emb_cont': '1 Chave phillips', 'emb_tp': 'Sem Embalagem', 'emb_mst': 144.00, 'emb_sub': 6.00, 'emb_unit': 1.00, 'caract': 'Medida/Número da ponta da chave da chave Phillips: Nº2 - 1/4\" @ Comprimento da haste da chave: 6\" - 152 mm @ Material da haste da chave: Aço cromo vanádio @ Acabamento da haste da chave: Niquelado @ Material do cabo da chave: Polipropileno @ Cor do cabo da chave: Amarelo'},

        {'cod': 2372214600, 'rep_img': '', 'descricao': 'Chave phillips 1/4\" x 6\" VONDER', 'aplic': 'Indicada para fixar e soltar parafusos com fenda cruzada/phillips', 'destaque': 'Produzida em aço cromo vanádio\, proporcionando maior resistência e durabilidade. Possui acabamento niquelado que confere maior resistência contra oxidação/corrosão. Conta com ponta magnetizada que facilita tanto a colocação quanto a retirada de parafusos em locais de difícil acesso\, além de cabo anatômico em polipropileno que garante maior conforto para o operador.', 'unid': 'PC', 'categoria': 'manuais', 'emb_cont': '1 Chave phillips', 'emb_tp': 'Sem Embalagem', 'emb_mst': 144.00, 'emb_sub': 6.00, 'emb_unit': 1.00, 'caract': 'Medida/Número da ponta da chave da chave Phillips: Nº2 - 1/4\" @ Comprimento da haste da chave: 6\" - 152 mm @ Material da haste da chave: Aço cromo vanádio @ Acabamento da haste da chave: Niquelado @ Material do cabo da chave: Polipropileno @ Cor do cabo da chave: Amarelo'}
]};

Complete code

function insereDados(){

var dados = { "valor": [ 
{"cod":"72214600","rep_img":"","descricao":"Chave phillips 1\/4\" x 6\" VONDER","aplic":"Indicada para fixar e soltar parafusos com fenda cruzada\/phillips","destaque":"Produzida em a\u00e7o cromo van\u00e1dio, proporcionando maior resist\u00eancia e durabilidade. Possui acabamento niquelado que confere maior resist\u00eancia contra oxida\u00e7\u00e3o\/corros\u00e3o. Conta com ponta magnetizada que facilita tanto a coloca\u00e7\u00e3o quanto a retirada de parafusos em locais de dif\u00edcil acesso, al\u00e9m de cabo anat\u00f4mico em polipropileno que garante maior conforto para o operador.","unid":"PC","categoria":"manuais","emb_cont":"1 Chave phillips","emb_tp":"Sem Embalagem","emb_mst":"144.00","emb_sub":"6.00","emb_unit":"1.00","caract":"Medida\/N\u00famero da ponta da chave da chave Phillips: N\u00ba2 - 1\/4\" @ Comprimento da haste da chave: 6\" - 152 mm @ Material da haste da chave: A\u00e7o cromo van\u00e1dio @ Acabamento da haste da chave: Niquelado @ Material do cabo da chave: Polipropileno @ Cor do cabo da chave: Amarelo"},
{"cod":"3072700146","rep_img":"","descricao":"Chave phillips 1\/4\" x 6\" VONDER PLUS","aplic":"Indicada para fixar e soltar parafusos com fenda cruzada\/phillips","destaque":"Produzida em a\u00e7o cromo van\u00e1dio, proporcionando maior resist\u00eancia e durabilidade. Possui acabamento niquelado que confere maior resist\u00eancia contra oxida\u00e7\u00e3o\/corros\u00e3o. Conta com ponta magnetizada que facilita tanto a coloca\u00e7\u00e3o quanto a retirada de parafusos em locais de dif\u00edcil acesso, al\u00e9m de cabo anat\u00f4mico em polipropileno revestido com borracha termopl\u00e1stica que garante maior conforto para o operador.","unid":"PC","categoria":"manuais","emb_cont":"1 Chave phillips","emb_tp":"Sem Embalagem","emb_mst":"144.00","emb_sub":"6.00","emb_unit":"1.00","caract":"Medida\/N\u00famero da ponta da chave da chave Phillips: N\u00ba2 - 1\/4\" @ Comprimento da haste da chave: 6\" - 152 mm @ Material da haste da chave: A\u00e7o cromo van\u00e1dio @ Acabamento da haste da chave: Niquelado @ Material do cabo da chave: Polipropileno revestido com borracha termopl\u00e1stica @ Cor do cabo da chave: Preto e amarelo"},

]};



dados.valor.forEach(function(valor) {

var query = "INSERT INTO teste (cod, rep_img, descricao, aplic, destaque, unid, categoria, emb_cont, emb_tp, emb_mst, emb_sub, emb_unit, caract) VALUES ('" + valor[i].cod + "', '" + valor[i].rep_img + "', '" + valor[i].descricao + "', '" + valor[i].aplic + "', '" + valor[i].destaque + "', '" + valor[i].unid + "', '" + valor[i].categoria + "', '" + valor[i].emb_cont + "', '" + valor[i].emb_tp + "', '" + valor[i].emb_mst + "', '" + valor[i].emb_sub + "', '" + valor[i].emb_unit + "', '" + valor[i].caract + "');";


    localDB.transaction(function(transaction){
    transaction.executeSql(query);
});
});

}
  • You can use a repeat loop (e.g.: for, while, forEach etc.).

  • Values come from where ? Use a for as already suggested

  • I think of putting the values directly in the code as in the published excerpt, but I’ve already looked for examples and could not, Isac or Valdeir has some simple excerpt just to base me? The values I could pick up on JSON

  • Changing a bit of subject, your way of connecting to the database suffers serious risks of Injection SQL attack, where any user has full control over their database. Even it might delete your database or swell your hard drive with data in Mysql. https://www.tecmundo.com.br/tecmundo-explica/113195-sql-injection-saiba-tudo-ataque-simples-devastador.htm

1 answer

0


Explanation

Whenever you run a loop, the variable value query is changed (even before it is executed), so when the first transaction is executed it will take the value that has already been changed several times.

Solution 1

Try using the modifier const instead of var for variable query, to prevent the oncomplete of the transaction always take the last value of the loop. The rest can remain exactly the same.

for (var i in dados.valor) {
    const query = "INSERT INTO teste ...";    
    localDB.transaction(function(transaction){
        transaction.executeSql(query);
    });
}

Solution 2

If it doesn’t work, depending on the version of Javsacript, another solution is to use the foreach, so you don’t run the risk of reusing the same variable, because each data will be in a different instance

dados.valor.forEach(function(valor) {
   var query = "INSERT INTO teste (...) VALUES ('" + valor.cod + "', '" + valor.rep_img + "', '" + valor.descricao + "', '" + valor.aplic + "', '" + valor.destaque + "', '" + valor.unid + "', '" + valor.categoria + "', '" + valor.emb_cont + "', '" + valor.emb_tp + "', '" + valor.emb_mst + "', '" + valor.emb_sub + "', '" + valor.emb_unit + "', '" + valor.caract + "');";
    localDB.transaction(function(transaction){
        transaction.executeSql(query);
    });
});

remembering that valor foreach is an array containing the data to be entered, the same as dados.valor[i] in the previous script.

  • Sorry, actually it worked in the browser, but on android he keeps taking only a value and replicating, but this time is the first.

  • Okay I’ll put another solution

  • This is because your browser and mobile device work with different versions

  • OK, I’ll test and put the result in sequence... thanks again

  • Thanks for the @Sveen force but I could not understand where will const query = "INSERT...

  • I changed, is in the same place

  • I changed your answer and included my code, it is not making the insertions, the data of the Array is as value[i]?

  • @Skriza I rejected your issue in the reply as it may alter the author’s intention of the answer. I suggest that instead of changing the answer you edit your own question to include the code you want to show.

  • Not @Skriza, each value looks like: {'Cod': 72214600, 'rep_img': ', 'Description': ... Yellow'}, for example

  • I don’t know if it was that, I posted the complete code in my question, it’s not performing the insertion... neither in the browser nor in the app

  • Includes example of using foreach in query.

  • @Sveen, man... it worked, send me your address and I’ll send you a Cx of beer... thank you very much for your help, you saved my life!!

  • It was nothing, any doubt just call

Show 8 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.