忍者ブログ
研究室生活のメモ・・・だった過去の遺産。移転先→http://negimochix2.blogspot.com/
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ちょっと前の話になるんだけど、
もう忘れてしまいそうなのでメモっておく。

この間、研究室の業績サーバを移行する仕事をしていた。
以前より構築済みの環境は、

言語:php4.1.x
データベース:PostgreSQL7.1.x

まあ、単にサーバのPCさんの調子が微妙だったので、この際移行してしまおうということだった。
研究室だけでの閲覧に限られていたので、別にセキュリティを強固にするわけでもない。
新しく作った環境は、

言語:php5.2.x
データベース:PostgresSQL8.3.x
(ちょっと、細かいバージョンの数字は忘れた)

PHP4とPHP5はかなり内容に違いがあり、移行時に問題があることは知っていた。
でも、そのほとんどはクラスに関係したもだ。
すでに構築済みのphpはクラスを使っていない単純な構成だったので、移行時の障害にはならないと思っていた。
データベースは下位互換あるらしいし。


でも、実際やってみると、うまくいかなかったので、問題のあるソースをだどって行くと・・・

postしてるのに、$_POSTの記述がどこにもない

ことに気づく。
どうやら、前回のサーバでは、php.iniの設定を
register_globals = on
としていたらしい。

register_globalsがonだと、
print $_POST["hoge"];
と書くべきところを、
print $hoge;
と簡略化できる。
register_globalsは、4.1まではデフォルトでon、4.2以降はoffになっている。
つまり、今回のサーバ移行で起きた問題は、phpソースがregister_globalsをonにしていることを前提としているのに、register_globalsをoffに設定していたのが原因らしい。

問題解決。
でも、そもそも、register_globalsがデフォでoffになったのは、セキュリティ的に危険であるため。
今後、PHP6ではregister_globalsが廃止され、省略表記は不可になるらしい。
>>Register globals - GeeklogJpWiki

じゃあ、今のphpもoffで使える仕様に変更しないとまずいかもね?
また、移行の話がでたとき困るし・・・

ま、いいかwそのときの後輩がなんとかしてくれるさ。きっと。

PR
SmartyはPHPによるテンプレートエンジン.

- Smartyの考え方 -
WebページってHTMLとかPHPとかSQLとかいろんな言語が1つのファイルに書いてあってカオスwww
つーか,デザイン担当とロジック担当が違ったら大変すぎるよな.
・・・じゃあ,最初からデザインとロジックでファイルを分けりゃいいんだ!


こんな感じ.
Smartyの実体はPHPによって書かれたクラスファイル.
よって,PHPが使える環境であればどこでも使える.
レン鯖であっても,

公式:http://www.smarty.net/

のdownloadからDLしたディレクトリを丸ごとうpすればいい.
しかし,その場合,セキュリティ対策は必要.

以下に例.

▼owata.php
<?php
require_once 'config/config.inc.php';  // ここにディレクトリ場所とかdefineされてる
require_once _DIR_SMARTY_LIBS . 'Smarty.class.php';

$smarty->Smarty();
// Smartyのディレクトリ設定
$smarty->template_dir = _DIR_SMARTY_TEMPLATES; // templeteディレクトリ
$smarty->compile_dir  = _DIR_SMARTY_COMPILE;   // completeディレクトリ
$smarty->config_dir   = _DIR_SMARTY_CONFIG;    // configディレクトリ
$smarty->cache_dir    = _DIR_SMARTY_CACHE;     // cacheディレクトリ

$smarty->assign('owata', 'そうだ!樹海に行こう!');
$smarty->display("owata.tpl");
?>
▼owata.tpl
<html>
<body>
ニートの提案「{$owata}」
</body>
</html>
▼実行結果(owata.phpにブラウザからアクセス)
ニートの提案「そうだ!樹海に行こう!」

