
クライアントからサーバーにアクセスしてデータベース、MySQLを操作するクライアントプログラムとサーバー側のプログラムをテストで作ってみた。
接続、取り出しのテストが目的なので、微細なチェック機能や表示の体裁は手抜きしているのと、HTMLとCSSのコードは割愛している。
開発環境
テストとはいえ、少なくてもクライアントからサーバーにアクセスが必須なので
サーバーが必要となる。
サーバー
仮想サーバーを簡単に構築できるXAMPPを使用。
XAMPPのインストールの方法はネット上に多く公開されているので
「XAMPP」等で検索すれば、簡単に見つかるはず。
MySQL
XAMPPをインストールすると同時に、MariaDBがインストールされる。
MariaDBは旧MySQLなので、MySQLだと思って間違いない。
Node.js
サーバー側で動作するJavaScript、Node.jsをインストールする。

Node.jsをインストーすると同時にNPMツールもインストールされる。
NPMはモジュールをインストール時等に必要なツール。
開発フォルダ
開発を進めるフォルダを準備する。
C:\xampp\htdocs直下にmydbSQLフォルダを作る。
必要なモジュールやサーバー側プログラムをここに作る。
先に作成したmydbSQLの直下にWebフォルダを作る。
クライアント側プログラムをここに作る。
開発フォルダ初期化
初期化はnpmツールを使用する。

コマンドプロンプト起動。
カレントフォルダをモジュールをインストールするフォルダにする。
「C:\xampp\htdocs\mydbSQL>」
「npm init」を実行。
数回、問い合わせがあるが
全てEnterで続ければOK。
開発フォルダにモジュールインストール
必要モジュールは「express」と「mysql」だ。
早々、インストールしよう。

コマンドプロンプト起動。
初期化した開発フォルダをカレントフォルダにする。
「C:\xampp\htdocs\mydbSQL>」
「npm install express mysql -s」を実行。
時に何もしなくてOK!!。
モジュールexpressとは?
Node.jsで利用できるWebアプリケーションフレームワーク。
Webアプリケーションとは、インターネット上で利用するサービスを動かすシステム。
モジュールmysqlとは?
Node.jsでMySQLのデータベースを操作するモジュール。
Node.jsを使って簡単にmySQLの操作が可能になる。
サーバー側プログラム
サーバー側プログラムを開発するフォルダ直下に「server.js」ファイルを作る。
「C:\xampp\htdocs\mydbSQL\server.js」
定数やモジュール読み込み
プログラムの最初にコーディングする。
const mysql = require("mysql");
const express = require("express");
const bodyparser = require("body-parser");
const app = express();
const CONSTHOST = "localhost";
const CONSTUSER = "root";
const CONSTDATABASE = "sssproduct";
const CONSTURLYES = "/yes";
const CONSTURLNO = "/no";
const CONSTPORT = 3000;
app.use(bodyparser.json());
app.use(express.static("web"));
各モジュールを読み込む。
プログラム内部で使用する定数を定義。
ミドルウェアを生成。
mySQLに接続
// ************************************************
// mySql接続
// ************************************************
function mySQLconnect()
{
var connection = mysql.createConnection(
{
host : CONSTHOST,
user : CONSTUSER,
database : CONSTDATABASE
});
return(connection);
}
呼ばれる関数なので、取得したオブジェクトを返す。
クライアントから受信
app.postでクライアントから受信する。
SQLを実行 テーブルの内容を返す
// ************************************************
// SQLでテーブルの内容を返す
// ************************************************
app.post(CONSTURLYES,(req,res) =>
{
// MySQL接続
const connection = mySQLconnect();
// sql実行
connection.query(req.body.sql, function (err, rows, fields)
{
// エラー処理
if (err)
{ console.log('err --> ' + err); }
// レコードを返す
res.json(rows);
});
// mysql解放
connection.end();
});
クライアントがURL”/yes”でサーバーに送信してきた。
送信してきたSQLはres.body.sqlで取り出せる。
取り出したテーブルの内容をクライアントに送る。
SQLを実行 テーブルの内容を返さない
// ************************************************
// SQLを実行するが内容は返さない
// ************************************************
app.post(CONSTURLNO,(req,res) =>
{
// MySQL接続
const connection = mySQLconnect();
// sql実行
connection.query(req.body.sql, function (err, rows, fields)
{
// エラー処理
if (err)
{ console.log('err --> ' + err); }
// レコードを返す
res.json(rows);
});
// mysql解放
connection.end();
});
基本的にはテーブルの内容を返す処理と同じである。
アクセスを区別するために分けただけ。
ポートを指定
// ************************************************
// ポート3000でサーバを立てる
// ************************************************
app.listen(CONSTPORT, () => console.log("Listening on port " + CONSTPORT));
このプログラムがサーバーのポート300で待ち受ける。
プログラムを実行

コマンドプロンプトを起動。
server.jsが格納されているディレクトリをカレントにする。
node server.jsをタイプして実行。

