2008年11月アーカイブ

選択されたラジオボタンによって、注釈コメントなどを変えたい場合のスクリプト。
この例では、Aがクリックされたら「Aが選択されました。」
Bがクリックされたら「Bがクリックされました。」と表示されます。

<head>
<style type="text/css">
#memo2 {
     display:none;
}
</style>

<script language=javascript>
function view(divId,divClass){
    var divs=document.getElementsByTagName('div');
    for(var i=0;i<divs.length;i++){
        if(divs[i].className==divClass){
            if(divs[i].id==divId) divs[i].style.display="block";
            else divs[i].style.display="none";
        }
    }
}
</script>
</head>

<body>
<input type="radio" name="option" id="option01" value="0" onClick="view('memo1','memoGroup')" checked /><label for="option01"> A </label>

<input type="radio" name="option" id="search_option02" value="1" onClick="view('memo2','memoGroup')" /><label for="option02"> B </label>

<div id="memo1" class="memoGroup">Aが選択されました。</div>
<div id="memo2" class="memoGroup">Bが選択されました。</div>
</body>
例えば検索条件を入力してもらう画面を作る場合
スペースで区切って条件を入力してもらう場合など
スペースを目印にして文字列を分割することになる。

最近作った例では、データベースから名前で検索する場合。
(このデータベースには、姓と名が分割されて登録されている。)

例えば、「田中 太郎」と入力があった場合
姓⇒田中、 名⇒太郎と分割したい。

その際に姓と名のフィールドを分けてしまう対応はあまりスマートではない。
他の条件で検索する場合に、またフィールドを増やさなくてはならないからだ。
ここでのポイントは、区切りスペースの位置。
そして、スペースはすべて半角に統一しておく。

//文字列の中にあるスペースをすべて半角スペースに変換
$search_key = str_replace(" ", " ", param["search_seimei"]);
//文字列の中からスペース位置を探す
$space_num = mb_strpos($search_key, " ");

if($space_num == "") {//姓名の間に空白がなかったら姓のみで検索
    $search_sei = $search_key;
    $search_mei = "";
    //検索対象変数
    $s_target = "sei";
} else {//姓名の間に空白があれば、姓と名に分割する
    $search_sei = mb_substr($search_key, 0, $space_num);
    $search_mei = mb_substr($search_key, $space_num, strlen($search_key));
    //前後の空白を取り除く
    $search_mei = trim($search_mei);
    //検索対象変数
    $s_target = "sei_mei";        
}//end if

switch ($s_target) {
  case "sei":
    //「姓」のみで検索のSQL
  case "sei_mei":
    //「姓・名」で検索のSQL
}//end switch





PEAR DBからMDB2へ

| コメント(4)
Smartyの問題が解消できたかと思ったら今度はPEAR DBも認識しなくなっていた。
ほんとに突然ナンなの?と思いつつ・・・PEARも自前でインストールすることに。

しかし、Smartyのようにうまくいかない・・・。
go-pear.phpを使ったインストールを試すもなぜか60%でストップ。
リロードしても60%・・・そこに何がいるんだよ!と
コードを見ても原因は分からず、違う方法を試すことにした。

ローカルでダウンロードファイルを解凍しアップすることに。
今回は緊急措置としてとりあえずPEAR DBだけ使えればいいので
個別にダウンロードして解凍・・・ここで注意!
なぜかLhacaやLhaplusなどの解凍ツールではうまく解凍してくれません。
そこで使ったのは、「解凍レンジ
これで解凍すると必要なすべてのファイルが出てきました。

これをSmartyと同じくlibsフォルダの中にpearフォルダを作ってその中にアップロード。
そしてすべてのDB.phpパスを変更し画面を確認。
動いているようだが、DBにコネクトしてくれない・・・なぜ(^^;)

それから1時間・・・。
PEAR DBをあきらめ、PEARのウェブサイトでも推奨されているMDB2を使ってみることにした。

