質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

0回答

1092閲覧

SQL.jsを使用してDB内の項目をひとつずつ取得して表にしたい

tenmusu

総合スコア1

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/11/06 01:02

前提・実現したいこと

html、SQL.js、SQLiteを使用して、社内のフォルダにDBの内容が見られるhtmlを置いておけば、アクセスした人がサーバーを毎度つながずにみられる方法を試しています。

前回の質問でSQL.jsで実装ができる事を確認できたので、ここから使いやすいようにしたいと考え、

1)DBの内容を一つずつ取り出して表にしたい
2)閲覧するDBのテーブルは決まっているので、フォルダを選択する手間を無くしたい

と考えています。

発生している問題・エラーメッセージ

1)についてとりあえずログで一つずつ取り出せるようにしようと、前回の質問でいただいたコードに下記のコードを書き加えたコードを実装したところ、undefinedと表示される状態でした。

html

1<div> 2 <input id="file-field" type="file" accept=".sqlite3"> 3</div> 4 5<div> 6 <input id="query-field" placeholder="SELECT * FROM users;" disabled> 7 8 <button id="execute-button" disabled>EXECUTE QUERY</button> 9</div> 10 11<div> 12 <pre id="result-text"></pre> 13</div> 14 15<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.6.1/sql-wasm.min.js"></script> 16<script> 17initSqlJs({ 18 locateFile: (file) => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.6.1/sql-wasm.wasm`, 19}).then((SQL) => { 20 let db = null; 21 22 const fileField = document.querySelector("#file-field"); 23 const queryField = document.querySelector("#query-field"); 24 const executeButton = document.querySelector("#execute-button"); 25 const resultText = document.querySelector("#result-text"); 26 27 fileField.addEventListener("change", (event) => { 28 const file = fileField.files.item(0); 29 30 if (!file) { 31 return; 32 } 33 34 const fileReader = new FileReader(); 35 36 fileReader.addEventListener("load", (event) => { 37 db = new SQL.Database(new Uint8Array(fileReader.result)); 38 39 fileField.disabled = true; 40 41 queryField.disabled = false; 42 43 executeButton.disabled = false; 44 }); 45 46 fileReader.readAsArrayBuffer(file); 47 }); 48 49 executeButton.addEventListener("click", (event) => { 50 const rows = db.exec(queryField.value); 51 52//ここから新しく付け加えたコード 53 for (var i in rows) { 54 console.log(rows[i].id); 55 } 56//ここまで新しく付け加えたコード 57 58 resultText.innerHTML = JSON.stringify(rows, null, " "); 59 }); 60}); 61</script>

2)を試したところ
fileReader.readAsArrayBuffer(file);の行部分で下記のエラーが出ました。
調べてみたところinputから取得されたものを使用すること前提のものなので実装は難しいのでしょうか?

html

1 2<div> 3 <pre id="result-text"></pre> 4</div> 5 6<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.6.1/sql-wasm.min.js"></script> 7<script> 8initSqlJs({ 9 locateFile: (file) => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.6.1/sql-wasm.wasm`, 10}).then((SQL) => { 11 let db = null; 12 13 const queryField = document.querySelector("#query-field"); 14 const executeButton = document.querySelector("#execute-button"); 15 const resultText = document.querySelector("#result-text"); 16 17 const file = "users.sqlite3"; 18 const fileReader = new FileReader(); 19 20 fileReader.addEventListener("load", (event) => { 21 db = new SQL.Database(new Uint8Array(fileReader.result)); 22 23 }); 24 25 fileReader.readAsArrayBuffer(file); 26 27 28 executeButton.addEventListener("click", (event) => { 29 const rows = db.exec("SELECT * FROM users;"); 30 31 resultText.innerHTML = JSON.stringify(rows, null, " "); 32 }); 33}); 34</script> 35コード

↓エラー

Uncaught (in promise) TypeError: Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'.

該当のソースコード

Plaintext

1. 2├─ index.html 3└─ users.sqlite3 4

SQLは前回の質問と同様のものになっています。
どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ku__ra__ge

2021/11/06 01:32

「2)閲覧するDBのテーブルは決まっているので、フォルダを選択する手間を無くしたい 」はセキュリティ上の問題で許可されません。 FileReader はユーザーが明示的に選択したファイルのコンテンツにのみアクセスできます。 ユーザー指定していないファイルへアクセスできてしまうと、例えばhtmlを開くだけでハードディスク内のファイル内容を読み取って悪意あるサイトに送信するといった動作が行えてしまうためです。
tenmusu

2021/11/06 01:40

ご返答ありがとうございます。 そういう理由でエラーが出ていたんですね。 何かデータ型の変換をすればいけるんじゃないかと思っていたのですが、 FileReader の根本ついて知ることができて助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問