SQLの窓

2015年08月19日


IFRAME を ブラウザのサイズ変更時のイベントでコントロールして、HTML5で廃止された FRAME と同様に使うサンプル

デモページ

※ 下の灰色の部分は全て IFRAME で、ブラウザのサイズ変更と同期します

結論から言いますと、IFRAME と FRAME の大きな違いは、上の画像のように jQuery の DatePicker のカレンダーが、IFRAME の上に展開されるというところです。FRAME の場合ですと、ブラウザが用意するコンボボックス等は FRAME の境界を越えて表示されますが、HTML で作成されるコンテンツは FRAME の境界の下に潜り込んでしまいます。

しかし、FRAME の便利な点は、WEB ページのデータ送信の結果を一方通行で別の FRAME に表示できるので、WEB アプリが元のページの内容を書き換える必要が無いところです。当然その特性は IFRAME も持っていますが、IFRAME は固定のウインドウとして表示されるものなので、ブラウザの大きさに同期して表示部分いっぱいいっぱいで利用するには( FRAME のように )、JavaScript でリアルタイムでサイズを変更する必要があります。

にもかかわらず、実際実装しようとすると、ページの縦のサイズを取得しようとすると、IFRAME が表示されているとうまく取得できない仕様になっていて、たいていは失敗する事になります。これを避けるには、IFRAME のサイズ変更は、IFRAME を非表示にして行う事で解決できました。
古い IE のシステムを想定して、IE8 で動作させる為に、header 関数で『x-ua-compatible: IE=8』 を送っています。

IE8 前提なので、jQuery のバージョンは低く設定しています
IE8 では、IFRAME の境界を CSS で消せませんので frameborder を使用しています

IE、Firefox、Google Chronme で正しく動作する為に、縦の補正値を使用しています

shift_jis を使用しているのは、SQLServer を ODBC 関数でアクセスする予定だからです

FORM の送り先は、accept-charset="utf-8" を使用して utf-8 を利用しています( 但しこの機能は IE8 コンパチブルでは動作しないので、受け取り側で対処する必要があります )

デモページのコード
<?php
header( "Content-Type: text/html; Charset=shift_jis" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "x-ua-compatible: IE=8" );

?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=shift_jis">

<!-- jQuery のバージョンが 1.9 なのは、IE 用 -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/jquery-ui.min.js"></script>

<style>
body {
	margin: 0;
}
#wrapper {
	background-color: #ffffff;
}
#head_unit {
	height: 50px;
	padding: 15px 0 10px 15px;
}
#target {
	/* IFRAME の横調整は、ブラウザに任せます */
	width: 100%;
}
</style>
<script>
// IFRAME フィット
function control_page_iframe(iframe_id) {
	var height = Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
	var head_height = document.getElementById("head_unit").clientHeight;

	// -6 は、IE と Firefox 用。Google Chrome は 0 で正しくフィットするが、
	// IE と Firefox では、BODY のスクロールバーが表示されてしまう( バグレベルの動作 )
	document.getElementById(iframe_id).style.height = (height - parseInt(head_height)-6) + "px"
}

// 日付フォーマット用の文字列処理3つ
String.prototype.right = function(n){
	var str = this.valueOf();
	str = str.substr(str.length-n,n);
	return str;
}
String.prototype.zero = function(n){
	var strzero = "0000000000000000000";
	var str = this.valueOf();
	str = strzero + str;
	return str.right(n);
}
Date.prototype.datestr = function(sep){
	str = this.getFullYear() + sep + (this.getMonth()+1).toString().zero(2) + sep + (this.getDate()).toString().zero(2);
	return str;
}

// jQuery DatePicker 用設定データ
var datepicker_option = {
	dateFormat: 'yy/mm/dd',
	dayNamesMin: ['日', '月', '火', '水', '木', '金', '土'],
	monthNames:  ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
	showMonthAfterYear: true,
	yearSuffix: '年',
	changeYear: true,
	showAnim: 'fadeIn'
}
var datepicker;

