Webアプリを開発しておりまして、SQLに詳しい方にDB回りをお願いしいますが、躓いてしまいました。
W3Cに則り作成のため、WebSQLを使って名簿のようなテーブルから、該当するデーターをループを組んで読みだそうとしていますが、最後のデーターしか返ってきません。
目的は、該当する名前を表示して、それぞれに付加(追加する:空のテーブルは用意しておいて)データーを入力して、DBへ返そうと思っています。
しかしSQLの超初心者のため、またWebSQLやSQLiteも始めたばかりで、簡単にループを掛けてインクリメントで読み出し、表示して が 巧く行きません。
なにやら「同期」とか「非同期」なる言葉があるようですが、そもそもこれもよくわかりません。
上記の目的を達成させることが可能なのか、不可能なのかを教えていただければ助かります。参考文献などを示唆していただければなお良いと思います。
まず、以下のようなテーブルを用意しています。
名前 性別 身長 体重
山田 男
高橋 男
田中 女
吉田 男
佐藤 女
などなど
以上から 女だけを順に取ってきて :入力ボックスとは input type="text"の様なものです
田中 女 入力ボックス 入力ボックス
佐藤 女 〃 〃
以下該当者全て同じように表示
入力したデーターを 該当する空欄(あるいは上書き)でデーターを戻す
これを ループ処理でやりたいと思っています。
よろしくお願いします
No.2ベストアンサー
- 回答日時:
websql での関数が callback であるところ、結構混乱しますね。
プレースホルダーに入れるデータを、わざわざ変数に入れ替えてるのが仇になってるんじゃないかな。callback関数は、非同期 つまり元の呼び出し時のデータではなく、その変数が最終的に持ってる値をみると言うこと。local 変数で渡すのは、メモリリークの原因にもなって危ないみたいです。
補足のスクリプトにコメント追加してみました。
for (var i=0:i<dt.length;i++) {
// var cd=dt[i][0];// 不要
// var nm=dt[i][1];// 不要
db.transaction(
function(tx) {
tx.executeSql(
/* "insert into 対象 (番号,名称) values(?,?)",[cd,nm], // ← ここ cd, nm は、変数の参照が渡されているので、実際の実行時には、最終値 つまり dt[n-1][] の値になってしまう
↓ 配列 dt[i] で入力すれば、とりあえずこの関数全体が終了するまでは、個別に違うメモリ位置を見てくれるはず。
*/
"insert into 対象 (番号,名称) values(?,?)",dt[i],
function(tx,rs) {},
fiunction(tx,er) {alert(er.message);}
);
},
function(er) {alert(er.message);},
function() {}
);
}
No.3
- 回答日時:
投稿してからもう一回見直していたら、 dt[i] の iもlocal変数だった、 i がn-1 まで回りきってから、callbackが呼ばれるので、callback 関数にもう一つかぶせないといけない
db.transaction(
(function(x1,x2){ /* データの受け渡し用wrapper関数と引数 */
return function(tx) {
tx.executeSql( "insert into 対象 (番号,名称) values(?,?)",[x1,x2],
function(tx,rs) {},
function(tx,er) {alert(er.message);}
);/* tx.executeSql の閉じ */
};/* return するcallback 関数の閉じ */
})(cd,nm) ,/* wrapper関数に渡すデータの指定。これは、 db.transaction が呼ばれた時点の変数値が入る */
function(er) {alert(er.message)},
function() {}
);/* transaction メソッドの閉じ */
※ ()や{} の多重入れ子で括りの対応が解らなくなるので、全角空白でインデントしてます。コピー時は、半角に変換してください。
実行チェックしてないので、まだ間違いがあるかも?
No.1
- 回答日時:
実行してるSQL文がないとなんとも言えないと思いますが。
もう一つ補足の欄がないので、現状をここに記載しますので、よろしくお願いします。
以下 dbはオープン済みのデータベースオブジェクトとする。
dtは要素が[番号,名称]の2要素からなる配列の可変長配列とする。
(selectbox等で設定済みとする)
テーブル「対象」は
create table 対象(番号 varchar(4),名称 varchar(20))
で生成されている(行データは存在しない)ものとする。
問題は配列dtの内容をテーブル「対象」に追加することである。
for (var i=0:i<dt.length;i++) {
var cd=dt[i][0];
var nm=dt[i][1];
db.transaction(
function(tx) {
tx.executeSql(
"insert into 対象 (番号,名称) values(?,?)",[cd,nm],
function(tx,rs) {],
fiunction(tx,er) [alert(er.message);}
);
},
function(er) [alert(er.message),
function() {}
);
}
このプログラムを実行すると(n=dt.lengthとする)
・n件の行が追加される。
・しかしn件の行はすべて番号=dt[n-1][0]、名称=dt[n-1][1]となっている。
これはtransactionやexecuteSqlが非同期に実行されるためinsertの処理前に
ループでiが増加され(従ってcdやnmも変化する)てinsertの実行時には
i=n-1(従ってcd=dt[n-1]][0]、nm=dt[n-1][1])となっているためと思われる。
これを回避する方法が知りたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データベースのINT型項目にNULL...
-
フォームで入力しても反映されない
-
passwordが入れられません・・・・
-
アクセスで数値型のフィールド...
-
Excelで入力したデータを自動的...
-
Accessで西暦の年だけ表示したい
-
OUTLOOK予定表の表示項目追加は...
-
ひらがな、カタカナ、漢字をま...
-
このオブジェクトに値を代入す...
-
Access2007 textboxに入力でき...
-
ACCESS2000のフォームからの入...
-
日付のテキストボックスに(例...
-
ユーザーフォームで数字にカン...
-
ACCESS フォーム上 テ...
-
sqlldrの使用方法について
-
Access2000 Len関数 フォーム...
-
アクセスのテキストボックスの...
-
ACCESS2003で長整数型のフィー...
-
Accessで小数の入力について
-
access日付チェックの方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データベースのINT型項目にNULL...
-
passwordが入れられません・・・・
-
アクセスで数値型のフィールド...
-
フォームで入力しても反映されない
-
Excelで入力したデータを自動的...
-
アクセスのテキストボックスの...
-
このオブジェクトに値を代入す...
-
Access(office)のマクロの「値...
-
Access2007 textboxに入力でき...
-
MA ACCESSデータベースに詳しい...
-
Accessで小数の入力について
-
日付のテキストボックスに(例...
-
ACCESS 時間の入力方法
-
入力規則違反-任意のエラーメ...
-
ユーザーフォームで数字にカン...
-
Accessで所要時間の足し算
-
アクセス2003 入力規則
-
Microsoft Accessのフォームで...
-
フォームテキスト内文字の縦位...
-
EXCELのユーザーフォームで入力...
おすすめ情報