2009年07月01日


Form(サーバー送信)汎用スケルトン(5) : ディレクトリ内のファイル一覧


ブラウザでダウンロード
今回は、ファイルを3つに分けたので、common.php と、view.php
はダウンロードパッケージの中にあります。
<?
// *********************************************************
// 共通部分
// *********************************************************
require_once( 'common.php' );

// *********************************************************
// 変数
// *********************************************************
// データを作成するディレクトリ
$upload_dir = './upload';
// テーブルタグを含むファイル名リストの文字列
$upload_list = '';
// 一行の列数
$cols = 4;


////////////////////////////////////////////////////////////
// POST された場合の処理
////////////////////////////////////////////////////////////
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

	if ( !file_exists( $upload_dir ) ) {
		mkdir( $upload_dir );
	}

	$Message = "POSTされました<br>\n";

	// テスト用の簡単な ID 取得
	$srcid = uniqid();

	// ファイルへ入力されたデータを書き込み
	file_put_contents( "$upload_dir/$srcid.txt", $_POST['text'] );

}


////////////////////////////////////////////////////////////
// 常に実行するファイル一覧の取得
////////////////////////////////////////////////////////////
$DirHandle = @opendir($upload_dir);
if ( $DirHandle ) {

	// ループ処理
	while( 1 ) {

		$rows = ReadRow( $DirHandle, $cols );
		// 配列が空の場合はデータが全く存在しないので、
		// 何もしないですぐ終わる
		if ( count( $rows ) == 0 ) {
			break;
		}

		$upload_list .= "<tr>\n";
		for( $i = 0; $i < $cols; $i++ ) {
			$upload_list .= "<td>";
			$upload_list .= "<a href=\"$upload_dir/{$rows[$i]}\"";
			$upload_list .= " target=\"_blank\">{$rows[$i]}</a>";
			$upload_list .= "</td>\n";
		}
		$upload_list .= "</tr>\n";

	}
}


// *********************************************************
// 一行のデータを読んで、配列にデータをセットする
// ( 戻り値の配列数が 0 の場合、データは存在しない )
// $cols で、1行の列数を決定する
// *********************************************************
function ReadRow( $handle, $cols ) {

	$ret = array();

	while( 1 ) {
		$Target = readdir( $handle );
		// データが完全な終了
		if ( $Target === false ) {
			break;
		}
		// 対象外は読み飛ばし
		if ( $Target == '.' || $Target == '..' ) {
			continue;
		}

		$ret[] = $Target;

		// 指定回数配列がセットされたらループを終了する
		if ( count( $ret ) == $cols ) {
			break;
		}
	}

	return $ret;
}

// *********************************************************
// 画面
// *********************************************************
require_once( 'view.php' );

?>

posted by at 2009-07-01 21:02 | スケルトン | このブログの読者になる | 更新情報をチェックする

2009年06月29日


PL/SQL文を実行する

DBMS_OUTPUT.PUT_LINE の結果は、それに対応した実行環境でないと
表示されませんが、SQL と同じように文字列として実行できます。

扱いは、UPDATE や INSERT のような結果の行を返さない実行です。
サーバーへ登録する時の記述の AS 以降を使い、AS を DECLARE に
変える事によって実行可能です。

定型的な処理は、引数を使って呼び出せるようにサーバーに登録しますが、
その時だけの運用的な処理では、このように実行するほうが現実的です。