// jQuery 初期処理
$(function() {
	// jQuery DatePicker プラグイン 
	// ※ 通常フィールド
	datepicker = $("#datepicker")
		.datepicker(datepicker_option)
		.val( (new Date()).datestr("/") )
		.css( "width", "100px" );

	// この処理は、IE のみで動作します
	$("#target").on("focus",function(){
		datepicker.datepicker( "hide" );
	});

	// jQuery DatePicker プラグイン 
	// ※ ダイアログ表示
	$("#datetDialog").click(
		function() {
			$( "#datepicker" ).datepicker(
				"dialog",
				$("#datepicker").val(),
				function(sdate) {
					$("#datepicker").val( sdate );
				},
				datepicker_option
			);
		}
	);

	// Google Chrome 用
	$("#targetDate").val((new Date()).datestr("-"));

	// IFRAME フィット用
	$(window).on("resize", function(){

		var iframe_id = "target";

		document.getElementById(iframe_id).style.display = "none";
		control_page_iframe(iframe_id);
		document.getElementById(iframe_id).style.display = "";

	});

	// 初期 IFRAME フィット
	control_page_iframe("target");

});
</script>
</head>
<body>
<div id="wrapper">
	<div id="head_unit">
		<form target="target_iframe" action="iframe_test.php" accept-charset="utf-8">
			<input id="targetDate" name="date" type="date">
			<input type="submit" name="send" value="送信">
			<input type="submit" name="send" value="リセット">
			jQuery DatePicker: <input name="date2" type="text" id="datepicker">
			<input
				id="datetDialog"
				type="button"
				value="dialog">
		</form>
	</div>
	<!-- frameborder はサイズ調整させるので境界は無しで設定 -->
	<!-- ここでは IE8 コンパチブルなので CSS では消せません -->
	<iframe
		id="target"
		name="target_iframe"
		frameborder="0"
		src="iframe_test2.php"
	></iframe>
</div>

</body>
</html>

