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

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

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

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

Node.js

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

Express

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

290閲覧

node.jsを用いてmysqlにデータ追加ができない

benigmaet

総合スコア19

MySQL

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

Node.js

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

Express

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2018/12/19 09:15

dockerを用いてnode.jsとexpressのコンテナとmysqlのコンテナをつなげようとしています。また、html上の入力フォームに書いた文字や数値をmysqlに登録させたいです。
参考サイト様の「Node.jsとデータベースを接続しよう」がうまくできません。
入力フォームに文字や数値を入れるとエラー画面になってしまいます。

以下のソースコードはindex.ejs

<!Doctype html> <html> <head> <title><%= title %></title> <link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> <h1><%= title %></h1> <p>Welcome to <%= title %></p><p>Hello, <%= name %></p> <div class="wrapper"> <form action="/" method="post" class="board-form"> name: <Innput type="text"name="name" class="input" required><br> <br> address:<Input type="text" name="address" class="input" required><br> <br> lat: <input type="text" name="lat" class="input" required><br> <br> lng: <input type="text" name="lng" class="input" required><br> <br> type: <input type="text" name="type" class="input" required><br> <br> <button type="submit" class="submit" >create</buton> </form> </div> </body> </html>

以下のソースコードはindex.js

var express = require('express'); var router = express.Router(); var connection = require('../mysqlConnection'); // ???? /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express',name:'n-name' }); }); router.post('/', function(req, res, next) { var title = req.body.title; var query = 'INSERT INTO markers (name, address,lat,lng,type) VALUES ("' +name + '", ' + '"' + address + '",'+'"'+lat+'",'+'"'+lng+'",'+'"'+type+'")'; connection.query(query, function(err, rows) { res.redirect('/'); }); }); module.exports = router;

DBname:MAP
tablename:markers
+----+----------+-------------+------------+------------+----------+
| id | name | address | lat | lng | type |
+----+----------+-------------+------------+------------+----------+
| 1 | niigata | aaaa | 13.222000 | 30.990000 | k |
| 2 | testname | testaddress | 40.000000 | 130.000000 | testtype |
| 3 | testname | testaddress | 50.000000 | 150.000000 | testtype |
| 4 | testname | testaddress | 50.000000 | 150.000000 | testtype |
| 5 | sas | 23 | 123.333000 | 24.660000 | 1 |
+----+----------+-------------+------------+------------+----------+

エラーは以下のように出て、投稿がうまくできません。
name is not defined
ReferenceError: name is not defined
at /home/mysql-test/node-test/routes/index.js:12:80
at Layer.handle [as handle_request] (/home/mysql-test/node-test/node_modules/express/lib/router/layer.js:95:5)
at next (/home/mysql-test/node-test/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/mysql-test/node-test/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/mysql-test/node-test/node_modules/express/lib/router/layer.js:95:5)
at /home/mysql-test/node-test/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/mysql-test/node-test/node_modules/express/lib/router/index.js:335:12)
at next (/home/mysql-test/node-test/node_modules/express/lib/router/index.js:275:10)
at Function.handle (/home/mysql-test/node-test/node_modules/express/lib/router/index.js:174:3)
at router (/home/mysql-test/node-test/node_modules/express/lib/router/index.js:47:12)

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

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

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

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

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

guest

回答2

0

var query = 'INSERT INTO markers (name, address,lat,lng,type) VALUES ("' +name + '", ' + '"' + address + '",'+'"'+lat+'",'+'"'+lng+'",'+'"'+type+'")';

問題はこの行です。
name変数どころかaddresslatlngtypeと定義忘れ変数だらけですね。
お前はランドセル忘れて登校する小学生か!状態なんでPOSTデータから各種値を抽出するようにしてください。


そしてこの参考にしている記事はセキュリティホールのリスク孕んでいるので先受け。
POSTやGETの値をそのままSQL文章に組み込むのはSQLインジェクションというセキュリティホールに繋がります。

特に、MySQLはSQL文のどこでもカッコで括るだけでわりと自由にサブクエリを叩けるので、
このサーバーなら2秒で悪意のユーザーが好き勝手なテーブル作ったり消したり、ユーザー情報全消しして遊べるでしょうね。
金取ってるようなサービスでやらかすと、会社が物理的に吹っ飛ぶ事もあるので注意してくださいね。

基本的にはサニタイズしろって話なんですが、
こういうSQL文を発行するライブラリの多くにはプレースホルダという機能があり、
安全なSQL文を簡単に生成することが可能です。

mysql - npm
ちょっとライブラリを配布しているページ内でCtrl+fのページ内検索機能を利用して、
「placeholder」というワードや「values」などといったキーワードでサンプルコードを探してみて下さい。
もっと良い方法で書ける方法が簡単に分かるはずです。

投稿2018/12/19 09:31

miyabi-sun

総合スコア21158

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

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

benigmaet

2018/12/19 09:42

解決方法だけでなく、改善方法まで丁寧に教えてくださりありがとうございます
guest

0

ベストアンサー

エラーは以下のように出て、投稿がうまくできません。

name is not defined
ReferenceError: name is not defined

エラーのまんまですが、nameという変数が定義されていません。
フォームから取得して変数に入れるのを忘れているだけかと思います。

投稿2018/12/19 09:18

dice142

総合スコア5158

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

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

benigmaet

2018/12/19 09:34

あっ、できました!!ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問