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

2013年11月28日

PHP : file_get_contents と file_put_contents

PHP の簡易ログとしては file_put_contents が使われますが、表現方法をいろいろテストして行くと、PHP のバージョンを 5.4.0 以上にして json_encode を使いたくなります。

file_get_contents による比較的小さなファイルのダウンロード

デバッグ利用 : file_put_contents ( string $filename , mixed $data );

左右対称のような関数ですが、実際は実装された時期は同じではありませんでした。読み込みは http プロトコルがサポートされるので、早くから導入され使われています。

遅れて、file_put_contents が実装されましたが、この二つの関数を使う場面は思った以上にに多く、これらの例のような使い方をする事も多いかと思います。



posted by at 2013-11-28 19:54 | PHP | このブログの読者になる | 更新情報をチェックする

2013年11月27日

PHP+MySQLの考えられる最もシンプルなソースコード

MySQL 関数は、この拡張モジュールは PHP 5.5.0 で非推奨になっていますが、一般のレンタルサーバーで浸透するのはまだ先の話だと思います。( さくらインターネットの最新バージョンは、5.4.17 )

mysql_fetch_array は、連想配列、添字配列、両方として結果の行を取得します。

@mysql_connect の @(エラー制御演算子) は、付けないと接続エラーの時に PHP がワーニングを出力します。
exit は、言語構造なので exit; exit(); exit(0); 等、いずれでも動作します。
( die は、exit と同等です )

MySQL関数
<?php
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 = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'password';

// 接続
$connect = @mysql_connect( $server, $user, $password );
if ( !$connect ) {
	print "接続エラーです";
	exit();
}

// DB選択
mysql_select_db( $dbname, $connect );

// クエリ
$result = mysql_query("select * from 社員マスタ", $connect);
if ( !$result ) {
	die('Invalid query: ' . mysql_error());
}

// 列数
$field_count = mysql_num_fields( $result );
$count = 0;
print "<table>\n";
while ($row = mysql_fetch_array($result)) {
	print "<tr>\n";
	print "\t<td>" . ($count + 1) . "</td>\n";
	for( $i = 0; $i < $field_count; $i++ ) {
		print "\t<td>{$row[$i]}</td>\n";
	}
	print "</TR>\n";
	$count++;
}
print "</table>";

// メモリを開放ですが、通常は必要ありません
mysql_free_result($result);

// 接続解除
mysql_close($connect);
?>


mysqli クラス と mysqli_result クラス
<?php
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 = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'password';

// 接続
$connect = @ new mysqli($server, $user, $password, $dbname);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}

// クエリ
$result = $connect->query("select * from 社員マスタ"); 
if ( !$result ) {
	// 開放
	$result->close();
	die('Invalid query: ' . mysql_error());
}

// 列数
$field_count = $connect->field_count;
$count = 0;
print "<table>\n";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {
	print "<tr>\n";
	print "\t<td>" . ($count + 1) . "</td>\n";
	for( $i = 0; $i < $field_count; $i++ ) {
		print "\t<td>{$row[$i]}</td>\n";
	}
	print "</TR>\n";
	$count++;
}
print "</table>";

// 開放
$result->close();

// 接続解除
$connect->close();
?>

関連資料

mysqli クラス
mysqli_result クラス

SQLServerPostgreSQL

関連記事

管理者として実行を強制し、ANHTTPD を実行し、MySQLサービスを起動し、エクスプローラで ANHTTPD のディレクトリを開け、ブラウザで、ANHTTPD の仮想ディレクトリを開くスクリプト


posted by at 2013-11-27 11:07 | PHP+DB | このブログの読者になる | 更新情報をチェックする

2013年11月24日

PHPでZIP圧縮 : phpMyAdmin の zip.lib.php を使う方法を 2006/08/03 に調べて記事書いてから、7年も経ってました。

こちらがその時の記事で、これはこれでそのままです。

