前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー