SQLの窓

2017年04月15日


PHP の関数で規定されているキャッシュコントロールの無効 : session_cache_limiter( 'nocache' )

session_start() を実行しないと有効にならないので、セッションが必要無い場合は header を直書きすればいいと思いますが、セッションを有効にしても損は無いので以下のようにとておくと簡単です。

session_cache_limiter
<?php
session_cache_limiter('nocache');
session_start();
?>


header を直接書くと以下のようになります
<?php
header( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
header( "Pragma: no-cache" );
?>

▼ 以下は、Cache-Control の値についての解説です
HTTP キャッシュ
「no-store」はもっと単純です。返されたレスポンスのバージョンにかかわらず、ブラウザのキャッシュやすべての中間キャッシュはそのレスポンスを一切格納できません。たとえば、個人の機密データや銀行データが含まれているレスポンスなどです。ユーザーがこのアセットをリクエストするたびに、リクエストがサーバーに送信され、完全なレスポンスが毎回ダウンロードされます。
※ 一部引用
posted by lightbox at 2017-04-15 15:02 | PHP + 特記事項 | このブログの読者になる | 更新情報をチェックする

2017年04月11日


PHP : ${'日本語表示'} という可変変数と、${hello . "X"} という連結可変変数

※ hello という定数が無いという通知が出る環境では、error_reporting 関数で抑制できます
※ 結果が PHP の認識できる文字列であればいいので、"hello" . (10 * 4) もありです。
※ PHP の可変変数

以下のコードは全て正しく動作しますが、最後の連想配列を除いて、変数名を可変で表現する可変変数のサンプルです。

PHP が変数として許している文字は制限がありますので、$2011/07/08 と言う変数はエラーになりますが、${'2011/07/08'} という変数は正しく動作します。
JavaScript で var a = {}; a["2017/01/01"] = "001"; として、参照が a.2017/01/01 ができないのと同様で、JSON を PHP 内で変換して使う時にも意識するといいです
つまり、日本語を変数として使いたい場合は、${'日本語表示'} という書き方で確実に使える事になります。 日本語は、その構成文字が「キャラクタセット」によって変わるので、どの文字が実際 PHP で変数として使えるかどうかは、はっきり言えませんが、実際使えるものもたくさんあります。しかし、確実では無いので${'日本語表示'}という表現は選択肢のうちの一つです。 また、PHP のマニュアルの投稿内容にありましたが、${文字 . "文字列"} という書き方が何故か正常に動作します。
<?php
error_reporting(E_ALL ^ E_NOTICE);

// $a に値をセット
$a = 'hello';

// $a を変数名として利用
${$a} = 'world (1)';

// world (1) が表示されます
print $hello . "<br>";


// ★ もう少し複雑な場合(1)

// $b[1] に値をセット
$b[1] = 'hello';

// $b[1] を変数名として利用
${$b[1]} = 'world (2)';

// world (2) が表示されます
print $hello . "<br>";


// ★ もう少し複雑な場合(2)

// $c に値をセット
$c = 'hello2';

// $c を変数名として利用
${$c}[1] = 'world (3)';

// world (3) が表示されます
print $hello2[1] . "<br>";


// ★ 文字列の接続

${hello . "X"} = 'world (4)';

// world (4) が表示されます
print $helloX . "<br>";


// ★ エラーにならない特殊な変数
// ※ $2011/07/08 という変数は作れません

$d = '2011/07/08';
${$d} = 'world (5)';

// world (5) が表示されます
print ${'2011/07/08'} . "<br>";


// ★ 日本語変数
// キャラクタセットによって、PHPが使える文字なら
// $日本語表示 でもエラーにはなりません 

$e = '日本語表示';
${$e} = 'world (6)';

// world (6) が表示されます
print ${'日本語表示'} . "<br>";

${'日本語表示'} .= " 追加OK";
print $$e . "<br>";

// ★ 連想配列による日本語表現

$f['日本語表示'] = 'world (7)';

// world (7) が表示されます
print $f['日本語表示'] . "<br>";

?> 




posted by lightbox at 2017-04-11 15:22 | PHP + 特記事項 | このブログの読者になる | 更新情報をチェックする

2017年02月28日


cp932 の SQLServer に対して、PHP の ODBC 関数に対して UTF8 変換で地道に対応し、特殊なUncode文字は、HTML 数値エンティティで保存する。

Microsoft のドライバで自動的に対応させる方法もありますが、かつて切り替え時期に Microsoft 純正を使ってえらい目にあった経緯があり、全て SHIFT_JIS で現在も運用していますが、jQuery の ajax を使用するに当たってどうしても通信部分は UTF-8 になるため、以下のようにしています。

また、国際化のためどうしても SHIFT_JIS に無い文字に対応する必要も出てきました。

まず、以下のソースは SHIFT_JIS で書かれており、mb_convert_encoding が不可欠なので、先頭で内部コードを UTF-8 に設定しています。
<?php
mb_internal_encoding("UTF-8");
require_once( "../db.php" );

// *************************************
// キャラクタセット
// *************************************
header( "Content-Type: application/json; charset=utf-8" );
// *************************************
// キャッシュ無効
// *************************************
session_cache_limiter('nocache');
session_start();

// ajax の為、入力値は UTF-8
foreach( $_POST as $Key => $Value ) {

	if ( $Key == "name" || $Key == "name2" ) {
		$_POST[$Key] = mb_encode_numericentity( $Value, array(0x0, 0x2FFFF, 0, 0xFFFFF) );
	}
	else {
		$_POST[$Key] = mb_convert_encoding( $Value, "cp932", "UTF-8" );
	}
}

// *************************************
// 処理
// *************************************
$SQL = new DBSS( $COMMON_DB, "sa" );

$query = "update SQLServerのテーブル set";
$query .= " 姓 = '{$_POST["name"]}'";
$query .= " ,名 = '{$_POST["name2"]}'";

$query .= " where 番号 = {$_POST["no"]}";


$_POST['query'] = $query;

$ret = $SQL->Execute( $query );

if ( $ret === false ) {
	$_POST['status'] = 0;
}
else {
	$_POST['status'] = 1;
}


// *************************************
// PHP の結果を result キーで
// JSON としてブラウザに返す
// *************************************
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = mb_convert_encoding( $Value, "UTF-8", "cp932" );
}
print json_encode($_POST);

