SQLの窓 イラストAC フリー素材

2019年08月20日

Firebase に定義した Realtime Database の API を使用して TABLE を作成する

このアプリは問い合わせとして TABLE で 一覧を作成しますが、API を使用すると容易に更新も実行する事が可能です



参考にするべきドキュメント

ウェブ上でデータリストを操作する

Firebase を JavaScript プロジェクトに追加する

<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta charset="utf-8">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>

<link rel="stylesheet" href="https://lightbox.sakura.ne.jp/demo/two-section.css">
<script src="https://lightbox.sakura.ne.jp/demo/number-format.js"></script>

<script>

$(function(){

	// **************************************
	// ボタン
	// **************************************
	$("#load_json").on( "click", function(){

		// データベース参照
		var myFirebaseRef;

		myFirebaseRef = firebase.database().ref('syain');

		myFirebaseRef.once('value', 
			function(snapshot) {

				if ( !snapshot.exists() ) {
					alert( "データが存在しません" );
					return;
				}

				loadData( snapshot );

			},
			function(error){
				console.dir(error);
			}
		);
	
	});

	// **************************************
	// このページ自身の QRコードの表示
	// **************************************
	$('#qrcode')
		.css({ "margin" : "20px 20px 20px 20px" })
		.qrcode({width: 160,height: 160,text: location.href });

});

// **************************************
// firebase => table
// **************************************
function loadData( snapshot ) {

	$("#tbl").html("");

	// データ用
	var row_data;

	var index = 0;

	snapshot.forEach(function(data){

		var obj = data.val();
		
		// 初回はタイトル作成
		if ( index == 0 ) {
			// テーブルに行を追加	
			row_data = $("<tr></tr>").appendTo( "#tbl" );

			$("<th></th>").appendTo( row_data ).text( "社員コード" );
			$("<th></th>").appendTo( row_data ).text( "氏名" );
			$("<th></th>").appendTo( row_data ).text( "フリガナ" );
			$("<th></th>").appendTo( row_data ).text( "給与" );
			$("<th></th>").appendTo( row_data ).text( "性別" );
			$("<th></th>").appendTo( row_data ).text( "管理者" );
			$("<th></th>").appendTo( row_data ).text( "生年月日" );

		}
		

		var re = new RegExp($("#sname").val());
		if ( obj.name.search(re) != -1  ) {

			// テーブルに行を追加	
			row_data = $("<tr></tr>").appendTo( "#tbl" );

			$("<td></td>").appendTo( row_data ).text( obj.code );
			$("<td></td>").appendTo( row_data ).text( obj.name );
			$("<td></td>").appendTo( row_data ).text( obj.furi );
			$("<td></td>").appendTo( row_data ).text( obj.kyuyo );
			$("<td></td>").appendTo( row_data ).text( (obj.sex == 0 ? "男性" : "女性"  ) );
			$("<td></td>").appendTo( row_data ).text( obj.kanri );
			$("<td></td>").appendTo( row_data ).text( obj.birthday );

		}
		
		index++;

	});

}
</script>
</head>
<body>
	<div id="head">
		<input type="text" id="sname" name="sname">
		<input type="button" id="load_json" value="検索">
	</div>

	<div id="extend">
		<table class="table">
		<tbody id="tbl">

		</tbody>
		</table>

		<div id="qrcode"></div>
	</div>

<!-- https://firebase.google.com/docs/web/setup?authuser=0#add-sdks_CDN -->

<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/6.4.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/6.4.0/firebase-database.js"></script>

<!-- TODO: Add SDKs for Firebase products that you want to use
     https://firebase.google.com/docs/web/setup#config-web-app -->

<script>
  // Your web app's Firebase configuration
  var firebaseConfig = {
// *****************************************
// Firebase より取得した WEB 用 API情報
// *****************************************
  };
  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
</script>

</body>
</html>

強調部分が Firebase より取得する部分ですが、firebase-database.js の行は追加になります



【JavaScriptの最新記事】
posted by at 2019-08-20 17:28 | JavaScript | このブログの読者になる | 更新情報をチェックする

PHP : MySQL から JSON 文字列を返す自作(テスト用) API テンプレート

access-control-allow-origin: * を出力して JavaScript から自由に読み込めるようにしています。

fetch_all を使用してJSON 文字列を一括で取得しています。
<?php
error_reporting( E_ALL & ~E_NOTICE );

session_cache_limiter('nocache');
session_start();

// 取得対象列
$list = "社員コード,氏名,フリガナ,所属,性別,作成日,更新日,給与,ifnull(手当,0) as 手当,ifnull(管理者,'') as 管理者";
// json encode オプション
$flg = 0x0000;

// JavaScript ajax 用
header( "Access-Control-Allow-Origin: *" );
header( "Content-Type: application/json; charset=utf-8" );