また、サーバーで登録できない場合は、レスポンスに問題は出ますが、
文字列としてコードを実行毎に作成するというアプリケーションも
実際問題として良く使われているはずです。
DECLARE

	WK_CNT NUMBER := 0;

	CURSOR cur_main IS
		SELECT * FROM 社員マスタ where 社員コード >= '0021';

	社員_REC cur_main%ROWTYPE; 

	/* ファイルを扱う為の変数 */
	FILEHANDLE	UTL_FILE.FILE_TYPE;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN

	OPEN cur_main;
	/* ファイルを開く */
	FILEHANDLE := UTL_FILE.FOPEN( 'MYDIR', 'syain.csv', 'w' );
	LOOP
		FETCH cur_main INTO 社員_REC;
		EXIT when cur_main%NOTFOUND;

		WK_CNT := WK_CNT + 1;

		/* ファイルへ書き込む */
		UTL_FILE.PUT_LINE( FILEHANDLE, 
			社員_REC.社員コード
			||','||社員_REC.氏名
			||','||社員_REC.フリガナ
			||','||社員_REC.所属
			||','||社員_REC.性別
			||','||社員_REC.作成日
			||','||社員_REC.更新日
			||','||社員_REC.給与
			||','||社員_REC.手当
			||','||社員_REC.管理者
			||','||社員_REC.生年月日
		);

	END LOOP;
	CLOSE cur_main;
	/* ファイルを閉じる */
	UTL_FILE.FCLOSE( FILEHANDLE );

	DBMS_OUTPUT.PUT_LINE('更新件数:' || WK_CNT );

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
$if 1=1 $then
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
$end
END;
■ 関連する記事
Oracle : ディレクトリオブジェクト

■ 関連する Oracle ドキュメント
FOPENファンクション

タグ:Oracle
posted by at 2009-06-29 21:20 | スケルトン | このブログの読者になる | 更新情報をチェックする

2009年06月28日


設計書としての印刷フォーマットのサンプル

                           ** 得意先別商品別売上管理表 **    99/99/99    Z9頁
得意先 9999 J−−−−−−−−−−−−−−−−−−−−−−−J
     商品コード  商品名                                                     金額  商品区分
----------------------------------------------------------------------------------------------
商品分類 XXX J−−−−−−−−−−−−−−−−−−−−−−−J
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
     9999        J−−−−−−−−−−−−−−−−−−−−−−−J   ZZ,ZZZ,ZZ9  JJ
                                                                合計 ZZZ,ZZZ,ZZ9
                                                            得意先計 ZZZ,ZZZ,ZZ9



■ Excel によるサンプル
http://winofsql.sakura.ne.jp/doc/excel/print_spec.xls


posted by at 2009-06-28 12:29 | スケルトン | このブログの読者になる | 更新情報をチェックする

2009年06月26日


Form(サーバー送信)汎用スケルトン(4) : ファイルアップロード

■ 画面部分と処理部分を分割
■ ファイルアップロード処理の実装
■ アップロード後にリダイレクト
■ 処理を2会話に分けて、入力コントロール
<?
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
// 以下IE用
header( "P3P: CP=\"CAO PSA OUR\"" );

$MAX_SIZE = "500000";
$REDIRECT = "http://{$_SERVER["SERVER_NAME"]}{$_SERVER["PHP_SELF"]}";
$DISABLE_ATT = "disabled style='background-color:silver'";

foreach( $_GET as $Key => $Value ) {
	$_POST[$Key] = $_GET[$Key];
}
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}
foreach( $_COOKIE as $Key => $Value ) {
	$_COOKIE[$Key] = str_replace("\\\\", "\\", $Value );
	$_COOKIE[$Key] = str_replace("\\'", "'", $_COOKIE[$Key] );
	$_COOKIE[$Key] = str_replace("\\\"", "\"", $_COOKIE[$Key] );
}

// クッキーによる入力値の保存
if ( $_POST['outfile'] != '' ) {
	setcookie("outfile", $_POST['outfile'], time()+60*60*24*30 );
}
else {
	if ( $_COOKIE['outfile'] != '' ) {
		$_POST['outfile'] = $_COOKIE['outfile'];
	}
	else {
		$_POST['outfile'] = "text.dat";
	}
}