?>

この処理は、jQuery から呼び出された更新処理です。name と name2 に、HTML 数値エンティティに変換すべき文字列が入っています。全て変換する必要は無いのですが、SHIFT_JIS と Unicode の云々の詳細を省く為に array(0x0, 0x2FFFF, 0, 0xFFFFF) となっています。

0x0 〜 0x2FFFF : オフセット 0、マスク 0xFFFFF

ここでは、サンプルとしてのコードなので、入力文字列が name と name2 しかないので、mb_convert_encoding( $Value, "cp932", "UTF-8" ) が実行されませんが、一般的な SHIFT_JIS の文字列のデータに対して必要です。

print する場合は、jQuery の中に戻るので、再度 UTF-8 に変換する必要があります。

以下は同様の処理で、読み出すだけのコードです。
<?php
mb_internal_encoding("UTF-8");
require_once( "../db.php" );

// *************************************
// キャラクタセット
// *************************************
header( "Content-Type: application/json; charset=utf-8" );
// *************************************
// キャッシュ無効
// *************************************
session_cache_limiter('nocache');
session_start();

// ajax の為、入力値は UTF-8
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = mb_convert_encoding( $Value, "cp932", "UTF-8" );
}

// *************************************
// 処理
// *************************************
$SQL = new DBSS( $COMMON_DB, "sa" );

$query = "select * from SQLServerのテーブル where 番号 = {$_POST["no"]}";
$column = $SQL->QueryEx( $query );

if ( $column ) {

	foreach( $column as $Key => $Value ) {
		$fld = mb_convert_encoding( $Key, "UTF-8", "cp932" );

		if ( $Key == "姓" || $Key == "名" ) {
			$column2[$fld] = mb_decode_numericentity( $Value, array(0x0, 0x2FFFF, 0, 0xFFFFF) );
		}
		else {
			$column2[$fld] = mb_convert_encoding( $Value, "UTF-8", "cp932" );
		}

	}


	$_POST['exist'] = 1;
}
else {
	$_POST['exist'] = 0;
}


// *************************************
// PHP の結果を result キーで
// JSON としてブラウザに返す
// *************************************
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = mb_convert_encoding( $Value, "UTF-8", "cp932" );
}
$_POST['data'] = $column2;
print json_encode($_POST);

file_put_contents("debug.log", print_r($_POST, true));

?>

ここで、一番重要なのは、HTML 数値エンティティ を mb_decode_numericentity で元の文字列に戻す事です。これでブラウザから貼り付けれる文字であれば、DB には HTML 数値エンティティ で保存されて、表示すると元に戻るはずです。

※ ただ、DB 側の列の文字列サイズがかなり大きくなります。

ちなみに、Excel への変換は、IE を使用してブラウザからの Excel オフジェクト呼び出しでまかなっています。
▼ 
IE11 で VBScript を使う場合の注意事項 ( 古い社内アプリ移行時必見 )


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

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

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

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

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


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

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

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

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

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

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

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり