2

phonegap を使用してアプリケーションを開発しており、データベースを sqlite として使用しています。次のコマンドを使用してテーブルを作成しました。

   var dbb;
   var shortName = 'Vaccine1';
   var version = '2.0';
   var displayName = 'vaccine';
   var maxSize = 100000;
dbb = window.openDatabase(shortName, version, displayName,maxSize);

この関数を使用して値を挿入しました..

function AddDBvalues()
{

 dbb.transaction(function(tx){
//tx.executeSql( 'DROP TABLE IF EXISTS Vaccin',nullHandler,nullHandler); 
tx.executeSql( 'CREATE TABLE IF NOT EXISTS Vaccin(Vday INTEGER NOT NULL,VName TEXT NOT NULL, CCountryid INTEGER NOT NULL , Sex TEXT NOT NULL)', [],nullHandler,errorHandler);},errorHandler,successCallBack);
dbb.transaction(function(transaction) {transaction.executeSql('INSERT INTO Vaccin(Vday,VName,CCountryid,Sex) VALUES (?,?,?,?)',["0","BCG","91","both"], nullHandler,errorHandler);});
dbb.transaction(function(transaction) {transaction.executeSql('INSERT INTO Vaccin(Vday,VName,CCountryid,Sex) VALUES (?,?,?,?)',["0","OPV dose 1 of 5","91","both"], nullHandler,errorHandler);});
dbb.transaction(function(transaction) {transaction.executeSql('INSERT INTO Vaccin(Vday,VName,CCountryid,Sex) VALUES (?,?,?,?)',["1","Hepatites B dose 1 of 2","91","both"], nullHandler,errorHandler);});
dbb.transaction(function(transaction) {transaction.executeSql('INSERT INTO Vaccin(Vday,VName,CCountryid,Sex) VALUES (?,?,?,?)',["42","DPT dose 1 of 3","91","both"], nullHandler,errorHandler);});
dbb.transaction(function(transaction) {transaction.executeSql('INSERT INTO Vaccin(Vday,VName,CCountryid,Sex) VALUES (?,?,?,?)',["42","OPV dose 2 of 5","91","both"], nullHandler,errorHandler);});
dbb.transaction(function(transaction) {transaction.executeSql('INSERT INTO Vaccin(Vday,VName,CCountryid,Sex) VALUES (?,?,?,?)',["70","DPT dose 2 of 3","91","both"], nullHandler,errorHandler);});
}

この関数を使用して、データベースから値を取得しました..

function ShowValue()
{
 var cnn = sessionStorage.getItem('cid');//getting from session 
  var cn=parseInt(cnn);
  alert (cn); //always show correct value
dbb.transaction(
 function (transaction) {
transaction.executeSql("SELECT * from Vaccin WHERE CCountryid='"+cn+"';",[],     dataHandler, errorHandler);});
function dataHandler(transaction, results){
      alert("first method" + results.rows.length);
    for (var i=0; i<results.rows.length; i++) {
      ...... }
}}  

結果セットの長さが毎回増加するという予期しないエラーが発生しますは二重などを意味します....毎回。

誰かが何が間違っているのか知っているなら、私を助けてください。

4

2 に答える 2

2

AddDBValuesは、アプリを実行するたびに呼び出されますか?IF NOT EXISTSは、挿入ステートメントに影響を与えません。

于 2012-11-18T13:18:30.773 に答える
1

データベースは実行間で永続的ですか? もしそうなら、あなたがテーブルを削除しているのではないので、データは倍増しています。あなたAddDBvalues()の機能では、DROP ...コマンドはコメントアウトされています。

//tx.executeSql( 'DROP TABLE IF EXISTS Vaccin',nullHandler,nullHandler); 

無関係ですが、SQL インジェクションの脆弱性もある可能性があります。変数cnは、単純に文字列として SQL に追加するのではなく、バインド変数として渡す必要があります。

transaction.executeSql("SELECT * from Vaccin WHERE CCountryid='"+cn+"';",[],     dataHandler, errorHandler);});
于 2012-11-18T13:34:28.333 に答える