CodeIgniter徹底入門
![]() | CodeIgniter徹底入門 (2008/06/10) 河合 勝彦鈴木 憲治 商品詳細を見る |
CodeIgniterは、ちょっと使ってみたことがあり、使い方が非常にわかりやすいと思いました。
この解説本が出たとき、本屋で立ち読みしてみて、買うかどうか迷って、結局その日は買いませんでした。
CodeIgniterのメーリングリストで、質問によく答えている上級者ユーザーの方でも、この解説本を買って、じっくりと使い方を研究されているようであることを知り、自分も資料として持っていて損はないなと思いました。
CodeIgniterは、オンラインのマニュアルが充実しており、本がなくても良いと思ったけど、じっくりと使い方を学んでみたいと思って解説本を買いました。
フレームワークは使いこなせると、開発の時間が短縮できて重宝します。
CodeIgniterを使いこなして、自分の思い通りにWEBサイトを作れるようになれば、十分に元は取れるな!(^^;
CodeIgniterは外国産のためか、日本の携帯サイト事情があまり考慮されていないように思われます。
携帯サイトを作るときのTipsは、ちょっと情報が少ないかな?
あと、フレームワークとは直接関係ないけど、この本で紹介されていたEclipse+PDT+xdebugの使い方は参考になりました!(^^)v
PHPでファイルをZIP圧縮して、まとめてダウンロードさせる方法
そこで、複数のファイルをZIP圧縮で1つにする方法を調べてみた。
ZIP圧縮について、まとめてあるサイトがあったのでメモ。
PHP で zip 圧縮
http://winofsql.jp/VA003334/phpVarious060803234456.htm
phpMyAdmin のライブラリを使用してファイルに出力する
phpMyAdmin のライブラリを使用してダウンロードさせる
PEAR の File_Archive を使用してファイルに出力する
PEAR の File_Archive を使用してダウンロードさせる
PEAR の File_Archive を使用してソースコード上のデータをダウンロードさせる
PEAR の File_Archive を使用して個別ファイルを解凍する
いろいろな方法がありますね。
これは便利だ!!!
![]() | PHPの絵本 (株)アンク (2007/02/28) 翔泳社 この商品の詳細を見る |
SQLインジェクション対策
ユーザーの入力値をSQL文の一部に入れる場合、SQL文が意図せぬ形にならないように、ユーザーの入力値を加工する必要がある。
=ユーザーの入力値を未加工のまま使うのはダメ。
PHP マニュアル > mysql_real_escape_string
サンプルコードにあったユーザー定義関数 function quote_smart($value) を使えばいいだろう。
【MySQLウォッチ】第27回 MySQL 5.0 および 4.1 にSQLインジェクションのセキュリティ・ホール
PHPのmysql_real_escape_string()関数は、MySQLのmysql_real_escape_string()関数をコール(呼び出し)しているが、元々のMySQLのmysql_real_escape_string()関数自体にバグがあり、SQLインジェクション対応が不十分だったようだ。
■PHP 利用時に Shift_JIS で addslashes() によるエスケープ処理に SQL インジェクション可能な穴
結論から言うと、Shift_JISを素直に使っている限り、addslashes()は駄目(Chris Shiflett氏)、mysql_real_escape_string() は駄目(Ilia Alshanetsky氏)、一部のPrepared Statements すらも駄目(id:jrofbyrsさん)、ということらしいです。
安全な対処方法としては Shift_JIS などの文字の最後のバイトに \ が含まれる可能性のある文字コードを使用しないことです。
1.addslashes()→不十分
2.mysql_real_escape_string()→不十分
3.Prepared Statements→不十分
4.SJISを使わない→OK
ということのようだ。
最近は、EUC-JPよりUTF8を使う機会が多いような気がする。
・UTF8はエンコードの仕組の都合で、EUC-JPよりデータ量が割り増しになるんだったよな?
・携帯用のページは、UTF8→SJISに変換すればOKかな?
addslashes() による SQL 文字列のエスケープ回避問題
↑Shift_JISの場合のSQLインジェクションについて解説してある。
yohgaki's blog addslashesによるエスケープ処理は止めましょう
↑PostgreSQLの場合の話が出ていた。
あと、ご指摘通り、pg_prepare() と pg_execute() によるプリペアードクエリでは問題ありませんでした(文字コードが SJIS の場合でも SQL インジェクションを起こせない)。
PHP 側でこれらの関数が導入されたのは PHP 5.1.0 以降のようですので、それより前のバージョンでは文字コードに SJIS を使用しないようにするしかないように思います。
PREPAREしとけ、ということかな?
IPA セキュア・プログラミング講座 SQL組み立て時の引数チェック
DBIクイックリファレンス Perl-DBI講座
↑プレースホルダ、バインドメカニズムの復習をしておこう。
SELECT f2 FROM table WHERE f1 = ?
上記で使用したクエスチョン( ? )マークをプレースホルダと呼びます。
プレースホルダは、そのままでは値を持っていないので、後で実際の値を結びつけます。
参照される値をバインド値、実際の値との結びつけをバインドと呼びます。
時代は O/R マッピングなのだけどプレースホルダを復習
ユーザーの入力値を加工するのは機械にやらせればいい、ということで、SQL文を安全にするためのDBラッパーが用意されているようだ。
最初からそれを使えば面倒くさくなさそうだ。
(中身がブラックボックスで見えないのが気に入らないなら、コードを読むしかない。)
「サニタイズ言うな」の高木さんのブログにも、エスケープの話がある。
教えて!goo > HTMLに出力するときには、htmlspecialcharsします。
【“SQLインジェクション対策”の続きを読む】
OpenPNE新機能 PNEアウト(外部認証)
PNEアウト(外部認証)
SNS以外のWebアプリからユーザー認証情報を取得して、ログインチェックを行なう機能のようです。
1) 外部のデータベース
2) XOOPS
3) osCommerce
4) LDAP
上記サービスのアカウントでOpenPNEにログインできる
OpenPNE2.X系でWeb2.0(外部WEBサービスとつなぐ)をドンドンやっていこうと思っている
おおー、これは便利そうだ!
OpenPNE側もAPIを用意しており、外部WEBサービスに対してSNS内のデータを引き渡せるから、シームレスな相互乗り入れができるかな?
PHPでデザインパターンを学ぶ
Javaでデザインパターンを解説している本で良さそうなのがあったが、ちょっと読んだだけで、十分勉強していなかった。
PHPプログラミングの解説サイトである「Do you PHP ?」を見て、PHPでもデザインパターンの勉強ができそうだから、そのうちやろうと思っていた。
1年以上も放ったらかしにしてたけど、PHPでデザインパターンを解説した本が出た!
![]() | PHPによるデザインパターン入門 下岡 秀幸、道端 良 他 (2006/11) 秀和システム この商品の詳細を見る |
著者の下岡さんは、「Do you PHP ?」サイトの作者さんでもあった。
なるほど、それでこの本を出版と。
ちょっと立ち読みしてみたが、サンプルコードも載っていて分かりやすいそうだったので、この本なら最後まで読んで理解できそうだ。
デザインパターンの知識をガンガン活用したい!
よし!2007年の目標はオブジェクト指向プログラミングの完全マスター&徹底活用だ!!!
![]() | 増補改訂版Java言語で学ぶデザインパターン入門 結城 浩 (2004/06/19) ソフトバンククリエイティブ この商品の詳細を見る |
![]() | 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 結城 浩 (2006/03/21) ソフトバンククリエイティブ この商品の詳細を見る |
【“PHPでデザインパターンを学ぶ”の続きを読む】
symfony入門(1)
CodeZineにsymfonyの解説記事があった。メモメモ
本連載では、PHP上で動作するアプリケーションフレームワーク「symfony」で、アプリケーション開発を行う方法を紹介します。
導入の今回は、まずsymfonyの特徴と環境設定手順、「Hello, World」アプリケーションの作成までを紹介します。
PHPの基本構文は一通り理解しているが、フレームワークを利用したことはないという方を対象としているので、symfonyに興味のある方はこれを機にぜひ導入してみてください。
PHPを使ったWebアプリケーション開発の手法の一つとして、知っておいて損はないだろう。
よし、勉強してみよ☆\(^o^)/
PHPフレームワーク symfony 1.0 beta 1 発表!
Announcing symfony 1.0 beta 1
It's been a long time since the latest beta release (0.7.1915), and even a longer time since the last stable release (0.6.3). Today, we are happy to announce the release of symfony 1.0 Beta 1, and this is a major step towards the version 1.0, which should come shortly.
最後の安定しているリリース(0.6.3)以来、そして最新のベータ版(0.7.1915)以来の長期、長い時間でした。
今日、私たちは、symfony 1.0ベータ1のリリースを発表することができてうれしいです。
そして、これはバージョン1.0への第一歩であり、それはもうじき完成します。
XREA に OpenPNE を設置する
設置の注意点をまとめてみました。
1. OpenPNE2.0をダウンロードする。
http://docs.openpne.jp/?%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9
(最新のOpenPNE2.2系ではなく、とりあえずバグフィックスの落ち着いていそうな2.0系を使ってみる。)
2. OpenPNE セットアップガイドに従い、セットアップする。
http://tejimaya.org/openpne/docs/2_0/OpenPNE_Setup.html
3. 画像が表示されないという、XREA固有のエラーが出た。
OpenPNEをカスタマイズして、画像が表示されない状況を改善する。
Googleで「XREA OpenPNE 画像 エラー」を検索。
OpenPNEをオープンに使うサイト
http://openx.xrea.jp/
↓↓↓これが参考になるだろうか?↓↓↓
画像が表示されない不具合
http://openx.xrea.jp/modules/newbb/viewtopic.php?topic_id=9&forum=2
投稿日時: 2006-3-14 10:10 管理人
投稿: 15 Re: 画像が表示されない不具合
OpenPNE1.8.3(または1.9.2)をXREAサーバにインストールしたときにこの不具合が発生しているようです。
OpenPNE1.8.3では、img.phpで取得する画像を全てキャッシュ経由で表示するように変更しているみたいです。
XREAではセーフモードが有効になっているため、キャッシュファイルが生成されず、そのため画像が表示されなくなっているようですね。
Imgクラスのoutput_img()で、キャッシュがない場合の処理を追加すれば画像は表示されます。
該当箇所 /webapp/lib/img/img.class.phpの166行目
function output_img()を以下で置き換えます。(※修正は自己責任で行ってください。)
function output_img()
{
//キャッシュがある場合
if ($this->config_cache_source_enabled && $this->cache_exists) {
$this->send_content_type();
if ($mtime = filemtime($this->cache_fullpath)) {
// Etag
require_once (DOCUMENT_ROOT.'/webapp/lib/Etag.class.php');
$etag = new Etag($this->cache_filename.$mtime, $mtime);
if ($etag->etagCheck()) {
exit;
}
}
@readfile($this->cache_fullpath);
return true;
}
//キャッシュがない場合
if ($this->src) {
//TODO ディレクトリから取ってくる場合
}
elseif ($this->dbsrc) { //DBからとってくる場合
//リサイズせずに、かつ、形式変換しない場合、
//出力にGD系の関数を使用しない(画質が劣化するので)
if ($this->rawImageData && !$this->gdimg_output) {
$this->send_content_type();
echo $this->rawImageData;
return true;
}
elseif ($this->gdimg_output) {
//リサイズ or 形式変換する場合は、GD系の関数で出力
$this->send_content_type();
switch ($this->outputFormat) {
case "jpeg":
case "jpg":
default:
imagejpeg($this->gdimg_output);
break;
case "gif":
imagegif($this->gdimg_output);
break;
case "png":
imagepng($this->gdimg_output);
break;
}
return true;
}
}
return true;
}
ふむふむ、なるほど。
・画像のキャッシュファイルがある場合
・画像のキャッシュファイルがない場合
の判定処理を入れると。
OpenPNE2.0の場合はどうなるだろうか?
↓↓↓
Imgクラスは、
/OpenPNE/webapp/lib/OpenPNE/Img.php
にありました。
169行目に、該当のメソッドがあります。
/**
* 画像を出力
*
* @access public
*/
function output_img()
・画像のキャッシュファイルがない場合は、データベースから画像データを取り出して、出力するようにすべし!
・キャッシュファイルを作らない分だけ処理が遅くなり、サーバに負荷がかかるが、しょうがない。><
・データベースから画像データを取り出す処理は、generate_img()メソッドの処理を真似すればOK。
以上の改変内容をまとめると、output_img()メソッドの内容は以下のようになります。
これでXREAでも、OpenPNE2.0で画像が表示されますね!
function output_img()
{
if ($this->check_cache()) {
//キャッシュがある場合
$this->send_content_type();
if ($mtime = filemtime($this->cache_fullpath)) {
// Etag
require_once 'Etag.php';
$etag = new Etag($this->cache_filename.$mtime, $mtime);
if ($etag->etagCheck()) {
exit;
}
}
@readfile($this->cache_fullpath);
}
else {
//キャッシュがない場合 → DBから取ってくる
$this->raw_img = $this->get_raw_img();
$w = $this->requests['w'];
$h = $this->requests['h'];
// サイズ指定がなく、かつ、形式変換しない場合(GDに変換する必要なし)
if (!$w && !$h && ($this->source_format == $this->output_format)) {
$this->send_content_type();
echo $this->raw_img;
return true;
}
// create a GD image from raw_img
if (!$source_gdimg = imagecreatefromstring($this->raw_img)) {
return false;
}
if ($this->requests['f'] == 'jpg') {
// JPEGの場合、携帯対応
imageinterlace($source_gdimg, 0);
}
//リサイズ
$output_img = $this->resize_img($source_gdimg, $w, $h);
//リサイズした画像をGD系の関数で出力
$this->send_content_type();
switch ($this->output_format) {
case 'jpeg':
case 'jpg':
default:
imagejpeg($output_img, '', $this->jpeg_quality);
break;
case 'gif':
imagegif($output_img);
break;
case 'png':
imagepng($output_img);
break;
}
return true;
}
}
↑ブログにソースコードを貼り付けると、表示したときインデント(字下げ)が反映されてないですね。
ちょっと見づらいかな?
根本的には、Imgクラス自体を作り直す必要があるのかな?
50×50ピクセルとか、小さい画像をリサイズして、表示させる機能がうまく働いていない。
めんどくさいなー、もう。。。
後で修正しよっか。ふぅ〜。
構造化プログラミングを極めよ!
オブジェクト指向型と、手続き型の利点と欠点は?
オブジェクト指向型と、手続き型の利点と欠点について教えてください。
現在、社内ではPHP4を採用しており、私自身も手続き型でプログラミングしています。しかし、最近、上司がPHP5を採用して「オブジェクト指向型プログラミング」に移ろうと考えています。
自分は、PHPからプログラミングを始めているので、オブジェクト指向型のプログラミングが全くわかりません。
そこで、PHP4からPHP5に移行した経験がある方に、オブジェクト指向型プログラミングと、手続き型プログラミングの利点と欠点、導入する際の注意などあったら教えていただきたいと思っています。
自分の作成したものを、たまたま他の人に見せる機会があって「思想がオブジェクト指向」だと言われたことがあります。
私の関数の作りかたが「プログラマにいちいち見せなくてよいものは隠蔽する」「要件変更で変化する可能性の高い部分は関数化し、プログラム全体に影響しない作りとする」という感じで行っていたからかもしれません。
(これがオブジェクト指向なの?っていうのは勉強不足なので判らないのですが)
ただ、そのとき話した内容としては「手続き型のコーディングを正規化してかけない人は、オブジェクト指向での設計は出来ない」と聞かされました。
多分、オブジェクト指向自体を理解すること、その場合のコーディングの正規化を知ることで初めてオブジェクト指向プログラミングが出来るのではないかと思います。
言いえて妙。
まずは、手続き型のスタイルで、「DRY」を徹底してやってみよう。
(DRYは、Ruby on RailsのDRY=Don't Repeat Yourself.同じことを繰り返さない、のことね!)
1.コメントはコードの説明では無く、仕様の説明を書く
2.データ(定数)をコードに埋め込まない
(後で変更する為)
3.ライブラリの機能は単純でエラー処理などは書かない
(汎用性を持たせる為、使う方で書く)
4.関数を書くときはそのファイル内(クラス内)のみで使うものと外から呼ばれるものを分けて書く
(他の人が使う時に見やすい様に)
5.複雑な処理・計算式が出てきたら、別の方法を考える
(読みたくない)
PHPプロ!TIPSメーリングリスト
TIPSメーリングリストというサービスが始まったらしい。
http://www.phppro.jp/phptips/
PHPプロ!TIPSメーリングリストでは、PHP開発に役立つTIPSや様々なライブラリの簡単な使い方、開発で必要になるツールの使い方などを、週に1回、登録していただいたユーザの皆様にお届けします。
早速登録してみた。
うっほほ〜い!どんなお役立ち情報が届くかな☆
あ、ブログの記事投稿画面のボタンが変わってるぞ。
なんか、アクア風の透明感がある画像に入れ替わっている。
リンク設置ボタンは、ABCじゃなくて、前のURLの方が分かりやすかったんじゃないかな?
ま、何でもええわ。www


![明快入門SQL [林晴比古実用マスターシリーズ] (林晴比古実用マスターシリーズ)](http://ecx.images-amazon.com/images/I/41vIWLSNXvL._SL160_.jpg)












