Archive for the ‘php’ Category

アクセスカウンタ

火曜日, 7月 17th, 2007

別サイトで使っているアクセスカウンタなんですが、2つ使っていて何故か同じタイミングで初期化されている事があるんです。
最近はアクセス数なんて全く気にしてないので値が初期化されても問題ないのですが、初期化されるってのが気になるところ。
それ以前に値気にしてないなら外せよって話ですがw
ログやデータが飛ぶといやなので、今の物は使うのを辞めて、ど?せならphpを使ってアクセスカウンタを作ってみよう!と思ってきた。

仕様としてはこんな感じ。
保存するデータ
・カウンタ値
・最後にアクセスのあったIPアドレス
・アクセス時間
保存先
・データベースに値を保存
表示形式
・カウンタ値は5桁表示
・TrueTypeFontを画像に変換する予定

データベースに保存すると言う事で使うSQL文は「SELECT」、「INSERT」、「UPDATE」の3つぐらいかな。
新しくデータを追加していく様な事は無いのでデータ読み出しでSELECT、データ更新でUPDATEだけだと思います。
INSERTは初回データを登録するときに使うぐらいかな?
データベースに初期値を登録しておけばINSERTはいらなさそう。

アクセスされたIPに関しては、$_SERVER['REMOTE_ADDR']、もしくはgetenvで取得出来る。

時刻はtime()でOK。
保存する時刻形式は(yyyy-mm-dd hh:mm:ss)のdatetime形式。

TrueTypeFontを画像に変換するのは初めてのチャレンジ
wp-tegakiプラグインを見た時に「うをっ!うちでも使いたいっ!!!」と思ったのがきっかけでチャレンジしようと思いました。
プラグインの方は何故かうまく動かせてません・・・。
はやく導入したいな?(´・ω・`)
ちなみに画像への変換は、xreaにはGDと言う画像をいじる為の機能がインストールされているのでそちらを使います。

まず画像生成にimagecreate関数を使う。
これで土台となる画像($im)を作成。
$im = imagecreate($size_w , $size_h);
横$size_w、縦$size_hの画像を生成する。

imagecolorallocate関数を使ってRGBで指定する色を、GDで使える値に変換。
$white = imagecolorallocate($im, 255, 255, 255);
白色が使えるようになる。

imagefilledrectangle($im , 0 , 0 , $size_w , $size_h , $white);
先ほど生成した土台画像($im)にimagefilledrectangleで白い色をつける。

imagettftextで土台画像にテキストを追加する。
imagettftext($im, フォントサイズ, 角度, X座標, Y座標, テキスト色, フォント, テキスト);

imagepngでpng形式で画像を作成。
第1引数に土台画像($im)、第2引数無しで、ソース中にヘッダのタイプをimage/pngで指定してあれば、png画像を表示。
第1引数に土台画像($im)、第2引数にパスを指定すれば画像をpng形式ファイルとして保存出来る。

最後にimagedestroy関数で取得した土台画像を開放する。
確保したら開放する、メモリの開放は基本ですよね。

と言う感じで早速作って動かしてみたが、エラーが出る。
ヘッダタイプを「header(”Content-type: image/png”);」として実行してるので、本来なら画像が表示されるはずなのに、png->という文字しか出てこない。
そもそも画像作成中に失敗してる可能性もあるのでファイルを作成するようにしてみた所、新しくファイルが作成されて、保存が出来ていた。
なのでスクリプト的には問題ないらしい。
phpのマニュアルサイト見ながらほぼコピペでやったので動かない方がおかしいしよなw

ちょっと調べてみたら、xreaの広告自動挿入が悪さをしているらしく、「x」ディレクトリを作成し、その中で実行してみたところ問題なく画像が表示されるようになった。
・・・wp-tegakiがうまく動かないのもこれが原因ぽ(´・ω・`)

さてどうやって解決すればいいかな?
とりあえずカウンタの方は、別サイトもxrea使ってるのでxディレクトリ作成して動かしてあげれば動作はしそう。
wp-tegakiの方は・・・諦めた方が良いのか?
もうちょっと検討してみますかね。

phpの終わりの”?>”について

金曜日, 5月 18th, 2007