MDB2をダウンロードし、同じく解凍レンジで解凍。

MDB2.phpとMDB2フォルダをlibs/pearフォルダにアップロード。
そして、コードを一部書き直して画面をリロード・・・。
おぉっと復旧しました! ハフゥ?(汗)


使用例は下記の通り。

//PEAR::MDB2 require_once('パス/libs/pear/MDB2.php'); $dsn="$dbtype://$user:$pass@$sv/$dbname"; $mdb2 = MDB2::factory($dsn); if(MDB2::isError($mdb2)){ echo "データーベース接続失敗"; }else{
echo "データーベース接続成功";
}//end if

while($row = $res->fetchRow(MDB2_FETCHMODE_ASSOC)){
$db_data[] = $row;
}//end while


基本的にはPEAR::DBとさほど変わらないが、コネクトと展開の書き方が違う。
$db = DB::connect($dsn);
       ↓
$mdb2 = MDB2::factory($dsn);

展開するときもDB_FETCHMODE_ASSOCから
MDB2_FETCHMODE_ASSOCに変わる。

PEAR::DBのマニュアルにも下記のようなメッセージがあるので今後のことを
考えるとその方がいいのかも・・・。

「This package been superseded by MDB2 but is still maintained for bugs and security fixes」(このパッケージの代わりにMDB2の使用が推奨されますが、バグの修正、セキュリティフィックスは引き続き行われます。)


今回は、ロリポサーバーには散々振り回された・・・。


メンテナンス終了後、突然エラーが発生したロリポップサーバー。
原因はどうもSmartyを認識していないようだ。

Smartyを使用したウェブは他のサイトも一斉にストップ。
おいおいそりゃないだろって(^^;)
すぐに原因が解消されない可能性が高いので
一時的に静的なHTMLサイトに可能な限り変更した。

で、パスが変わったのだろうか・・・。
散々試してみたが解消されず、時間だけが刻々と過ぎる。
結局自前でSmartyをインストールすることにした。
どちらにせよロリポのSmartyには勝手にPluginを追加できないので
調度いいかも・・・これからは制限を気にせずにできるし。

Smartyのダウンロードはこちら。

ダウロード後、解凍してできたSmartyフォルダを
適当なフォルダにアップすればいい。
一般的にはルートディレクトリにlibsというフォルダを作って
その中に入れることが多い。
もちろんインクルードする際のパスはそちらへ。

ただ今回のサーバー問題はこれだけでは終わらなかった・・・。


PHP5.3について

| コメント(0)
2008年内もしくは来年春には・・・ということでPHPが
5.3にバージョンアップされます。
かなり大幅なバージョンアップだそうで、PHP6への
大きなステップでしょうか。

今回拡張される機能はこちら。
・ラムダ関数とクロージャ
・名前空間(ネームスペース)
・goto構文の実装
・3項演算子の拡張(「?:」構文)
・ヒアドキュメント拡張(Nowdoc形式)

処理速度については、5?15%程度のパフォーマンスが向上するそうです。
その他、40項目を超えるバグフィックスなど・・・。

【ラムダ関数とクロージャ】
クロージャとは、簡単に言うとクラスと同じ使い方。
ただし名前を持たないので、外から呼び出せないもしくは継承できない。
簡易クラスというか・・・クラスとファンクションの間みたいな・・・。
とりあえず使ってみないと分かんないです(汗)

【名前空間(ネームスペース)】
名前空間・・・これは結構使えそう。
複数名での開発をしていると関数名がかぶることも・・・。
しかし、この名前空間を使うとそういった問題から解消されそうです。

例えば、クラス名に名前空間A::Bを付けると
インスタンス作成時にA::B::クラス名としないと認識されません。
なので同じようなクラス名になりそうでも
名前空間を設定しておけばそういった問題はなくなりそうです。

もちろん個性的な関数名にすればそれでいいんでしょうが・・・。
やっぱり後々使いまわすことを考えると分かりやすい名前にしたいですもんね。
後は名前空間だけころころと変えていけば、いろんな開発で
使いまわしやすくなります。