// 送信ボタン(submit) によって送られて来た場合
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

	if ( $_POST['send'] == '送信' ) {

		$Message = "POSTされました<br>\n";
	
		// ファイルへ入力されたデータを書き込み
		file_put_contents( $_POST['outfile'], $_POST['text'] );

		$disabled_head = "disabled style='background-color:silver'";
	}

	if ( $_POST['send'] == 'アップロード' ) {

		if ( $_FILES['MyUploadFile']['error'] == UPLOAD_ERR_OK ) {
			$upload_file = 
				realpath("./") . 
				DIRECTORY_SEPARATOR . 
				$_FILES['MyUploadFile']['name'];
	
			if ( move_uploaded_file(
				$_FILES['MyUploadFile']['tmp_name'], $upload_file ) ) {
				header("Location: {$REDIRECT}");
				exit();
			}
			else {
				$Message = "アップロードに失敗しました<br>\n";
				$disabled_head = $DISABLE_ATT;
			}
		}
		else {
			$Message = "アップロードに失敗しました<br>\n";
			$disabled_head = $DISABLE_ATT;
		}

	}

}

// HTTP 通信部分
if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
	if ( $_POST['target'] != '' ) {
		// ファイルを読み込み
		print file_get_contents( $_POST['target'] );
		exit();
	}
	else {
		if ( isset( $_POST['target'] ) ) {
			exit();
		}
		else {
			$disabled_body = $DISABLE_ATT;
		}
	}
}


require_once("view.php");
?>

view.php ( 画面部分 )
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />

<style>
* {
	font-size:30px;
}
</style>

<script
	src="http://www.google.com/jsapi"
	type="text/javascript"
	charset="utf-8"
></script>
<script type="text/javascript">

// Google で HOSTINGされているライブラリを使う
google.load("prototype", "1.6");

// *********************************************************
// フォームのチェック
// *********************************************************
function checkdata() {

	var str = $("text").value
	str = str.strip();

	if ( str == '' ) {
		alert("必須入力です");
		$("text").select();
		$("text").focus();
		return false;
	}

	if ( !confirm( "更新しますか?" ) ) {
		return false;
	}

	// サーバーへ送信
	return true;

}

// *********************************************************
// HTTP 通信
// *********************************************************
function getText() {

	file_name = $("outfile").value;

	// ■ サーバー側コードは get_text.php
	// ■ GET
	// ■ 同期処理
	// ■ target=filename
	// オブジェクト作成 = イベント作成です
	new Ajax.Request("<?= $_SERVER['PHP_SELF'] ?>",
	{
		method: "get",
		asynchronous: false,
		parameters: { "target" : file_name },

		onSuccess: function(request) {
			// 成功した事が保証される
		},
		onComplete: function(request) {
			$("text").value = request.responseText;
		},
		onFailure: function(request) {
			alert('読み込みに失敗しました   ');
		}
	}
	);
}

</script>

</head>
<body>

<input type=button value="初期画面" onClick='location.href="<?= $_SERVER['PHP_SELF'] ?>"'>
&nbsp;
<input type=button value="HTTP通信" onClick='getText();'>
<form
	name="frmmain"
	method="post"
	action="<?= $_SERVER['PHP_SELF'] ?>"
	onsubmit='return checkdata()'
>
出力ファイル名 
<input
	type=text
	id="outfile"
	name="outfile"
	size=40
	value="<?= $_POST['outfile'] ?>"
	<?= $disabled_head ?>
>
<br>
<textarea
	id=text
	name=text
	cols=80 rows=5
	<?= $disabled_head ?>
></textarea>
<br />
<input
	type=submit
	name=send
	value="送信"
	<?= $disabled_head ?>
> <?= $Message ?>

</form>

<form
	name="frmmain"
	method="post"
	action="<?= $_SERVER['PHP_SELF'] ?>"
	enctype="multipart/form-data"
>
<br>
	<INPUT type="hidden" name="MAX_FILE_SIZE" value="<?= $MAX_SIZE ?>">
	アップロードするファイル : 
	<INPUT
		name="MyUploadFile"
		type="file"
		style='width:400'
		<?= $disabled_body ?>
	>
	<INPUT
		type="submit"
		name=send
		value="アップロード"
		<?= $disabled_body ?>
	>
</form>

</body>
</html>

■ 関連する記事
Form(サーバー送信)汎用スケルトン
Form(サーバー送信)汎用スケルトン(2)
Form(サーバー送信)汎用スケルトン(3)

