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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

1199閲覧

MySQLのテーブル内にある値をフラグとして、JavaScriptのIf文で判定させたい

t_tak

総合スコア6

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/05/28 05:48

編集2020/05/28 07:14

前提・実現したいこと

MySQL + Express + JavaScriptの練習として、フォームにある4つのボタンを押すとMySQL側に時刻等が反映されるものを制作しております。
また、氏名(req.body.name)とメールアドレス(req.body.mail)はセレクトボックスで選択したものをいれるようにしています。

4つのボタンはそれぞれ、開始(start_button)・終了(end_button)・途中計測(restart_button)・途中計測終了(finish_button)としており、
開始→途中計測→途中計測終了→終了 or 開始→終了のどちらかで押すことを想定しております。
そのためにMySQLのテーブルに状態を取得するためのstatusというカラムを設定しており、statusの値で押せるかどうかを判断しようと書いています。

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

最初の開始ボタンを押したときは下記MySQLテーブルのように入るのですが、他のボタンを押したときには何も反応せずにスローされてしまいます。

試したこと

おそらく、if(status_checked == 0)と判断している箇所で数値として認識していないのかと思い以下のようにisNaNで判定させてみました。

var checkcolumn = "SELECT ? FROM users_result WHERE name = ?"; if(req.body.start_button){ let nullcheck = await queryAsync(checkcolumn, ['start', req.body.name]); let checked = isNaN(nullcheck); console.log(checked,"NaN判定"); if(checked == false){ var results = await queryAsync(sql, { id: id, name: req.body.name, email: req.body.mail, start: time, status: 1}); console.log(results); }else{ console.log(results); }; } else if(req.body.end_button){ let nullcheck = await queryAsync(checkcolumn, ['end', req.body.name]); let checked = isNaN(nullcheck); console.log(checked,"NaN判定"); if(checked == false){ let updatesql = "UPDATE users_result SET end = ?, status = ? WHERE name = ?"; var results = await queryAsync(updatesql, [time, 2, req.body.name]); console.log(results); }else{ console.log(results); } } else if(req.body.restart_button){ let nullcheck = await queryAsync(checkcolumn, ['restart', req.body.name]); let checked = isNaN(nullcheck); console.log(checked,"NaN判定"); if(checked == true){ let updatesql = "UPDATE users_result SET restart = ?, status = ? WHERE name = ?"; var results = await queryAsync(updatesql, [time, 3, req.body.name]); }else{ console.log(results); }; }else if(req.body.finish_button){ let nullcheck = await queryAsync(checkcolumn, ['finish', req.body.name]); let checked = isNaN(nullcheck); console.log(checked,"NaN判定"); if(checked == null){ let updatesql = "UPDATE users_result SET finish = ?, status = ? WHERE name = ?"; var results = await queryAsync(updatesql, [time, 1 , req.body.name]); }else{ console.log(results); }; };

とした結果、開始ボタンを押したときだけはfalse判定。あとのボタンを押したときはtrue判定になることがわかりました。
そのため、開始ボタンを押した時点ではテーブル内には何もないためにNULLとして0でとってこれるけれど、NULLが入っているカラムを指定したときはNaNとして判定できないのだと考えました。

ここまではきたのですが、MySQL内のstatusの値をフラグとして使用して判定することは難しいのでしょうか?
なにか、これを実現する方法がありましたら教えて頂けますと嬉しいです。

該当のソースコード

javascript