なんとphpのファイルの終わりに書く”?>”については書かなくても良い場合があるとか!
その書かなくても良いという記事の中でお?!と言う部分があったので紹介。

PHPのテクメモ | PHPの記述方法(目からうろこ)
http://php.atseason.com/?eid=515578

例えば先頭でincludeしたファイルの終わりに”?>”があり、その後に改行などがあると本体でHTML Headerを出力させようとしてもエラーが出てしまうらしい。
そう、”?>”の後の改行がHTMLとして出力されており、HTML Headerを出力する前に、既に出力がありますよとなってしまうのだ。
この問題の回避策として、ファイル内部で出力がなければ終わりの”?>”をつけなくても良いらしい。

HTML Headerの前に出力するのはNGというのは知っていたけれど、”?>”の後の改行についてもNGだったのは知らなかったな?。

オレのソース大体最後は空行で終わってるな。
道理でソースを見ると改行が多い訳だ・・・。(-_-;)

プログラムを書けないプログラマって

水曜日, 5月 9th, 2007

はてブ経由で知ったのですが、これマジですか?

どうしてプログラマに・・・プログラムが書けないのか?
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

プログラム書くことがプログラマの仕事だろ?
SEじゃなくてプログラマなのに一体何やって仕事してんだろうw

そこで、オレももしかして書けないプログラマなのかな?と不安になったので実際に出てきた「Fizz-Buzz問題」と言うのをやってみることにした。

Fizz-Buzz問題
1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

とりあえずこの問題を聞いて、パッと頭に浮かんだphpのコードがこれ

for($cnt = 1 ; $cnt < = 100 ; $cnt++){
    if(($cnt % 3 == 0) && ($cnt % 5 == 0)){
        print "FizzBuzz\\n";
    }else if(($cnt % 3 == 0) && !($cnt % 5 == 0)){
        print "Fizz\\n";
    }else if(!($cnt % 3 == 0) && ($cnt % 5 == 0)){
        print "Fizz\\n";
    }else{
        print $cnt . "\\n";
    }
}

実行してないのでちょっと不安w
でもとりあえず書けそうで安心した。

mb_strlenについての疑問

木曜日, 4月 5th, 2007

ただの文字列サイズだけでなく、日本語文字列のサイズも取得出来る関数。

使い方は

mb_strlen("サイズが知りたい文字列",
          "エンコード種別");

エンコード種別は指定しなくてもOKだが、出来れば指定した方が良い!という事らしい。

でも、エンコード種別で「UTF-8」を指定した場合と、「EUC-JP」を指定した場合で帰ってくる数値が違ってくるのは一体?
例えば

$test = "テスト文字列";
print mb_strlen($test,"UTF-8");
print mb_strlen($test,"EUC-JP");

とすると1つ目の値は12で、2つ目は11になる。
これはどういうことなんだろう?
当たり前だけど、表示するcharsetを指定しても帰ってくる値は変わらない。

さて、調べてみたいけど判るかな?

今日はcookieについて勉強してみた

日曜日, 3月 18th, 2007

cookieの保存を行うには、phpの「setcookie」関数を使う事で可能。
使い方は

setcookie("保存したいcookieの名前",
          "cookieで保存する値",
          "保存するcookieの有効期限",
          "cookieが有効なパス",
          "保存するcookieが有効なドメイン" );

setcookieを使うときはhtmlプロトコルの制約の為、html文や空白文字よりも先に書く必要があり。

例えば
setcookie(”hoge”, “fuga”);
とすると、hogeという名前のcookieにfugaという値が保存されるようになる。
保存したcookieは$_COOKIE['cookieの名前']でアクセスする事が可能なので、$_COOKIE['hoge']を参照するとfugaという値が保存されている。
削除を行うにはcookieで保存する値を空文字「”"」、もしくは”FALSE”にし、他の部分を設定したときと同じ値でsetcookieをコールする事で削除が行える。

以下のようにする事でアクセスする毎にcookieを保存、削除を繰り返す事が可能となる。

if( isset($_COOKIE['test'] ) == TRUE){
    setcookie("test",FALSE,time()+(60*60));
    print  "クッキー削除 = {$_COOKIE['test']}";
}else{
    setcookie("test","test",time()+(60*60));
    print "クッキー保存";
}