2009年07月03日


prototype.js の Ajax.Request を使い、FORM を使わずにデータをPOSTする

MSXML2.XMLHTTPでファイルをPOSTする と同系列で、IE で実行する場合、結局prototype.js内では
MSXML2.XMLHTTPを使っています。VBScriptで通常のアプリケーションとして実行する
場合と違って、同一ドメイン内でのみ実行可能です。
<?
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" );

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] );
}

if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

	// ファイルへ入力されたデータを書き込み
	file_put_contents( "text.dat", $_POST['text'] );
	print "データはUTF-8で受信しています";
	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");

// *********************************************************
// HTTP 通信
// *********************************************************
function postText(text) {

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

		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='postText($("text").value);'>
<br>
<textarea id=text name=text cols=80 rows=15></textarea>


</body>
</html>

■ 関連する記事
prototype.js の Ajax.Request の encoding パラメータ


posted by at 2009-07-03 15:31 | Comment(0) | クライアント/サーバー | このブログの読者になる | 更新情報をチェックする

2009年07月02日


MSXML2.XMLHTTPでファイルをPOSTする

MSXML2.XMLHTTPでファイルをアップロードする と対になる処理です。
受けるほうは通常と同じで簡単ですが、
送るほうは注意すべき点がいくつかあります

まず、送るほうでは日本語を URL エンコードする必要があるので、
JavaScript を呼び出して encodeURIComponent を使用しています。
( その為、PHP ではデコードされると UTF-8 になるので注意 )

後、http で POST する際の仕様として、http ヘッダに Content-Type として
application/x-www-form-urlencoded をセットしています
( データサイズは実際ブラウザが行っているのでセットしています。)

VBSCript 側
<JOB>

<SCRIPT language=JScript>

function js(str) {

	return encodeURIComponent( str );

}

</SCRIPT>

<SCRIPT language=VBScript>


' XMLHTTP を作成
Set objHTTP = CreateObject("MSXML2.XMLHTTP")

Call objHTTP.Open("POST","http://localhost/php/090702/post.php",False)
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
strData = "text=" & js("日本語をURLエンコードする")
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
Call objHTTP.Send(strData)
Wscript.Echo objHTTP.responseText


</SCRIPT>

</JOB>

PHP 側
<?
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" );

mb_language( "ja" );
mb_internal_encoding("euc-jp");

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] );
}

if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

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

	// ファイルへ入力されたデータを書き込み
	file_put_contents( "text.dat", mb_convert_encoding( $_POST['text'], "shift_jis", "utf-8" ) );

	print "POST処理を受付ました";

}

?>

■ 関連する記事
WSH : VBScript から JavaScript の呼び出し
MSXML2.XMLHTTPでファイルをアップロードする
prototype.js の Ajax.Request を使い、FORM を使わずにデータをPOSTする

■ 関連するMicrosoftドキュメント
XMLHTTPを使用して2バイト文字を含むFormデータを送信する


posted by at 2009-07-02 16:52 | Comment(0) | クライアント/サーバー | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

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

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

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

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


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

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

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

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

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