■ 関連する PHP ドキュメント
ファイルアップロードのエラーメッセージの説明


タグ:PHP
posted by at 2009-06-26 12:06 | スケルトン | このブログの読者になる | 更新情報をチェックする

2009年06月20日


Form(サーバー送信)汎用スケルトン(3) : クッキー

● HTTP通信の相手先を自分自身にしました。
● それに伴い、自分自身のパスを示す記述部分に $_SERVER['PHP_SELF'] を使用しています
● 書き込むファイル名を入力します
● クッキーにファイル名を記録します( 30日間 )
<?
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
// 以下IE用
header( "P3P: CP=\"CAO PSA OUR\"" );

foreach( $_GET as $Key => $Value ) {
	$_POST[$Key] = $_GET[$Key];
}
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}
foreach( $_COOKIE as $Key => $Value ) {
	$_COOKIE[$Key] = str_replace("\\\\", "\\", $Value );
	$_COOKIE[$Key] = str_replace("\\'", "'", $_COOKIE[$Key] );
	$_COOKIE[$Key] = str_replace("\\\"", "\"", $_COOKIE[$Key] );
}

// クッキーによる入力値の保存
if ( $_POST['outfile'] != '' ) {
	setcookie("outfile", $_POST['outfile'], time()+60*60*24*30 );
}
else {
	if ( $_COOKIE['outfile'] != '' ) {
		$_POST['outfile'] = $_COOKIE['outfile'];
	}
	else {
		$_POST['outfile'] = "text.dat";
	}
}

// 送信ボタン(submit) によって送られて来た場合
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

	$Message = "POSTされました<br>\n";

	// ファイルへ入力されたデータを書き込み
	file_put_contents( $_POST['outfile'], $_POST['text'] );

}

// HTTP 通信部分
if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
	if ( $_POST['target'] != '' ) {
		// ファイルを読み込み
		print file_get_contents( $_POST['target'] );
		exit();
	}
}

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

<script
	src="http://www.google.com/jsapi"
	type="text/javascript"
	charset="utf-8"
></script>
<script type="text/javascript">

// Google で HOSTINGされているライブラリを使う
google.load("prototype", "1.6");

// *********************************************************
// フォームのチェック
// *********************************************************
function checkdata() {

	var str = $("text").value
	str = str.strip();

	if ( str == '' ) {
		alert("必須入力です");
		$("text").select();
		$("text").focus();
		return false;
	}

	if ( !confirm( "更新しますか?" ) ) {
		return false;
	}

	// サーバーへ送信
	return true;

}

// *********************************************************
// HTTP 通信
// *********************************************************
function getText() {

	file_name = $("outfile").value;

	// ■ サーバー側コードは get_text.php
	// ■ GET
	// ■ 同期処理
	// ■ target=filename
	// オブジェクト作成 = イベント作成です
	new Ajax.Request("<?= $_SERVER['PHP_SELF'] ?>",
	{
		method: "get",
		asynchronous: false,
		parameters: { "target" : file_name },

		onSuccess: function(request) {
			// 成功した事が保証される
		},
		onComplete: function(request) {
			$("text").value = request.responseText;
		},
		onFailure: function(request) {
			alert('読み込みに失敗しました   ');
		}
	}
	);
}

</script>

</head>
<body>

<input type=button value="初期画面" onClick='location.href="<?= $_SERVER['PHP_SELF'] ?>"'>
&nbsp;
<input type=button value="HTTP通信" onClick='getText();'>
<form
	name="frmmain"
	method="post"
	action="<?= $_SERVER['PHP_SELF'] ?>"
	onsubmit='return checkdata()'
>
出力ファイル名 
<input
	type=text
	id="outfile"
	name="outfile"
	size=40
	value="<?= $_POST['outfile'] ?>"
>
<br>
<textarea id=text name=text cols=80 rows=15></textarea>
<br />
<input type=submit name=send value="送信"> <?= $Message ?>
</form>


</body>
</html>

■ 関連する記事
IE : フレーム内の別ドメインのクッキーを有効にする


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

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

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

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

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


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

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

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

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

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