今回 最新環境で動作確認しました。phpMyAdmin の当時のバージョンは 2.9.0 でしたが、今回は 4.0.9 です。そもそも、phpMyAdmin のライセンスは GNU GENERAL PUBLIC LICENSE Version 2 とあるのですが、今回コードを見たら単純に読み込んだら使え無いようになってました。

define("PHPMYADMIN", true);

こんな記述が必要です(zip.lib.php側でチェックを削除すればいいんですけど)。また、現在は file_get_contentsfile_put_contents があるので、簡単に記述できる上に他のサーバから読み込む事もできます。その場合は、Content-Length を取得するのに cURL 関数の処理が必要になります。

関連する記事

PHP : 指定ファイル名でダウンロード 『application/octet-stream』 と 『Content-disposition: attachment』

あと、このクラスはファイル単位でしか書庫化できません。フォルダごと行いたい場合は、やはり PEAR の File_Archive を使う必要があります。
<?php
$sep = substr( strtoupper( php_uname("s") ), 0, 7 ) == 'WINDOWS' ? ";" : ":";
set_include_path( ".$sep../pear/zip" );

require_once "File/Archive.php";

$files = array(
	 "../dotonet/RenameMdbTable"
);

$dest = File_Archive::toArchive("vbdotnet_RenameMdbTable.zip", File_Archive::toOutput() );

$dest->newFile("hanbaib.mdb"); 
$v = file_get_contents( "../upload_excel_mdb/hanbaib.mdb" );
$dest->writeData( $v ); 

File_Archive::extract( 
	$files, $dest
); 

?>

※ RenameMdbTable はフォルダです

で、zip.lib.php ではこうなります。
<?php
define("PHPMYADMIN", true);
require_once('zip.lib.php');

// 圧縮するファイル
$filename1 = 'mondai1.xlsx';
$filename2 = 'mondai2.xlsx';

// クラス作成
$zipfile = new zipfile();

// 追加
$zipfile->addFile( file_get_contents( $filename1 ), $filename1 );
$zipfile->addFile( file_get_contents( $filename2 ), $filename2 );

// zip をバイナリで変数にセット
$zip_buffer = $zipfile->file();

// ファイルに変数から書き込む
file_put_contents( "test.zip", $zip_buffer );

// メモリからダウンロードさせる
header( "Content-Type: application/octet-stream" );
header( "Content-disposition: attachment; filename=test.zip" );
header( "Content-Length: " . strlen($zip_buffer) );

// 処理終了
print $zip_buffer;
?>

test.zip をファイルとして書き込むと同時にブラウザでダウンロードさせています。


posted by at 2013-11-24 02:06 | PHP | このブログの読者になる | 更新情報をチェックする

2013年11月23日

「HTMLモード」と「PHPモード」という言葉

当然、<? 〜 ?> を PHPモードと呼び、その外側を HTMLモードと呼びます。HTML モードはそのまま出力されるので、ベースが HTML のように感じますが、PHP モードがベースで、その外側は全て print されているのが、ASP や PHP の考え方です。

で、この「HTMLモード」や「PHPモード」という言葉は昔から使っているので、あらためてどこで使われているのか探したところ、HTMLモードがなかなかみつからずに少し時間かかりましたが、以下に見る事ができました。

PHP: コメント - Manual

実際問題、明確に定義された言葉ではなさそうですが、初心者に説明する場合には、こういうワードは結構重要になって来るものです。



posted by at 2013-11-23 00:42 | PHP | このブログの読者になる | 更新情報をチェックする

2013年11月22日

DAZ3D : SFファンタジー的、女主人公『侵入シーン』

最初は背景構築してただ立っているポーズだったのですが、あたりの気配を感じつつ、ゆっくりと移動するシーンです。



いずれもカメラ位置を変えただけですが、動いている連続シーンのようにも見えます。

▼ クリックして拡大表示してから、左右の矢印キーでシーンの移動が可能です


