ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2009-11-26

【PHP】php.iniのregister_globals設定【サーバ移行】

ちょっと前の話になるんだけど、

もう忘れてしまいそうなのでメモっておく。



この間、研究室の業績サーバを移行する仕事をしていた。

以前より構築済みの環境は、



言語: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そのときの後輩がなんとかしてくれるさ。きっと。



2009-09-01

【DTX GDP】反省と今後の改善手点

DTX GDP.

個人的反省点を列挙.



【技術面】

・テーブルの正規化をなめてた

何度も正規化については,議論していたつもりだったが,まだ甘かった.

楽器別にテーブルを分けたために,後々になってIRページの算出時に問題が起きた.

さらに,SQL文も膨大になり,収拾がつかないことに・・・.

やっぱ,楽器でキーを割り当てて,全レコードを一つのテーブルに納めるべきだった.



・Flash → PHPの構造

勉強不足.結果的に,送受信のシステムはできたものの,かなり不安定なものだったかも.

そもそも,XMLを丸ごと送る構造でよかったのか?

別の方法で送った方が,問題がおきなかったかもしれない.



【対応面】

・対応が遅い

研究が忙しかった・・・でも,これは言い訳にしかならないだろう.

もっと効率化できるように,プログラムエラー系を手厚くしておけば,もっと楽に保守できたはず.



・バグ多すぎ

これは,βテストをすべきだった.

スケジュール的にかなり無理をしてのは事実だが,

今まで自分がやったことない言語で組むんだから,余計入念なチェックが必要だったはず.



【その他】

・見た目

アプリの方の見た目は多少拘った.でも,IRページについてはテキトー.

所詮,軽くCSSで設定しただけ.あまりに味気ない.





とりあえず,こんなところだろうか.



このイベントに限らず,今後こういった人に見せるモノを作る際は気をつけておかなければ.



今回は,本当に様々な面で勉強させていただきました.

関係者の皆様,ユーザの皆様,ありがとうございました.

2009-07-01

【PHP】Smartyのススメ

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

といった感じに,状況に応じてテンプレートファイルを変更することが可能.



2009-06-27

【PEAR】DBクラスのススメ

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(クォートしたい文字列);

でデータベースに合わせたクォートが可能.クォートはセキュリティ対策の基本なので,これは利用したいところ.

2009-06-21

【PHP】GETとPOST

まずは簡単なところから.



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で受け取ることも可能.



2009-06-13

【お手軽にPHP+SQL環境】VertrigoServ

そろそろ,PHP+SQLの記事でも書こうかな.



とりあえず,今日は立ち上げに際して使ったソフトの紹介.





VertrigoServ

http://vertrigo.sourceforge.net/



Windowsでやりたけれど,



ApacheやPHP,MySQL・・・いろいろインストールするのがめんどくさい!



という方向け.



このソフト1つインストールすれば,なんと全部自動でインストールしてくれます.



詳しくはGIGAZINEにも載ってます.

http://gigazine.net/index.php?/news/comments/20080324_vertrigoserv/





タスクトレイから選択できるメニューの豊富さ.



各種設定ファイルへのアクセスも簡単.



とりあえず,ローカルでテストするにはこれで十分.