サーバーでserver.jsが常駐。
終了はCtrl+C。
クライアント側プログラム
クライアント側プログラムを作成するディレクトリに「index.js」ファイルを作成。
C:\xampp\htdocs\mydbSQL\Web\index.js
定数定義
const ExecuteReaderPath = "/yes"; const ExecuteNonQueryPath = "/no";
プログラム内部で使用する定数を定義。
アクセスするURLを定義している。
テーブルの値を取り出す
// ***************************************************
// 表示ボタンクリック
// ***************************************************
function rcddsp()
{
var sql = sqldsp();
var data = {sql: sql};
fetch(ExecuteReaderPath,
{
method: 'POST',
body: JSON.stringify(data),
headers:
{
'Content-Type': 'application/json'
}
})
.then((res) => res.json())
.then((json) =>
{
const records = json;
tbldsp(records);
})
.catch(error => console.error('Error:', error));
}
HTMLのボタンをクリックしたら動作するファンクション。
sqldsp関数でSQLを生成。
dataオブジェクトのsql:にSQLをセット。
ExecuteReaderPathのURLでサーバーにアクセス。
POSTでbodyにdataオブジェクトをセット。
テーブルの値が戻るのでJSON形式にしHTMLに表示。
テーブルの行を削除
// ***************************************************
// 削除ボタンクリック
// ***************************************************
function rcddel()
{
var sql = sqldel();
var data = {sql: sql};
fetch(ExecuteNonQueryPath,
{
method: 'POST',
body: JSON.stringify(data),
headers:
{
'Content-Type': 'application/json'
}
})
.then((res) => res.json())
.then((json) =>
{
const records = json;
})
.catch(error => console.error('Error:', error));
}
HTMLのボタンをクリックしたら動作するファンクション。
sqldsp関数でSQLを生成。
dataオブジェクトのsql:にSQLをセット。
ExecuteNonQueryPathのURLでサーバーにアクセス。
POSTでbodyにdataオブジェクトをセット。
SQL生成
テーブルの値を取り出すSQL
// ***************************************************
// 表示用sql生成
// ***************************************************
function sqldsp()
{
var sql = ""
sql = sql + "SELECT ";
sql = sql + " TBLPEOPLE_PEOPLEID, ";
sql = sql + " CONCAT(TBLPEOPLE_FAMILYNAMERUBY,TBLPEOPLE_FIRSTNAMERUBY) AS TBLPEOPLE_NAMERUBY, ";
sql = sql + " CONCAT(TBLPEOPLE_FAMILYNAME,TBLPEOPLE_FIRSTNAME) AS TBLPEOPLE_NAME, ";
sql = sql + " TBLPEOPLE_GENDERID, ";
sql = sql + " TBLPEOPLE_BIRTHDAY, ";
sql = sql + " TBLPEOPLE_PREFECTUREID, ";
sql = sql + " TBLPEOPLE_POSTALCODE, ";
sql = sql + " TBLPEOPLE_PHONENUMBER, ";
sql = sql + " TBLPEOPLE_MAILADDRESS ";
sql = sql + " FROM ";
sql = sql + " TBLPEOPLE ";
return(sql);
}
作成したSQLを呼び出し元に返す。
テーブルの行を削除するSQL
// ***************************************************
// レコード削除のsql生成
// ***************************************************
function sqldel()
{
var sql = "";
sql = sql + "DELETE ";
sql = sql + " FROM ";
sql = sql + " TBLPEOPLE ";
sql = sql + " WHERE ";
sql = sql + " TBLPEOPLE_PEOPLEID > 100 ";
return(sql);
}
作成したSQLを呼び出し元に返す。
取得したテーブルの内容をHTMLに表示
// ***************************************************
// テーブルの内容をhtmlに表示
// ***************************************************
function tbldsp(records)
{
var elm = document.getElementById("tbody");
// 子要素を削除
elm.innerHTML = "";
// テーブル見出し
var tblline = "";
tblline = tblline + "<tr>";
tblline = tblline + "<th class='peopleid'>個人コード</th>";
tblline = tblline + "<th class='peoplenameruby'>氏名(フリガナ)</th>";
tblline = tblline + "<th class='peoplename'>氏名(漢字)</th>";
tblline = tblline + "<th class='peoplegenderid'>性別</ht>";
tblline = tblline + "<th class='peoplebirthdsy'>生年月日</th>";
tblline = tblline + "<th class='peopleprefectureid'>県コード</th>";
tblline = tblline + "<th class='peoplepostalcode'>郵便番号</th>";
tblline = tblline + "<th class='peoplephonenumber'>電話番号</th>";
tblline = tblline + "<th class='peoplemailaddress'>メールアドレス</th>";
tblline = tblline + "</tr>";
elm.insertAdjacentHTML('beforeend', tblline);
// レコードを表示
for ( i in records )
{
tblline = "";
tblline = tblline + "<tr>"
tblline = tblline + "<td class='peopleid txr'>" + records[i].TBLPEOPLE_PEOPLEID + "</td>";
tblline = tblline + "<td class='peoplenameruby txl'>" + records[i].TBLPEOPLE_NAMERUBY + "</td>";
tblline = tblline + "<td class='peoplename txl'>" + records[i].TBLPEOPLE_NAME + "</td>";
tblline = tblline + "<td class='peoplegenderid txc'>" + records[i].TBLPEOPLE_GENDERID + "</td>";
tblline = tblline + "<td class='peoplebirthdsy txc'>" + records[i].TBLPEOPLE_BIRTHDAY + "</td>";
tblline = tblline + "<td class='peopleprefectureid txc'>" + records[i].TBLPEOPLE_PREFECTUREID + "</td>";
tblline = tblline + "<td class='peoplepostalcode txc'>" + records[i].TBLPEOPLE_POSTALCODE + "</td>";
tblline = tblline + "<td class='peoplephonenumber txc'>" + records[i].TBLPEOPLE_PHONENUMBER + "</td>";
tblline = tblline + "<td class='peoplemailaddress txl'>" + records[i].TBLPEOPLE_MAILADDRESS + "</td>";
tblline = tblline + "<tr>"
elm.insertAdjacentHTML('beforeend', tblline);
}
}


コメント