フィギュアの立ちポーズは、胸を張るのがコツです。ですから、本体を回転させて立ちバランスを取る事になります。あと、首と頭で下向きかげんにして、目を上向きにするとかっこよくなります。



▼ この左手の甲の骨格が突っ張ったところがうまく出来ました。



要するに、フィギュアが優秀なだけなんですけれど。



posted by at 2013-11-22 18:39 | DAZ3D DAZStudio イラスト 2013 | このブログの読者になる | 更新情報をチェックする

2013年11月21日

やはりスズメがかわいい

うちは結構田舎なのか、青サギ、鴨、カラス、鳩、スズメが近くの田んぼ周辺で生活しています。その中でも特に群れでよくみかけるのがスズメ。良く見るとこの動画よりはるかに太っていたりします。スズメは敏感で、鳩はかなりバカで背中をたたいた事もあります。おふくろは、スズメに餌をやって喜んでたりしますが、ここらへんのスズメは100羽くらいが集団で居てたりするので・・・・

飼うと結構長生きするらしいですね



posted by at 2013-11-21 13:55 | 写真・動画 | このブログの読者になる | 更新情報をチェックする

2013年11月18日

MVC と WEBデザイナーさんの憂鬱(2)

お返事いただいたのでもう一回頑張ってみました。

>ModelやControllerのPHPも読めないと作業になりません。
デザイナーさんにこれを求めるのは酷です。ご苦労をお察しします。

そもそも、CakePHP を使っている時点で、プログラマも自分のコードがどういう影響を VIEW に与えるか解っていない可能性があります。

まず、Ajax のお話ですが、jQuery で呼び出す相手先が 通常PHP になります。何が返されるかは、プロジェクトの仕様によって自由ですが、理想的なものは JSON 文字列です。しかし、その場合は jQuery 側で JavaScript のオブジェクトに変換して、VIEW 内の要素に対してなんらかの変更を加える為のデータとする必要があります。

ここはもう、全くプログラマの領域です。

$.get(url)
.done(function(data){
   成功した時の処理
});

これが最もシンプルな jQuery の ホスト呼び出しですが、data が php の返した内容です。ここでは成功したかどうかはあまり重要ではありません( 成功したという前提の処理です / ただ、 インターネットを介した物理的な呼び出しは成功していても、PHP内部での論理的な処理は失敗しているかもしれません )

たいていの場合この data が VIEW を構成する部品となっていますので、

1) このデータのフォーマット
2) このデータをどう扱うか
3) このテータをどこに使うか

という設計書がなければ、プログラマでも何もできません。まして、デザイナーさんがここを読み解くなんて想像もできません。

とは言え。

この部分を勉強なされて、読めるぐらいになれば、これからの世の中にとって貴重なハイブリッドのデザイナーさんになれるのは間違い無いと思います。
ここまで書いて、『まず、Ajax のお話ですが』と書き出してしまっているのに気づいて、二つ目頑張りました。
>PHPで出力しているからデザイン加えるのは無理
要素の成り立ちを変更するのはおそらく無理かもしれません。例えば TABLE 要素で一覧形式で出力されている場合、DIV 等に変更は無理です。

しかし、要素にクラスが設定できるとは思うのですがプログラマのレベルに依存します。

後は、 CSS でどうにかするしかありません が、その場合 jQuery は威力を発揮します。jQuery でどこまでやってもいいかというプロジェクトのルールにもよりますが、プログラマに全てを委ねるのならば、その表示部分を総入れ替えする事も可能は可能です。

ただ、業界的に言うと、JavaScript を使ってそこまでできる人材は少ないと思われます。ですから『無理』のボーダーラインを誰がどうやって見極めるかが最終判断の分かれ目です。

それと。