▼ IFRAME 内のコード
<?php
header( "Content-Type: text/html; Charset=shift_jis" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
// IE 用
header( "x-ua-compatible: IE=8" );

?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=shift_jis">

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/jquery-ui.min.js"></script>
<script>
$(function() {

	// この処理は、一般的なブラウザと最新の IE( IE11で確認 )で動作します
	$(window).on("focus",function(){
		parent.datepicker.datepicker( "hide" );
	});

});
</script>
<style>
body {
	background-color: #c0c0c0;
}
</style>
</head>
<body>

<img src="https://lh6.googleusercontent.com/-ShzpKMxTsDU/VJ6mrePilbI/AAAAAAAAYA8/YNag5FGr5Qg/s402/freefont_logo_kana003.png" style="border: solid 0px #000000">

<br><br>
あいうえおかきくけこさしすせそたちつてとあいうえおかきくけこさしすせそたちつてとあいうえおかきくけこさしすせそたちつてとあいうえおかきくけこさしすせそたちつてとあいうえおかきくけこさしすせそたちつてとあいうえおかきくけこさしすせそたちつてとあいうえおかきくけこさしすせそたちつてと

</body>
</html>

このページのコードは、INPUT 要素の type="date" の利用のテストも兼ねています。jQuery を使ってしまったほうが簡単ではありますが、既存の FRAME 仕様のページでカレンダーを使うとなると、現在 Google Chrome と Opera でしか動作しません。この二つのブラウザはほぼ同じ仕様でカレンダーが表示されますが、FRAME の境界を越える事ができるので、IE の ActiveX の DatePicker の代替えとして利用可能です。

ですが一つ問題があって・・・

このデモページでは対応済ですが、初期値のセット方法として日付フォーマットが -(ハイフン) 区切りである必要がある上に、月と日は2ケタの前ゼロでなければダメです。さらに、表示は /(スラッシュ)区切りで、かつサーバーに送信されると -(ハイフン)区切り になります。



サーバーサイドはそちらで対応すれば良いですが、もともと JavaScript で日付文字列の操作が面倒なので、String オブジェクトと Date オブジェクトに メソッドを追加して使っています。
String.prototype.right = function(n){
	var str = this.valueOf();
	str = str.substr(str.length-n,n);
	return str;
}
String.prototype.zero = function(n){
	var strzero = "0000000000000000000";
	var str = this.valueOf();
	str = strzero + str;
	return str.right(n);
}
Date.prototype.datestr = function(sep){
	str = this.getFullYear() + sep + (this.getMonth()+1).toString().zero(2) + sep + (this.getDate()).toString().zero(2);
	return str;
}

jQuery もチューニングしています

blur イベントを処理しないと、カレンダーを表示した後、IFRAME 内に移動した時にカレンダーが閉じませんでした。
blur イベントを処理してしまうと、カレンダー内部のコントロールをクリックすると閉じてしまったので、IFRAME 側のイベントで対応しました。しかし、IE8 では、IFRAME 側(内部から window)の focus イベントで動作しなかったので、IFRAME を表示しているほうからの focus イベントで対処しています

関連する記事

Google Chrome 専用 jQuery プラグイン : DatePicker( type=date ) の個別機能の設定を行います / 当日セット、キーイベントキャンセル、専用ボタン非表示




posted by lightbox at 2015-08-19 11:29 | JavaScript コンテンツ | このブログの読者になる | 更新情報をチェックする

2015年08月14日


ファイル名を指定して実行(管理者)

C:\Windows\System32\rundll32.exe shell32.dll,#61

をショートカットに登録して、『詳細設定ボタン』で管理者として実行しておくようにします。





そうすると、見慣れた実行ダイアログに『このタスクは管理者特権で作成されます』と表示が出ます。



例えばここから、コマンドブロンプトを開く為に、cmd と入力して実行すると



タイトル部分に『管理者』の表示がされています



posted by lightbox at 2015-08-14 15:58 | Comment(0) | Windows | このブログの読者になる | 更新情報をチェックする

フォルダのセキュリティ設定

Windows のデフォルトでは、隠しフォルダーや隠しファイルがあります。PC に深い理解がある場合は、通常この設定で表示するようにしますが、一般的な使用者の場合、セキュリティ以前にトラブルにならないよう非表示のままにしておきます。

フォルダーオプションの表示
RUNDLL32.EXE shell32.dll,Options_RunDLL 7


▼ フォルダ単位のセキュリティ設定

表示されているフォルダにもそれぞれセキュリティ設定がされており、システム的な理由で設定のレベルや内容の違うフォルダが存在します。それぞれ、変更等が可能ですが、専門的な知識をかなり要するのでうかつに変更する事は避ける必要があります



しかし、フォルダの中のファイルを更新しようとして更新できないというトラブルは、発生する事もあるので、そのような場合は Everyone を追加して全ての権限を与えて対処する事が必要な場合があります。その場合は、上のボタンから編集ダイアログを開いて、『追加』ボタンでユーザを検索して Everyone 等をセットする必要があります( その後権限を設定します )

関連する技術情報

"Users" と "Authenticated Users" の違いは?
既定のセキュリティ設定の違い
セキュリティ識別子
匿名ログオン ユーザーがアクセスできる情報の制限



posted by lightbox at 2015-08-14 13:58 | Windows | このブログの読者になる | 更新情報をチェックする

2015年08月11日


Google Picasa サービスの URL を使用して、jQuery のスライダーでリアルタイムにサイズの違った画像を表示する

これは、Picasa サービスの URL 部分を変更すると、Picasa 側でそのサイズの画像を作成してくれる事の確認プログラムです。最近、Picasa の URL の仕様が少し変わり、"s長辺のサイズ" の後ろに "-Ic42" が付くようになりましたが、意味は謎です。

スライダーを動かすと、画像サイズが変化しますが、これはそのサイズの画像を表示しています。ブラウザは縮小も拡大もしていません。

この仕様は正式な文書は無いかもしれませんが、Picasa のサービス内でユーザが利用する文字列なので、Picasa サービスが余程の変更されない限り利用が継続できるはずです。

"s長辺のサイズ" 以外にも、"w横幅" と "h高さ" も使えますが、これは以前 Google+ の画像に使用されていたもので、現在も使えますが、この二つはいつ使えなくなってもおかしくない仕様です。(そもそも、Picasa も Google+ の画像も元は同じようです)

活用方法

この仕様と、正規表現の置換を用いれば、一つの URL から複数サイズの画像の URL を動的に作成できるので、簡単な使い方の例としては、表示画像(サムネイル)と目的画像というコンテンツを一度での用意です。




<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<link id="link" rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<script>
var url = "https://lh3.googleusercontent.com/-CuiK3fGTUAw/Vak2SZiXCXI/AAAAAAAAbJM/RpiEqBN0hmw/s100-Ic42/56ce94dfc3fc6f3df8240e7b6cbbadc6.png"

$(function(){

	// 初期画像
	$("#picasa_img").prop("src", url);

	// スライダー
	$("#slider1").slider({
		range: "min",	// 左側を着色する
		step: 50,	// 50 づつ変更
		min: 50,	// 最小50
		max: 600,	// 最大600
		value: 100,	// 初期値
		// スライダーが変化した時のイベント
		slide: function (event, ui) {
			// src に無名関数の戻り値を設定する
			$("#picasa_img").prop("src", function(){
				// s100 部分の 100 を変更する為の正規表現を使った replace
				return url.replace(/\/s\d+\-Ic42\//, "/s"+ui.value+"-Ic42/");
			});
		}
	})
	.css("width", "400px")
	
});

</script>
<div id="slider1"></div>
<br><br>
<img id="picasa_img">



posted by lightbox at 2015-08-11 22:51 | Comment(0) | jQuery UI | このブログの読者になる | 更新情報をチェックする

2015年08月07日


XCOPYで新しいファイルのみバックアップする為のスクリプトを作成するスクリプト



ディレクトリ選択で、パックアップするディレクトリを決定し、カレントディレクトリにバックアップする為のスクリプトを作成します。

そのスクリプトを実行すると、カレントに目的のディレクトリをコピーします。
XCOPY なので、2回目以降は新しいファイルのみコピーします
Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )
Set Shell = Wscript.CreateObject( "Shell.Application" )

' ************************************
' 実行中ディレクトリの取得
' ************************************
strPath = Wscript.ScriptFullName 
Set objFile = Fso.GetFile( strPath )
strBackupFolder = Fso.GetParentFolderName( objFile )

' ************************************
' バックアップ対象ディレクトリの取得
' ************************************
' マイ コンピュータを基準にディレクトリ選択
Set objFolder = Shell.BrowseForFolder( 0, "フォルダ選択", &H4B, _
	"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" )
if objFolder is nothing then
	WScript.Quit
end if
if not objFolder.Self.IsFileSystem then
	WScript.Echo "ファイルシステムではありません"
	WScript.Quit
end if

strTargetFolder = objFolder.Self.Path
strName = Replace( strTargetFolder, ":", "" )
strName = Replace( strName, "\", "_" )
strName = Replace( strName, " ", "" )
strName = "BK_" & strName

' ************************************
' スクリプト作成
' ************************************
Set OutFile = Fso.OpenTextFile( strBackupFolder & "\" & strName & ".vbs", 2, True )

OutFile.WriteLine "strName = Replace( UCase(WScript.ScriptName), "".VBS"", """" )"
OutFile.WriteLine "strTarget = """ & strTargetFolder & """"
OutFile.Write "if MsgBox( strTarget & vbCrLf & ""のバックアップを開始します。"
OutFile.WriteLine "よろしいですか?"", 1 ) = 2 then"
OutFile.WriteLine "	Wscript.Quit"
OutFile.WriteLine "end if"

OutFile.WriteLine "Set WshShell = Wscript.CreateObject( ""WScript.Shell"" )"
OutFile.Write "ExecCommand = ""cmd.exe /C """"xcopy.exe """""
OutFile.Write strTargetFolder & """"" """""
OutFile.Write strBackupFolder & "\"" & strName & ""\"""""
OutFile.WriteLine " /D /E /C /S /Y & PAUSE"""""""
OutFile.WriteLine "Call WshShell.Run( ExecCommand )"

OutFile.Close


更新履歴
2009-06-28 : 記事作成
2013-04-02 : ダウンロード追加
2015-08-07 : ダウンロードを zip 化( Google Chrome 対応 )



posted by lightbox at 2015-08-07 23:49 | VBScript | このブログの読者になる | 更新情報をチェックする

WEB フォントをクロスドメインで利用する

prototype.js でクロスドメインの Ajax の読み込みテスト と同じで、http ヘッダーに、「Access-Control-Allow-Origin: *」を指定すると利用可能になります。

Google ドライブを使うのが簡単です

IE8 の場合は、指定しなくても動くような気もするのですが(一応テストしていますが、動作したので)、Firefox では、http ヘッダーを読んで、このヘッダーが無いと読み込みをキャンセルしています。( Firebug の 接続で読み込み時間を見ているとそんな感じ )

Ajax では、PHP で出力すれば良かったですが、フォントは .htaccess に指定します。
header add Access-Control-Allow-Origin *
※ ヘッダ名には最後にコロンを含めることもできますが、無くても構いません。
※ set, append, add, unset では大文字小文字は 区別されません。
※ add, append, set では value を三つ目の 引数として指定します。
※ value に空白がある場合は二重引用符で 囲む必要があります。
( 空白がなければ、二重引用符は必要無い )

Firebug で確認しましたが、戻ってきたヘッダーは以下のようになっています。
Server: ZWS
Date: Wed, 27 Apr 2011 23:32:49 GMT
Content-Type: text/plain
Content-Length: 392828
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Last-Modified: Wed, 27 Apr 2011 07:46:17 GMT
実際の記述方法は以下を参照して下さい。
WEB フォントの記述方法の考察
りいポップ
webフォントとしてもご利用可能です(2012.9.3より)。
※webフォントとしてご利用になる場合、ファイル形式の変換はご自由にしてくださってOKです。

▼ ブログ記事用( りいポップ角で使用しています )
<script>
if ( !window[window.location.hostname+'.FancyBalloons'] ) {
	window[window.location.hostname+'.FancyBalloons'] = true;
	(function() {
		var str="";
		str+="<style> \n";
		str+="@font-face { \n";
		str+="    font-family: 'fb'; \n";
		str+="    src: url('https://googledrive.com/host/0B9Jymqpro6gSVlB5Wm52U29wTlE/font/riipopkkr.woff') format('woff'); \n";
		str+="} \n";
		str+="</style> \n";
		document.write(str);
	})();
}
</script>
<style>
#web_font_content {
	font-family: 'fb';
	font-size:60px;
}
</style>
<span id="web_font_content">りいポップ</span>

※ この記述は、表示されているページで必要な CSS の記述を一度だけにする方法です

また、IE 用の .eot のフォントファイルを作成するのは、以下のサイトより。
ttf2eot

ですが、WOFF を使うのが現実的だと思います。変換は以下のサイトで( ファイルサイズは、0.4M までです )
ttf to woff converter


▼ woff2 用
ttf to woff2 converter

※ IPA フォントは WEBフォントとして使用できます。但しライセンス表記に注意です

OTF を TTF に変換したい場合は、以下のサイトが利用できます。
Online font converter

ですが、fontforge-cygwin を使うほうが確実です。
使い方としては、こちらが参考になります( と言うか参考にして実運用しています )

※ 最近単一化がグレイアウトされているフォントに時々出会いますが、そのまま ttf へ出力可能っぽいです。

関連する記事

2014年7月7日現在。WEBフォントの実際



posted by lightbox at 2015-08-07 12:31 | 記録 | このブログの読者になる | 更新情報をチェックする

2015年08月06日


PHP : PIPES_AS_CONCAT を使用して、CSV 作成処理をサーバの負荷にして高速に WrodPress のデータを Excel で読み込める CSV として保存する処理

まず、set sql_mode = 'PIPES_AS_CONCAT' を同一セッション内で実行しておく事によって、Oracle と同様に文字列連結に || を使用できるようになります。

そこで、CSV としての 文字列の仕様を SELECT 構文上でほぼ完成させておいて、クライアントでは一つの列を取得して、改行コードの処理のみを加えてファイルに出力するようにしています。ファイルの出力も、ここでは file_put_contents を使っている為、効率は良くありません。大量のデータを処理したい場合ならば、ファイルへの出力は一行単位で行うべきです。

この方法は十数年前の Oracle でレスポンスが顕著で、天と地ほどの処理時間の差が出ていました。現在では、クライアントの処理能力も上がったので差は無いかもしれませんが、一つのテクニックとして利用可能だと思います。

出来上がった SQL
select ID||','||post_author||','||'"'||replace(post_date,'"','""')||'"'||','||'"'||replace(post_date_gmt,'"','""')||'"'||','||'"'||replace(post_content,'"','""')||'"'||','||'"'||replace(post_title,'"','""')||'"'||','||'"'||replace(post_excerpt,'"','""')||'"'||','||'"'||replace(post_status,'"','""')||'"'||','||'"'||replace(comment_status,'"','""')||'"'||','||'"'||replace(ping_status,'"','""')||'"'||','||'"'||replace(post_password,'"','""')||'"'||','||'"'||replace(post_name,'"','""')||'"'||','||'"'||replace(to_ping,'"','""')||'"'||','||'"'||replace(pinged,'"','""')||'"'||','||'"'||replace(post_modified,'"','""')||'"'||','||'"'||replace(post_modified_gmt,'"','""')||'"'||','||'"'||replace(post_content_filtered,'"','""')||'"'||','||post_parent||','||'"'||replace(guid,'"','""')||'"'||','||menu_order||','||'"'||replace(post_type,'"','""')||'"'||','||'"'||replace(post_mime_type,'"','""')||'"'||','||comment_count from wp_posts

<?php
// **************************************
// MIME と キャラクタセットを設定
// **************************************
header( "Content-Type: text/html; Charset=utf-8" );

// **************************************
// キャッシュを無効にするヘッダ
// **************************************
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// **************************************
// グローバル変数
// **************************************
$server = 'データベースサーバー';
$db_name = 'データーベース';
$user = 'ユーザー';
$password = 'パスワード';

print "処理開始<br>";
// **************************************
// データベース接続
// **************************************
$connect = @ new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}

// **************************************
// クライアントのキャラクタセット
// **************************************
$connect->set_charset("cp932");

// セッション(接続)中有効
$query = "set sql_mode = 'PIPES_AS_CONCAT'";
// クエリ
$result = $connect->query($query); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

// **************************************
// WordPress の投稿データ
// **************************************
$query = "select * from wp_posts";
// クエリ
$result = $connect->query($query); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

// **************************************
// 列名とデータ型を取得
// **************************************
$finfo = $result->fetch_fields();

$name = array();
$type = array();
foreach ($finfo as $val) {
	$name[] = $val->name;
	$type[] = $val->type;
}

// **************************************
// フィールド数
// **************************************
$field_count = $connect->field_count;

$csv = "";
for( $i = 0; $i < $field_count; $i++ ) {
	if ( $i != 0 ) {
		$csv .= "||','||";
	}
	// 数値型
	// TIMESTAMP型(7) を使用している場合は変更が必要です
	if ( $type[$i] < 10 || $type[$i] == 246 || $type[$i] == 16 ) {
		$csv .= $name[$i];
	}
	else {
		$csv .= "'\"'||replace({$name[$i]},'\"','\"\"')||'\"'";
	}

}

$query = "select {$csv} from wp_posts";
// クエリ
$result = $connect->query($query); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

file_put_contents("query.txt", $query);

$file = "";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// データ内の改行コード
	$row[0] = str_replace("\r\n", "\\r\\n", $row[0]);
	$row[0] = str_replace("\r", "\\r", $row[0]);
	$row[0] = str_replace("\n", "\\n", $row[0]);

	// insert としての一行を追加
	$file .= "{$row[0]}\r\n";

}