owata.phpにアクセスすると,
$smarty->display("owata.tpl");
で,テンプレートファイルowata.tplを読み出して中のHTMLを表示する.
そのとき,予め,
$smarty->assign();
で,設定しておいた中身の置き換えを行う.
ここでは,owata.tpl中の{$owata}を「そうだ!樹海に行こう!」に置き換える.

ちなみに,テンプレートファイルのディレクトリ位置は,
$smarty->template_dir
で設定したディレクトリ位置となる.


これが非常に便利だと考えられるのは,PHPの処理次第でテンプレートを変更できることにある.
例えば,PHPでありがちな,「エントリー」→「内容確認」→「完了」.
<input>タグのaction属性を自分にしておき,ボタンを押したときのPOSTで判断して処理を変える場合,
if(isset($_POST["entrySubmit"])) {
  // ~ここにいろいろ処理~ 
  // エントリー内容の確認
  $smarty->display("confirm.tpl");
}
else if($isset(_POST["confirmSubmit"])) {
  // ~DBに登録とかいろいろ処理~
  // 登録内容の表示
  $smarty->display("entryResult.tpl");
}
else {
  // 通常の表示(エントリーページ)
  $smarty->display("entry.tpl");
}
といった感じに,状況に応じてテンプレートファイルを変更することが可能.

PEARとは,PHP Extention and Application Repositoryの略.

つまり,PHPの機能を拡張してくれるライブラリ.

今回はこの中でもDBクラスについて,紹介メモ.


PEAR::DBは,データベースに依存することなく,データベース接続をすることのできるライブラリ.

例えば,データベースに接続するとき(C言語で言えばfopen),
MySQL:
$db = mysql_connect(MySQLサーバ, ユーザ名, パスワード);

PosgreSQL:
$db = pg_connect(
      "host=干す姪 port=ポート dbname=データベース user=ユーザ名 password=パスワード"
      );

SGLite:
$db = sqlite_open(データベース, ファイルモード, エラーメッセージ保存用変数);
というようにバラバラになってしまう.

しかし,DBクラスを用いた場合,
require_once("DB.php");

$dsn = DBタイプ . '://' . ユーザー名 . ':' . パスワード 
                . '@' . ホスト名 . '/' . データベース名;
$db = DB::connect($dsn);
と書けば,上記のどのデータベースであっても,データベースに接続することが可能となる.

これは特に,サーバー移行するときなど,データベースが変わる可能性がある場合に有効.
さらに,

$db->quote(クォートしたい文字列);
でデータベースに合わせたクォートが可能.クォートはセキュリティ対策の基本なので,これは利用したいところ.
さすがにこれはないと思った,IE事情その2.

よく,ユーザ名,パスワードでログインってありますよね.

まあ,それを作ろうとしてたんだが・・・

form_ff_before.gif
▲[Firefox]計画通り

form_ie_before.gif
▲[IE](;・∀・)ハッ?

ヘ(゚д゚)ノ ナニコレ?

size属性一緒にしてるのに何で長さ違うの?つーか何故,サイズまで違うw

ググってみたところ・・・
http://support.microsoft.com/kb/831331/ja

なんと!
inputタグのtypeが

textのときは"MS UI Gothic"
passwordのときは"Tahoma"

がデフォルトフォントなのだー!

これがIEの仕様(笑)

( ´゚д゚`)エー

しかも,XP以前のバージョンでは"MS UI Gothic"で統一されていた!

(; ・`д・´)な、なんだってー!!

なぜ変えたし.

何てWebデザイナー泣かせなブラウザ.IEたん.


ということで,解決策としては,
<input style="font-family:Tahoma" type="text" size="20">
<input style="font-family:Tahoma" type="password" size="20">
とする.
いや,むしろ,いっそのこと,外部CSSファイルに,
input {
  font-family:Tahoma;
}
と書いておく.

結果,

form_ff_after.gif
▲素直な性格の狐火たん

form_ie_after.gif
▲デザイナーに対してツンデレなIEたん
まずは簡単なところから.