現実的には、JavaScript で画面を作成する事は最低限に留めておかないと、本番での責任の所在が問題になってしまいますので、そこはうまく避けて通る必要があると思います。
WEB で出来る事が際限なく増えていく中で、それを全てマスターなんでできない現状を世の中というモンスターは現実をどう受け止めていくんでしょうね。 関連する記事 MVC と WEBデザイナーさんの憂鬱
posted by at 2013-11-18 20:18 | システム開発 | このブログの読者になる | 更新情報をチェックする

2013年11月15日

jQuery + Zoomooz.js + Jcrop / つまり画像の部分選択してそれを拡大表示する

Jcrop は結構面倒です。使い方が限られているわりに、実装が完成されていないので Jcrop の サンプルコードを使いまわすしか無いような気がします。

※ Google Chrome の場合、拡大しても解像度が低い場合があります。

▼ 大きい画像上をドラッグしてトリミングします( その後小さい画像をクリックして拡大 )


▼ 上の小さなサムネイルをクリックして拡大します。( 拡大した結果 )


関連する記事

使い方が微妙ですが、改造するともっと面白くなるはずの jQuery プラグイン 『Zoomooz.js』

jQuery プラグイン : Zoomooz.js の使いどころ



posted by at 2013-11-15 23:30 | jQuery | このブログの読者になる | 更新情報をチェックする

使い方が微妙ですが、改造するともっと面白くなるはずの jQuery プラグイン 『Zoomooz.js』

さて、Zoomooz.js です。画像で使うのがインパクトあると思います。

▼ クリックすると・・・



どうも、Shdowbox と相性悪いみたいです。見せ方を別々のライブラリで混合はやめたほうがよさそうです。

一番のメリットは、最大解像度の画像を縮小表示しているものを対象とした場合、拡大時にオリジナル解像度で画像が利用されるところです。ただ、JavaScript の環境は複雑怪奇なので、そのメリットが発動しない場合もあるのが・・・難点です。( 特に、Google Chrome と相性が悪く、IE が一番相性いいです )

Shadowbox の利点は、逆に小さな画像をサムネイルとして使用するので、ページ表示時には大きな画像をロードする必要が無いところです。ですが、当然大きい画像を表示しようとすると、レスポンスは悪く、ほんの少し待つ事になります。

Zoomooz.js は、うまくすれば画像の部分的な拡大でじっくり見れるようにできるかもしれません。ただ、Zoomooz.js だけでその機能はなさそうなので、トリミング等のライブラリを探す必要がありそうです。
<script type="text/javascript">
if ( window[window.location.hostname+'.loadZoomooz'] !== true ) {
	window[window.location.hostname+'.loadZoomooz'] = true;
	if ( !window.jQuery ) {
		document.write("<"+"script src=\"//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js\"></"+"script>");
	}
	document.write("<"+"script src=\"http://winofsql.jp/jquery/plugins/zoomooz/jquery.zoomooz.min.js\"></"+"script>");
}
</script>
<pre>
▼ クリックすると・・・
<img
	id="img"
	class="zoomTarget"
	src="https://lh3.googleusercontent.com/-ulnfI0dn2Sg/UiXUpNDBy3I/AAAAAAAAQE8/XDo4nrrauFc/s1200/Hitomi_Dragon_Rider2.jpg"
	style="border: solid 0px #000000;width:600px;"
	data-targetsize="1.2"
	data-closeclick="true"
>
</pre>
ライブラリのロードは、ブログの記事部分でロードする事を想定しています。これですと、二回以上実行されても最初しかロードされません。

jQuery は、Google のホスティングを使っているのでこのまま利用できますが、jquery.zoomooz.min.js はダウンロードして自サイトへ保存して使っています。サイトをお持ちで無い方は、Google ドライブの WEB ページを使えばいいと思います。