1 2app.get("/", async (req, res) => { 3 4const usr_sql = "select * from users"; 5const sql = "select * from users_result"; 6let results = await queryAsync(sql); 7let userdata = await queryAsync(usr_sql); 8console.log(userdata); 9console.log(results); 10res.render("index.ejs",{ content: results,userdata: userdata }); 11}); 12 13app.post("/", async (req, res) => { 14 15 var dt = new Date; 16 var now = dt.toFormat("HH24:MI:SS"); 17 console.log("request", req.body.name); 18 const sql = "INSERT INTO users_result SET ?"; 19 const resid = await queryAsync("select max(id) from users_result"); 20 const preid = resid[0]["max(id)"]; 21 const id = preid + 1; 22 23const checkname = "SELECT status FROM users_result WHERE name = ?"; 24var status_checked = await queryAsync(checkname, req.body.name); 25console.log(status_checked,"statusの状態"); 26 27 28if(req.body.start_button){ 29 if(status_checked == 0){ 30 var results = await queryAsync(sql, { id: id, name: req.body.name, email: req.body.mail, start: time, status: 1}); 31 console.log(results); 32 }else{ 33 console.log(results); 34 }; 35 } 36 else if(req.body.end_button){ 37 if(status_checked == 1){ 38 let updatesql = "UPDATE users_result SET end = ?, status = ? WHERE name = ?"; 39 var results = await queryAsync(updatesql, [time, 2, req.body.name]); 40 console.log(results); 41 }else{ 42 console.log(results); 43 } 44 } 45 else if(req.body.restart_button){ 46 if(status_checked == 1){ 47 let updatesql = "UPDATE users_result SET restart = ?, status = ? WHERE name = ?"; 48 var results = await queryAsync(updatesql, [time, 3, req.body.name]); 49 }else{ 50 console.log(results); 51 }; 52 }else if(req.body.finish_button){ 53 if(status_checked == 3){ 54 let updatesql = "UPDATE users_result SET finish = ?, status = ? WHERE name = ?"; 55 var results = await queryAsync(updatesql, [time, 1 , req.body.name]); 56 }else{ 57 console.log(results); 58 }; 59 60 }; 61

MySQL

1テーブル名:users_result 2+----+-----------+--------------------+----------+------+-----------+---------+--------+ 3| id | name | email | start | end | restart | finish | status | 4+----+-----------+--------------------+----------+------+-----------+---------+--------+ 5| 1 | user1 | user1@test.com | 12:00:00 | NULL | NULL | NULL | 1 | 6+----+-----------+--------------------+----------+------+-----------+---------+--------+ 7テーブル名:users 8+----+-----------+--------------------+ 9| id | name | email | 10+----+-----------+--------------------+ 11| 1 | user1 | user1@test.com | 12+----+-----------+--------------------+ 13| 2 | user2 | user2@test.com | 14+----+-----------+--------------------+ 15| 3 | user3 | user3@test.com | 16+----+-----------+--------------------+

###追加

HTML

1<body> 2 <header> 3 <h1>練習</h1> 4 </header> 5 <form action="/" method="POST"> 6 <span>名前</span> 7 <select id="name" name="name"> 8 <% for(var j in userdata) {%> 9 <% var usr_obj = userdata[j]; %> 10 <option value= <%= usr_obj.name %>> 11 <%= usr_obj.name %> 12 </option> 13 <% } %> 14 </select> 15 <% for(var k in userdata) {%> 16 <% var mail_obj = userdata[k]; %> 17 <input type="hidden" id=<%= mail_obj.name %> value=<%= mail_obj.mail %>> 18 <% } %> 19 <label><span>メールアドレス</span><input id="mail" name="mail"></label> 20 <div class="container"> 21 <button class="btn btn-lg btn-primary" id="start" name="start_button" type="submit" value="current_time">開始</button> 22 <button class="btn btn-lg btn-danger" id="end" name="end_button" type="submit" value="current_time">終了</button> 23 <button class="btn btn-lg btn-success" id="restart" name="restart_button" type="submit" value="current_time">途中計測</button> 24 <button class="btn btn-lg btn-warning" id="finish" name="finish_button" type="submit" value="current_time">途中終了</button> 25 </div> 26 </form> 27 28 <div class="container-fluid"> 29 <div class="row"> 30 <div class="col no-gutters"> 31 <table class="table table-hover table-sm"> 32 <thead class="thead-dark"> 33 <tr> 34 <th scope="col">ID</th> 35 <th scope="col">名前</th> 36 <th scope="col">メールアドレス</th> 37 <th scope="col">開始</th> 38 <th scope="col">終了</th> 39 <th scope="col">途中計測開始</th> 40 <th scope="col">途中計測終了</th> 41 </tr> 42 </thead> 43 <tbody> 44 <% for(var i in content) { %> 45 <tr> 46 <% var obj = content[i]; %> 47 <th><%= obj.id %></th> 48 <th><%= obj.name %></th> 49 <th><%= obj.email %></th> 50 <th><%= obj.start %></th> 51 <th><%= obj.end %></th> 52 <th><%= obj.restart %></th> 53 <th><%= obj.finish %></th> 54 </tr> 55 <% } %> 56 </tbody> 57 </table> 58 </div> 59 </div> 60 </div> 61 </body> 62 63 <script> 64 document.getElementById("name").addEventListener('change',changename); 65 function changename(){ 66 let name = document.getElementById("name"); 67 let mail = document.getElementById("mail"); 68 let hidden_mail = document.getElementById(name.value); 69 70 71 mail.value = hidden_mail.value; 72 } 73 </script> 74

MySQL

1テーブル名:users_result 2+----+-----------+--------------------+----------+------+-----------+---------+--------+ 3| id | name | email | start | end | restart | finish | status | 4+----+-----------+--------------------+----------+------+-----------+---------+--------+ 5| 1 | user1 | user1@test.com | 12:00:00 | NULL | NULL | NULL | 1 | 6+----+-----------+--------------------+----------+------+-----------+---------+--------+

補足情報(FW/ツールのバージョンなど)

MySQL v5.7.30
Node v12.16.3

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

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

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

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

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

rururu3

2020/05/28 06:57

ボタン部分(HTMLソース)部分も記載お願いいたします。
t_tak

2020/05/28 07:16

修正依頼ありがとうございます。 HTMLソースの追加に伴って、getとpost、mysql部分にも追加を加えました。 よろしくお願い致します。
rururu3

2020/05/28 07:34

queryAsyncってちょっとググってみたのですが、ちょっと出てこなかったのですが、 自作関数ですか?
guest

回答1

0

ベストアンサー

js

1 const sql = "INSERT INTO users_result SET ?"; 2 const resid = await queryAsync("select max(id) from users_result"); 3 const preid = resid[0]["max(id)"];

ここらへんのソースから判断して

js

1const checkname = "SELECT status FROM users_result WHERE name = ?"; 2var status_checked = await queryAsync(checkname, req.body.name); 3console.log(status_checked,"statusの状態"); 4 5 6if(req.body.start_button){ 7 if(status_checked == 0){

if(status_checked == 0){は配列と0比較してる気がする。

if(status_checked[0]['status'] == 0){こうだったりするのかな

投稿2020/05/28 07:39

rururu3

総合スコア5545

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

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

t_tak

2020/05/28 07:52

ご指摘の通り試してみたところ、ただしく指定カラム内の数値と比較することができました。 if(status_checked ==0){の部分は、{ status: 1 }と比較する形になってしまっていたようで、if(status_checked[0]['status'] == 0{と中身を指定してあげると数値との比較になりました。 そのように指定してあげられることが抜けており、ずっと悩んでいたので非常にスッキリとしました! 分かりづらい質問であったのに答えてくださりありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問