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で質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) excel テーブル 4 2023/03/18 16:11
- Access(アクセス) Accessで予定表を作成しようとしてます。 テーブル フィールド名 連番 オートナンバー型 年月日 2 2023/07/23 11:40
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Excel(エクセル) Excelヘルプの原文を表示する最速の方法(手順)には? 1 2023/08/11 11:30
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Excel(エクセル) エクセルの散布図で新たに入力した値のデータラベルが空欄になる現象 1 2022/04/26 09:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
passwordが入れられません・・・・
-
Excelで入力したデータを自動的...
-
日付のテキストボックスに(例...
-
エクセル 自動入力
-
アクセスで数値型のフィールド...
-
アクセスの顧客管理情報・リレ...
-
Access2007、フォームのテキス...
-
データベースのINT型項目にNULL...
-
access日付チェックの方法
-
Access(office)のマクロの「値...
-
EXCELのユーザーフォームで入力...
-
Access2000 顧客マスターを作っ...
-
Access、データ入力後、「ECS」...
-
アクセス コンボボックスのリ...
-
Accessのパラメータクエリに入...
-
Access レポート印刷するときに...
-
YahooのIDがロックされてしまい...
-
エクセルVBA オプションボタ...
-
皆さん使っているブラウザを教...
-
「フォームを作成できませんで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
passwordが入れられません・・・・
-
データベースのINT型項目にNULL...
-
アクセスで数値型のフィールド...
-
フォームで入力しても反映されない
-
Access(office)のマクロの「値...
-
Excelで入力したデータを自動的...
-
日付のテキストボックスに(例...
-
Access2007 textboxに入力でき...
-
このオブジェクトに値を代入す...
-
アクセスのテキストボックスの...
-
ファイルメーカー 一ヵ月後の...
-
ユーザーフォームで数字にカン...
-
sqlldrの使用方法について
-
ACCESS 時間の入力方法
-
入力規則違反-任意のエラーメ...
-
Access2007、フォームのテキス...
-
Accessで主キーの最終番号を取...
-
ファイルメーカで経過月数を出...
-
Accessで所要時間の足し算
-
Accessのパラメータクエリに入...
おすすめ情報