// **************************************
// ファイルに出力
// **************************************
file_put_contents("easy.csv", $file);

?>

関連する記事



タグ:PHP MySQL WordPress
posted by lightbox at 2015-08-06 20:05 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

2015年08月05日


jQuery の nextAll と prevAll で、テーブル行の任意のセルをクリックしてその行の全ての TD 内のデータを取得する

nextAll は、起点となる要素から下方向に存在する同じ階層の要素を全て取得します。引数にセレクタが指定できるので、ここでは TD にクラスを設定して目的の要素を特定していますが、特定する要素の属性が無い場合は、$(this).nextAll().eq(0).text() のようにして eq(順序番号) を指定して特定できます。

コード 名称 金額 購入日 担当者 発注先
0002 問題集 002 4000 2015/08/24 田中 発注先002
0003 問題集 003 3000 2015/08/23 山田 発注先003
0004 問題集 004 2000 2015/08/22 山田 発注先004
0001 問題集 001 1000 2015/08/21 田中 発注先001
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
$(function() {

	$(".check").click(function(){
		$("#cd").val($(this).prevAll(".t0").text());
		$("#name").val($(this).text());
		$("#kin").val($(this).nextAll(".t1").text());
		$("#bdate").val($(this).nextAll(".t2").text());
		$("#tanto").val($(this).nextAll(".t3").text());
		$("#co").val($(this).nextAll(".t4").text());
	});

});