// DB 接続
$mysqli = new mysqli('サーバ', 'ユーザ', 'パスワード', 'データーベース');
if ( $mysqli->connect_error ) {
	// 接続失敗
	$json = array( "error" => "Connect Error ({$mysqli->connect_errno}) {$mysqli->connect_error}" );
}
else {
	// json encode オプション
	if ( $_GET["pretty"] != "no" ) {
		$flg = $flg | JSON_PRETTY_PRINT;
	}
	if ( $_GET["escape"] != "no" ) {
		$flg = $flg | JSON_UNESCAPED_UNICODE;
	}

	$mysqli->set_charset("utf8");

	// ~E_NOTICE なので、単純化
	if ( $_GET["name"] == "" ) {
		$query = "select {$list} from 社員マスタ";
	}
	else {
		$query = "select {$list} from 社員マスタ";
		// 条件オプション
		$query .= " where 氏名 like ?";
	}

	// SQL 準備
	$stmt = $mysqli->prepare($query);
	if ( $stmt === false ) {
		// SQL 失敗
		$json = array( "error1" => "$mysqli->error : {$query}" );
	}
	else {
		// バインドは変数で
		$param = "%{$_GET["name"]}%";

		// パラメータの数が一致しない場合の warning を出さない為の @ 抑制
		@$stmt->bind_param('s', $param );
		if ( false === $stmt->execute() ) {
			$json = array( "error2" => "$mysqli->error" );
		}
		else {
			// MySQL ネイティブドライバ限定(PHP 5.3.0 以降)
			$result = $stmt->get_result();
			if ( $result === false ) {
				$json = array( "error3" => "$mysqli->error" );
			}
			else {
				// DB 読み出し成功
				$json = $result->fetch_all( MYSQLI_ASSOC );
			}
		}
	}
}

print json_encode( $json, $flg );

?>




posted by at 2019-08-20 17:10 | PHP | このブログの読者になる | 更新情報をチェックする

jQuery の $.ajax で JSON 文字列を WEB より取得して TABLE を作成する

IE11 でも動作します。

JSON 文字列は、PHP で access-control-allow-origin: * を出力してどこからでも読み込めるようにしています。

<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta charset="utf-8">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>

<link rel="stylesheet" href="https://lightbox.sakura.ne.jp/demo/two-section.css">
<script src="https://lightbox.sakura.ne.jp/demo/number-format.js"></script>

<script>

$(function(){

	// **************************************
	// ボタン
	// **************************************
	$("#load_json").on( "click", function(){

		$.ajax({
			url: "https://lightbox.sakura.ne.jp/demo/json/syain_api_bind.php",
			cache: false,
			data: { "name" : $("#sname").val() }
		})
		.done(function( data, textStatus ){
			console.log( "status:" + textStatus );
			console.log( "data:" + JSON.stringify(data, null, "    ") );

			// tabble 作成
			loadData( data );

		})
		// 失敗
		.fail(function(jqXHR, textStatus, errorThrown ){
			console.log( "status:" + textStatus );
			console.log( "errorThrown:" + errorThrown );
		})
		// 常に実行
		.always(function() {

		})
		;
	
	});

	// **************************************
	// このページ自身の QRコードの表示
	// **************************************
	$('#qrcode')
		.css({ "margin" : "20px 20px 20px 20px" })
		.qrcode({width: 160,height: 160,text: location.href });

});

// **************************************
// JSON => table
// **************************************
function loadData( data ) {

	$("#tbl").html("");

	// データ用
	var row_data;

	// 行のループ  ( <tr></tr> )
	$.each(data, function( index, syain ) {

		// 初回はタイトル作成
		if ( index == 0 ) {
			// テーブルに行を追加	
			row_data = $("<tr></tr>").appendTo( "#tbl" );
			$.each( syain, function( key, value ) {
				$("<th></th>")
					.appendTo( row_data )
					.text( key );
			});
		}


		// テーブルに行を追加	
		row_data = $("<tr></tr>").appendTo( "#tbl" );

		// 列のループ ( <td></td> )
		$.each( syain, function( key, value ) {

			$("<td></td>")
				.appendTo( row_data )
				.text( value );

		});
	
	});

}
</script>
</head>
<body>
	<div id="head">
		<input type="text" id="sname" name="sname">
		<input type="button" id="load_json" value="検索">
	</div>

	<div id="extend">
		<table class="table">
		<tbody id="tbl">

		</tbody>
		</table>

		<div id="qrcode"></div>
	</div>

</body>
</html>


関連する記事

下半分がスクロールするページ【 height: calc( 100% - 120px ) 】

PHP : MySQL から JSON 文字列を返す自作(テスト用) API テンプレート




posted by at 2019-08-20 17:00 | jQuery | このブログの読者になる | 更新情報をチェックする

JScript( WSH ) : Msxml2.ServerXMLHTTP の GET で WEB 上の文字列を取得して JSON オブジェクトに変換して利用する

open Method (ServerXMLHTTP-IServerXMLHTTPRequest)

JSON 文字列を JSON に変換するのは、MDN でも紹介されている eval で行います。

JSON 文字列を送りたい場合は少し面倒ですが、受け側を自作できるのならば他に代替え方法はいくらでも可能です( どうしても必要ならば ポリフィル 使えばいいと思います )。