【goto構文】
goto構文はその名の通りで、いわゆるジャンプ機能です。
便利ではありますが、スパゲッティにならないよう最低限の
使用にしましょうということです。

【3項演算子】
新しい3項演算子「?:」について、これも便利そう。
今でもよく使っているのは、?:の間に文字が入るパターン。
例えば、こんな使い方をよくする。

$page = isset($_GET["page"]) ? $_GET["page"] : FIRST_ACT;

GETで取得した内容のページに飛ばすのだが
GETデータがなければ、FIRST_ACT変数にセットされた
ページを表示させる・・・など。

そして、今回の新しい3項演算子ではこんな使い方に変えられる。
$page = $_GET["page"] ?: FIRST_ACT;

GETデータが取得できたかどうかをisset関数などで判定する
必要がなくなるので、かなり楽。これは早く使いたい。

【ヒアドキュメント拡張(Nowdoc)】
Nowdoc形式のヒアドキュメントとは、今までの書き方とほぼ同じ。

今までのヒアドキュメントで書いた場合
$val = "海";
echo <<<EOF
天気がいい日は
{$val}に行きたい
EOF;

これを展開するとお察しの通り、
「天気がいい日は海に行きたい」と表示されます。

Nowdoc形式のヒアドキュメントで書いた場合
$val = "海";
echo <<<'EOF'
天気がいい日は
{$val}に行きたい
EOF;

これを展開すると・・・
「天気がいい日は{$val}に行きたい」と表示されます。

要するにそのまんま表示されるようになるということです。
なんのためにというと・・・エスケープが必要な文字を
いちいちエスケープさせなくてもいいよ。ということですね。

りんご \100」という文章であれば、\をエスケープする
必要がありますが、(\\100のように)Nowdoc形式で書けば
その必要がなくなります。

以上、PHP5.3 レポートでした。

なにより5?15%のパフォーマンス向上がうれしいかな。

今までimg要素のwidth、heightの属性は入れた方がいいと思っていました。
なくても普通に表示されますが、あった方が多少でも表示が速くなると考えていたので・・・。

しかし、最近の動向を見てみるとこの属性を入れない方がいいのではという
流れになりつつようです。

その理由としては、まず表示が速くなるとというレンダリングの問題は
ただの思い込みだったということ・・・もちろんNetscape Navigator 4.xくらいまで
さかのぼると入れなきゃ不具合が出るそうですが・・・もういいでしょ(^^;)

また、画像が表示されないときに、widthとheightが指定されていると、
指定したサイズからaltのテキストがはみ出すと、IEでは文字が切れて表示されます。

しかも100枚の異なる画像を表示させるという実験結果では、widht/height属性を与えた場合
と与えなかった場合において、微妙に属性がない方が速かったということです。
Web Designing誌2004年8月号の特集記事

ということで指定しなくても大丈夫というよりも
指定しない方がコーディングの手間も省けて
メリットが断然大きいようです。

PHPを使ってSmartyでページを表示させる際にwidht/height属性が
ちょっとうっとおしいなと思っていたのでかなりありがたい話題でした。


ウェブページ

★過去に製作したウェブサイト(一部紹介)
イビキノン
いびきでよく眠れない方のサプリ
日本トレーラーハウス協会
トレーラーハウスの協会(JTHA)
トレーラーハウスデベロップメント
トレーラーハウスの製造・販売 シュミレーションゴルフのレンタル スクリーンゴルフのレンタル
健楽ショップ 【ボイスリッチEX】
声が出にくい症状の方に朗報
早稲田大学 スキー部
2007年 インカレ総合優勝!
NPO体験学習支援センター
ブナの植林100年計画実行中
AJC油汚染研究所
油ゲル化剤オイルフェンスの販売
ジャズシンガー 奥土居美可
NYで絶賛されたジャズボーカル