</script>
<style type="text/css">
.check {
	text-decoration: underline;
	cursor: pointer;
	color: blue;
	width: 100px;
}
#lboxtable input {
	width:100px;
}
#lboxtable table {
	margin-top: 10px;
	border-collapse: collapse;
	border-style: solid;
	border-color: #000000;
	border-width: 1px;
	background-color: #FFFFFF;
}
#lboxtable td {
	padding: 5px;
	border-style: solid;
	border-color: #000000;
	border-width: 1px;
}
#lboxtable th {
	padding: 5px;
	border-style: solid;
	border-color: #000000;
	border-width: 1px;
	background-color: silver;
}
#lboxtable .header {
	padding: 5px;
	border-style: solid;
	border-color: #000000;
	border-width: 1px;
	background-color: silver;
}
</style>
<div id="lboxtable">
<input id="cd">
<input id="name">
<input id="kin">
<br>
<input id="bdate">
<input id="tanto">
<input id="co">
<table>
    <tbody>
        <tr>
            <th>コード</th>
            <th>名称</th>
            <th>金額</th>
            <th>購入日</th>
            <th>担当者</th>
            <th>発注先</th>
        </tr>
        <tr>
            <td class="t0">0002</td>
            <td class="check">問題集 002</td>
            <td class="t1">4000</td>
            <td class="t2">2015/08/24</td>
            <td class="t3">田中</td>
            <td class="t4">発注先002</td>
        </tr>
        <tr>
            <td class="t0">0003</td>
            <td class="check">問題集 003</td>
            <td class="t1">3000</td>
            <td class="t2">2015/08/23</td>
            <td class="t3">山田</td>
            <td class="t4">発注先003</td>
        </tr>
        <tr>
            <td class="t0">0004</td>
            <td class="check">問題集 004</td>
            <td class="t1">2000</td>
            <td class="t2">2015/08/22</td>
            <td class="t3">山田</td>
            <td class="t4">発注先004</td>
        </tr>
        <tr>
            <td class="t0">0001</td>
            <td class="check">問題集 001</td>
            <td class="t1">1000</td>
            <td class="t2">2015/08/21</td>
            <td class="t3">田中</td>
            <td class="t4">発注先001</td>
        </tr>
    </tbody>