PHPにおけるPOSTとGETは,PHPからPHPにデータを送る操作のこと.
(まあ,正確にはちょっと違う.PHPに限る話じゃないので.)

例えば,以下のようなサイトURLを見ることがあると思う.
例:(Gmailの受信トレイのURL)
http://mail.google.com/mail/?hl=ja#inbox
気になるのは,「?」以降のhl=ja#inbox
他にも,ググったりしたときなどは,こんな感じのが長々とくっついてくることが確認できる.

実はこれがGETの正体.
GETは,サイトURLを使ってデータを送信する仕組みです.
http://送信先?変数名=変数の中身
というように,送信先の後ろに「?」を付け,その後ろに変数を書く.
複数渡す場合は,「&」ではさんで列挙する.
http://vocaloid.php?loid1=miku&loid2=rin&loid3=ruka
この場合,受け取る側であるvocaloid.phpでは,
$_GET["loid1"]  // miku
$_GET["loid2"]  // rin
$_GET["loid3"]  // ruka
と書けば,それぞれの値を取得できる.


しかし,GETは手軽な分だけ問題もある.
1つは,URLにくっつくので,変数の数が多くなった場合に使えなくなること.
あと,もう1つ,ユーザ側から変数が丸見えだということ.

これでは,パスワードやクレジット番号などの保護されるべきデータを送ることはできない.

そこで,こういった,ユーザからあまり見えてほしくないものについては,POSTを使う.
(もっと言うなら,セッションを使うべきだが,今は置いておいて)
POSTは,例えば,<form>タグを使って,
<form method="post" action="login.php">
ユーザネーム:<input type="text" name="username"><br>
パスワード:<input type="password" name="password"><br>
<input type="submit" value="送信" name="submit">
</form> 
とし,login.phpでは,
$_POST["username"]  // フォームで入力したユーザネーム
$_POST["password"]  // フォームで入力したパスワード
で受け取る.

ちなみに,<form>タグでは,method="GET"とすれば,GETで受け取ることも可能.

最近,とある事情で,とあるWebサイトを作ってます.

ただ,HTML/CSSは久しぶりだけど,ただこれを使うだけなら面白くない.
(まあ,PHPによるHTML生成とか別で面白そうなことはやるんだけどさ)

そこで,今回は出来る限りHTML4.0に乗っ取ったレイアウトを試みる.


で,サイト全体をセンタリングしたいと思ったわけなんだが,

当然<CENTER>タグは非推奨.

なので,CSSで設定します.


ところが・・・
<div style="width:800px; margin:0px auto 0px auto">
hogehoge
</div>
▲FireFox:センタリングされた,IE:センタリングされず

(;・∀・)ハッ?

⊂( ・∀・)ワケ ( ・∀・)つワカ ⊂( ・∀・)つラン♪

散々困った挙げ句,
<div style="text-align:center">
<div style="width:800px; margin:0px auto 0px auto; text-align:left">
hogehoge
</div>
</div>
▲FireFox:センタリングされた,IE:センタリングされた

ヘ(゚д゚)ノ ナニコレ?コノクソブラウザ

8になってもやっぱクソだったか.

これが,マイクソソフトクオリティ.

こりゃだめだ\(^o^)/
Infomation
くさもち 【中の人】
・くさもち
・ボカロ廃大学院生
・βからのニコ厨
・もちろん非リア充
・ミクZ4 第二期個人スポンサー

【メール】
・negimochi.tabetai(゚Д゚)gmail.com
(゚Д゚)→@

【その他やってるもの】
Twitter

・これは痛いピアプロ
・過去の遺産smart.fm

【作ったもの】
・製作に参加したDTX GDPメインサイト
で,実際に作ったIRページ
カレンダー
06 2020/07 08
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Heartsnative
『Heartsnative/MOSAIC.WAV×鶴田加茂 feat.初音ミク』応援中!
VOCALOID Ranking Watcher
新曲は常にチェックすべし。
真・フルみっくすプレイヤー
おすすめ記事
jubeat ripples
今更やってみる