2012-04-18 2 views
1

Я пытаюсь вставить данные в SQLite с помощью Phonegap.Android: Phonegap SQLite issue

Сво работает нормально, когда жёстко, как показано ниже

tx.executeSql('DROP TABLE IF EXISTS DEMO'); 
tx.executeSql('DROP TABLE IF EXISTS DEMO'); 
tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)'); 
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")'); 
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")'); 

, но когда я пытаюсь вставить динамическое значение из формы, как показано ниже

var third = $('#data').val(); 
alert(third); 
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (3,'+ third +')'); 

я получаю исключение в LogCat ниже

04-18 12:20:51.011: I/SqliteDatabaseCpp(7352): sqlite returned: error code = 1, msg = no such column: test, db=/data/data/com.eyepax.phonegap/databases/webview.db 

Я так потерялся и не мог понять проблему. Может кто-нибудь помочь мне, пожалуйста.

полный JS файл идет ниже

function onDeviceReadyStorage() { 
     var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000); 
     db.transaction(populateDB, errorCB, successCB); 

    } 

function populateDB(tx) { 
    tx.executeSql('DROP TABLE IF EXISTS DEMO'); 
    tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)'); 
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")'); 
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")'); 
    var third = $('#data').val(); 
    alert(third); 
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (3,'+ third +')'); 
} 

function errorCB(err) { 
    alert("Error processing SQL: "+err.code); 
} 

function successCB() { 
    alert("success!"); 
    alert("now query..."); 
    var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000); 
     db.transaction(queryDB, errorCB); 
} 

function queryDB(tx) { 
     tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB); 
     // alert("came to query"); 
    } 

function querySuccess(tx, results) { 
     //alert("Query sucess"); 
     // this will be empty since no rows were inserted. 
     console.log("Insert ID = " + results.rows.item(0).data); 
     // this will be 0 since it is a select statement 
     console.log("Rows Affected = " + results.rowsAffected); 
     // the number of rows returned by the select statement 
     console.log("Insert ID = " + results.rows.length); 
     var htmlString = "<ul>"; 
     for(var i = 0; i<results.rows.length; i++){ 
      console.log("Result from DB = " + results.rows.item(i).data); 
      htmlString = htmlString + "<LI>"+ results.rows.item(i).data +"</LI>" 
     } 
     htmlString = htmlString + "</UL>"; 

     $('#myDBData').html(htmlString); 
    } 

ответ

8

Попробуйте добавить "до и после переменной Как это:.

tx.executeSql('INSERT INTO DEMO (id, data) VALUES (3,"'+ third +'")'); 

Edit:

Пожалуйста, обратитесь к comment below Чтобы избежать уязвимости SQL-инъекции, следуйте answer и используйте «plac» вместо того, чтобы напрямую добавлять значение.

+0

Вы мужчина. он работал как волшебное спасибо :) –

+0

+1 от меня. Большое спасибо, это помогло много! – NSException

+1

Это может привести к уязвимости SQL. Пожалуйста, используйте? placeholder, как описано в http://stackoverflow.com/a/26058813/1283667. (Я поддерживаю широко распространенный плагин cordova-sqlite-storage.) – brodybits

1
tx.executeSql('INSERT INTO DEMO (id, data) VALUES (3,?)',[third]); 
+1

Просьба дать некоторое объяснение для вашего ответа – Huangism

+0

написать запрос в java-скрипт и передать значение переменной во время выполнения, которое будет автоматически принимать значение во время выполнения этого запрос – sejal

+0

Это правильный ответ. (Я поддерживаю широко распространенный плагин cordova-sqlite-storage.) – brodybits