Google ドライブを使って WEB ページを公開する手順
( テストしてみました。https://googledrive.com/host/0B9Jymqpro6gSVlB5Wm52U29wTlE/jquery.zoomooz.min.js で使えています )

ズーム用の属性

もちろん、JavaScript で対象要素をズームできるようにはできますが、要素に書いたほうが簡単です。
1) class="zoomTarget"
2) data-targetsize="1.2"
3) data-closeclick="true"
1) は、ズーム対象とする場合にセットするクラス名です( zoomTarget は固定です)。 2) は、ズームした時に親要素( デフォルトでは document.body のようです ) の表示領域に対する倍率です。説明では、1.0 までとありますが、はみ出る事を目的とするなら 1.0 より大きくてもかまいません 3) は、zoomTarget をクリックした時に閉じるかどうかです。これをしておかないと画面いっぱいに画像を表示してしまったら閉じる事ができなくなります。( 通常は zoomTarget 以外をクリックすると閉じるようになっています ) この画像は、オリジナルサイズは横幅が 1200px あります。それを width:600px で縮小表示しています。通常は、うまく最大解像度の状態で拡大して表示されるはずですが、Google Chrome で時折うまくいかない時があるようです。
posted by at 2013-11-15 01:18 | jQuery | このブログの読者になる | 更新情報をチェックする

2013年11月14日

MVC と WEBデザイナーさんの憂鬱

Google+ のコミュニティで質問されていたので頑張って返答しました。結構長文になったのでこちらに持って来ました。

--------------------------------------------------

>ViewにはどこまでPHPのコードを書いてよいのでしょうか?
仕様では無いのでそのような決まりはありません。プロジェクトのえらい人が決める事ですが、どんな場合にでも例外はあります。

>PHPがHTMLに食い込みすぎていて
既にプログラマ側がルールを設けていない事を読み取れます。つまり、あなたのほうでプログラマの邪魔にならないようにしておられる気配りが感じられます。ですが、これに関してはそのコードに関する責任者と話し合ったほうがいいと思います。その話し合いの為に必要な知識を求めておられると判断致します。

当たり前の事ですが、基本的には HTML・CSS 部分のみを見つめて下さい。その際気になると思われるのが、PHP の変数埋め込み部分です。

<?= $value ?>

または、

<?php function() ?>

といった部分です。ここは、たいていにおいて HTML の中に埋め込まれているので、MVC において普通に使われるものです。ですが、この場合、$value  の中が全て HTML の場合もあります。そういったものは、MODEL の位置付けとなる、関数またはメソッドの中で生成されています。

次に気になるのは、条件が記述されている部分です。

<?php if ( condition ) {  ?>
ここに HTML
<?php }  ?>

この部分がもし存在する場合は、デザイナーとしてはお手上げです。話合いによる確認が必要です。

MVC は、本来デザイナーが混乱しないで済むようにプログマー側が認識するべきルールを旗揚げして守る事によって効率やメンテナンス性を上げる事が目的だと思います。ですから、デザイナーが混乱する時点でその意図が中途半端であると思われます。これらは、話し合いで好転させるしか無いとも思いますが、そうそう完全に切り分けれるものでもありません。

>JSのAjaxも使っていて、クライアントサイドとサーバサイドの区別がますます難しく

Ajax と呼称される技術の守備範囲はあくまでクライアント側です。サーバーサイドにデータがあるのは事実ですが、VIEW 内で管理されるテクノロジーです。

ですが。

そもそも、デザイナーとして JavaScript を書かなければならないという事実があるのならば、MVC における VIEW とはかけはなれた守備範囲になります。JavaScript は完全にプログラマーの守備範囲で、デザイナーは要素とその位置と CSS による装飾を設計するという立場になると思います。

つまり、誰か偉い人が能力に合わせて管理しながら旗を振ってくれないと、MVC なんてものは意味が無く、個人が勉強して苦労するしかいいものは作れないというのが現実です。

悲しいですけれど。


関連する記事

MVC と WEBデザイナーさんの憂鬱(2)



posted by at 2013-11-14 18:23 | システム開発 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

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

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

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

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


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

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

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

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

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