</table>
</div>



タグ:jquery
posted by lightbox at 2015-08-05 15:47 | jQuery メソッド | このブログの読者になる | 更新情報をチェックする

2015年08月04日


PHP : WrodPress のデータを insert SQL で保存する処理

前回の Excel とは違い、SQL のクォートがシングルクォートなので、データ中の ' は '' に変換しています。キャラクタセットも本来の utf8 を指定していますがこれは省略してもいいでしょう。

実際にローカルの MySQL に wp_posts を作成して 作成された insert 文を2つ実行してみましたが、エラー無く登録されました。
<?php
// **************************************
// MIME と キャラクタセットを設定
// **************************************
header( "Content-Type: text/html; Charset=utf-8" );

// **************************************
// キャッシュを無効にするヘッダ
// **************************************
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// **************************************
// グローバル変数
// **************************************
$server = 'データベースサーバー';
$db_name = 'データーベース';
$user = 'ユーザー';
$password = 'パスワード';

print "処理開始<br>";
// **************************************
// データベース接続
// **************************************
$connect = @ new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}

// **************************************
// クライアントのキャラクタセット
// **************************************
$connect->set_charset("utf8");

// **************************************
// WordPress の投稿データ
// **************************************
$query = "select * from wp_posts";
// クエリ
$result = $connect->query($query); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