URL エンコードは encodeURIComponent で行います。
var cond = "name=" + encodeURIComponent("田");
srvXmlHttp.open("GET", "https://lightbox.sakura.ne.jp/demo/json/syain_api_bind.php?" + cond, false);
<JOB>
<SCRIPT language="JScript">
// ************************************
// cscript.exe での実行を強制
// ※ 一覧表示の為
// ************************************
str = WScript.FullName;
str = str.substr( str.length - 11, 11 );
str = str.toUpperCase();
if ( str != "CSCRIPT.EXE" ) {
	str = WScript.ScriptFullName;
	WshShell =  new ActiveXObject("WScript.Shell");
	WshShell.Run( "cmd.exe /c cscript.exe \"" + str + "\" & pause", 3 );
	WScript.Quit();
}

// ************************************
// タイムアウト設定用データ
// ※ デフォルトでも特に問題なし
// ( setTimeouts なし )
// ************************************
var lResolve = 60;
var lConnect = 60;
var lSend = 30;
var lReceive = 30;

// ************************************
// HTTP( GET )
// ※ syain_api_bind.php は utf-8
// ※ open の false は同期処理
// ************************************
var srvXmlHttp;
srvXmlHttp = new ActiveXObject("Msxml2.ServerXMLHTTP.3.0");
srvXmlHttp.open("GET", "https://lightbox.sakura.ne.jp/demo/json/syain_api_bind.php", false);
srvXmlHttp.setTimeouts(lResolve, lConnect, lSend, lReceive);
srvXmlHttp.send();

// ************************************
// JSONフォーマットのテキスト
// ************************************
var text = srvXmlHttp.responseText;

// ************************************
// text を JSON オブジェクトに変更
// ************************************
var json = eval('(' + text + ')');

// ************************************
// 氏名部分を表示
// ************************************
for( i = 0; i < json.length; i++ ) {
	WScript.Echo( json[i]["氏名"] );
}

</SCRIPT>
</JOB>


関連する記事

VBscript(または JScript) で簡単にバイナリファイルをアップロードする



posted by at 2019-08-20 00:11 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

2019年08月18日

JScript( WSH ) で MsgBox と InputBox を使う

相互に呼び出し可能ですが、メインとなるほうを下に定義するのが経験則的に間違いがありません。
( つまり、メインに無い機能は先に関数として定義しておく )

<JOB>
<SCRIPT language="VBScript">
function input_box( title )

	input_box = InputBox( title )

end function
function msg_box( message )

	MsgBox( message )

end function
</SCRIPT>
<SCRIPT language="JScript">

var text = input_box("入力してください")
if ( typeof( text ) == "undefined" ) {
	WScript.Echo( "キャンセルされました" );
	WScript.Quit()
}

msg_box( text + " が入力されました" )

</SCRIPT>
</JOB>




posted by at 2019-08-18 19:19 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

2019年08月17日

IE11 : JScript : Excel.Application でファイルを開くダイアログを使用する

通常だと、ダイアログが IE11 の後ろに隠れてしまうので、Excel の表示位置をデスクトップの外に置いて表示状態にし、一旦最大化して(この時点で手前に出る)から元に戻しています。

<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta charset="utf-8">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">

<link rel="stylesheet" href="https://lightbox.sakura.ne.jp/demo/two-section.css">
<script>
var save = { width: null, height: null, top: null, left: null };
var excel = null;

$(function(){

	// Excel でファイルを開くダイアログ	
	$("#open_file_dialog").on("click", function(){
	
		// Excel をロード
		excel = new ActiveXObject("Excel.Application");
		
		save.width = excel.width;
		save.height = excel.height;
		save.top = excel.top;
		save.left = excel.left;
		
		excel.top = -200;	// デスクトップの外に隠す
		excel.left = -200;
		excel.width = 100;
		excel.height = 100;
		excel.Visible = true;
		excel.WindowState = 2	// Minimize
		excel.WindowState = 1	// Maximize

		excel.DisplayAlerts = false;

		// 一つのファイルを開く
		// https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.getopenfilename
		var filePath = excel.GetOpenFilename("全て,*.*,CSV,*.csv", 1,"ファイルの選択",null, false );
		// 非表示にして
		excel.Visible = false;
		// デスクトップの中に戻す
		excel.width = save.width;
		excel.height = save.height;
		excel.top = save.top;
		excel.left = save.left;

		// 未選択の場合
		if( filePath === false ) {
			alert("ファイルの参照選択がキャンセルされました")
		}
		// 選択の場合
		else {
			alert(filePath + " を選択しました");
		}

		// Excel を終了
		excel.Quit();
		excel = null;
		// Excel 解放
		var idTmr = window.setTimeout("Cleanup();",1);

	});

});
// ******************************
// Excel 解放
// ******************************
function Cleanup() {
	CollectGarbage();
}

</script>
</head>
<body>
	<div id="head">
		<input type="button" id="open_file_dialog" value="ファイルを開く">
	</div>

	<div id="extend">

	</div>

</body>
</html>



posted by at 2019-08-17 15:48 | IE | このブログの読者になる | 更新情報をチェックする