// **************************************
// 列名とデータ型を取得
// **************************************
$finfo = $result->fetch_fields();

$name = array();
$type = array();
foreach ($finfo as $val) {
	$name[] = $val->name;
	$type[] = $val->type;
}

// **************************************
// フィールド数
// **************************************
$field_count = $connect->field_count;

$fld_list = "(" . implode(",",$name ) . ")";

$file = "";

while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// CSV の一行の作成
	$insert = "insert into wp_posts {$fld_list} values(";
	for( $i = 0; $i < $field_count; $i++ ) {
		if ( $i != 0 ) {
			$insert .= ",";
		}
		// 数値型
		// TIMESTAMP型(7) を使用している場合は変更が必要です
		if ( $type[$i] < 10 || $type[$i] == 246 || $type[$i] == 16 ) {
			if ( $row[$i] == "" ) {
				$insert .= "0";
			}
			else {
				$insert .= $row[$i];
			}
		}
		else {
			// データ内のダブルクォートとフィールドを囲むダブルクォート
			if ( $row[$i] == "" ) {
				$insert .= "''";
			}
			else {
				$insert .= "'" . str_replace("'", "''","$row[$i]") . "'";
			}
		}
	}

	// データ内の改行コード
	$insert = str_replace("\r\n", "\\r\\n", $insert);
	$insert = str_replace("\r", "\\r", $insert);
	$insert = str_replace("\n", "\\n", $insert);

	// insert としての一行を追加
	$file .= "{$insert});\r\n";

}

// **************************************
// ファイルに出力
// **************************************
file_put_contents("insert.sql", $file);

?>


関連する記事

参考

MySQL TIMESTAMP / MySQLTutorial



posted by lightbox at 2015-08-04 20:30 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

2015年08月03日


PHP : WrodPress のデータを Excel で読み込める CSV として保存する処理

結果の確認として、Excel が簡単なので、SHIFT_JIS その他を最適化していますが、利用先に合わせて変更すればいいと思います。最初1行目に列名リストを出力していたのですが、Excel の仕様で最初に ID という文字があるとエラーになるので省いています。
<?php
// **************************************
// MIME と キャラクタセットを設定
// **************************************
header( "Content-Type: text/html; Charset=utf-8" );

// **************************************
// キャッシュを無効にするヘッダ
// **************************************
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// **************************************
// グローバル変数
// **************************************
$server = 'データベースサーバー';
$db_name = 'データーベース';
$user = 'ユーザー';
$password = 'パスワード';

print "処理開始<br>";
// **************************************
// データベース接続
// **************************************
$connect = @ new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}

// **************************************
// クライアントのキャラクタセット
// **************************************
$connect->set_charset("cp932");

// **************************************
// WordPress の投稿データ
// **************************************
$query = "select * from wp_posts";
// クエリ
$result = $connect->query($query); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

// **************************************
// 列名とデータ型を取得
// **************************************
$finfo = $result->fetch_fields();

$name = array();
$type = array();
foreach ($finfo as $val) {
	$name[] = $val->name;
	$type[] = $val->type;
}

// **************************************
// フィールド数
// **************************************
$field_count = $connect->field_count;

$file = "";

while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// CSV の一行の作成
	$csv = "";
	for( $i = 0; $i < $field_count; $i++ ) {
		if ( $csv != "" ) {
			$csv .= ",";
		}
		// 数値型
		// TIMESTAMP型(7) を使用している場合は変更が必要です
		if ( $type[$i] < 10 || $type[$i] == 246 || $type[$i] == 16 ) {
			$csv .= $row[$i];
		}
		else {
			// データ内のダブルクォートとフィールドを囲むダブルクォート
			$csv .= "\"" . str_replace('"', '""',"$row[$i]") . "\"";
		}
	}

	// データ内の改行コード
	$csv = str_replace("\r\n", "\\r\\n", $csv);
	$csv = str_replace("\r", "\\r", $csv);
	$csv = str_replace("\n", "\\n", $csv);

	// CSV としての一行を追加
	$file .= "{$csv}\r\n";

}

// **************************************
// ファイルに出力
// **************************************
file_put_contents("table.csv", $file);

?>


関連する記事

参考

MySQL TIMESTAMP / MySQLTutorial



posted by lightbox at 2015-08-03 20:41 | PHP + データベース | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します


Windows
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり