今日も適当ダイアリー

PHP や Javascript や Symfony、BEAR.Sunday などのWeb周りのことを中心に。それ以外のことも気まぐれに投稿します。

PHP を学び直す 第一回:ごくごく基本的な事

PHP の初級者、中級者向けに、PHP をきちんと学び直す、という事で、PHP 構文、文法などの基礎的な所をまとめていきたいと思います。

というのも、PHP を使っている身であっても、忘れてしまっていたり、知らなかったり、もしくは、マニュアルの意味がいまいち理解出来ないようなこともあると思います。
PHP マニュアルはとても良くできているので、ぜひ参照していただきたいのですが、それ以上に親切に実際に動かせるコードと共に、まとめて見たいと思います。

知らなくても使える情報もあると思いますが、より便利に、より深く理解出来るようになれると思いますし、人の PHP コードを読み解く際にあまり見慣れない表記方法を利用している場合もあるかと思いますので、少しでも、お役に立てれば幸いです。

なお、記事中の間違いや、不足している情報などがあることを気づいた方は、コメントにて連絡いただければ幸いです。

今回は、PHP の記述方法やコメントなどの、ごくごく基本的な事をおさらいしていきます。

続きを読む

表示中のページのQRコードを表示するブックマークレットを作ってみた

PCでいま見ているページの続きを携帯電話で見たいな、って事って僕は良くあるんです。
会社の休憩とかにでる時とか。

で、携帯にいちいちメールを送るのは面倒だし……とかって考えてたら、QRコードが一番楽だと思って、ちゃちゃっと既存のサービスを組み合わせてブックマークレットを作ってみました。

※PCのページを携帯電話で見られるようにするため、Google Mobile Converterを利用したURLになります。

jWikiParser - PHP Wikiパーサ

最近、PukiWikiぽいWikiパーサが必要だったのですが、PukiWikiGPLだったので、中のコードはパクれない。。。

結局、PukiWikiとLivedoorWikiの整形ルールを参考にしながら、オリジナルWikiパーサを作ってみました。

あまりテストしてないのとちょっと手抜きがあるのですが、ま、何かの参考になれば。

不具合、ご意見などについてはコメントにてご連絡ください。

続きを読む

ちょっと便利なダミーテキスト作成ツール

htmlでデザインをしている時など、ダミーのテキストが欲しい事って結構あったりする。
適当に当たり障りのないテキストが欲しいのだけど、クライアントに見せるときに「test test test test...」てのはあんまりだし、かといってまじめに考えるのもばかばかしい。

やっぱり、Webを探してみればそういうツールもあるものですね。

|| Dummy Text Generator | Lorem ipsum for webdesigners ||
http://www.blindtextgenerator.com/

英字のダミーテキストが簡単に作れます。

おー、便利!

PHPの文字化け対策

PHPのフォームなどで、文字のやりとりをしていると、文字化けを起こす場合があります。

特に、文字コードがShift-JISだったりすると「機能」が「機\能」になってしまったりする場合があります。これは、PHP4やPHP5の設定ではmagic_quotes_gpcがonになっており、これの影響を受けている状況です。(この現象については他のサイトで。。。)
問題を解消をするために、一つずつstripslashes()を使うのは面倒ですし、二重に処理をしてしまったり、もしくはmagic_quotes_gpcがoffの環境に移行するときに手間がかかるのは解せないので、下記コードを良く利用しています。

<?php
   // マジッククオートされている場合に、スラッシュを取り除く
    function no_slashes($array) {
      if (get_magic_quotes_gpc()) {
        foreach($array as $key=>$value) {
          if(is_array($value)) {
            $value = no_slashes($value);
            $array_temp[$key] = $value;
          } else {
            $array_temp[$key] = stripslashes($value);
          }
        }
        return $array_temp;
      } else {
        return $array;
      }
    }
    
    // 処理を行いたい配列を渡す
    $_GET = no_slashes($_GET);
    $_POST = no_slashes($_POST);
    $_COOKIE = no_slashes($_COOKIE);
?>

一般的なブラウザで標準準拠モードにしたい場合のDOCTYPE

一般的なPC用のブラウザでは、大きく分けて標準準拠モードと後方互換モードといった2つの描画モードがある事が多い。
標準準拠モードは、(X)HTMLの根本に立ち返った文法重視の解釈を行うモードで、それに対して後方互換モードでは、文法を緩く解釈をして表示してくれるモードになっています。

近頃では少しずつ、(X)HTML+CSSという考え方が浸透してきているため、文法に忠実にコーディングされたページも多いのですが、そういうページが後方互換モードで表示されてしまうとサイトのレイアウトが崩れたり不具合が発生する場合もあります。

ブラウザがこのモードを判断するために利用しているのが、DOCTYPEなどの、HTMLの一番上にされる宣言なのですが、ブラウザによって実装状況が違うため紛らわしいのです。

標準準拠モードにしたい場合は、下記DOCTYPEのいずれかを宣言すれば多くのブラウザで標準準拠モードになります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

なお、xhtmlでの記述の場合でも

<?xml 〜〜 ?>

XML宣言を入れてしまうと、IE6で後方互換モードになってしまいますので、ご注意下さい。

より、詳細に知りたい方は、2xup.orgさんが公開されているGoogle ドキュメントにて各ブラウザの挙動が紹介されているようです。

参考URL:http://2xup.org/log/2007/07/27-2111

IEでSSL(https)だとPHP経由でのファイルのダウンロードに失敗する

ファイルのダウンロードをコントロールしたり、ダウンロード数をカウントするために、PHP経由でファイルを転送したい場合ってのがあるのですが、キャッシュに残るのも気持ち悪い、とかで、たいてい、下記のようなスクリプトで対応してきました。

<?php
$filepath = '../datas/hoge.dat';
$filename = 'hoge.dat';

// ファイルが存在すれば
if (is_file($filepath)) { 
    // ヘッダーを出力(キャッシュ制御とファイル名の指定など)
    header('Pragma: no-cache'); 
    header('Cache-control: no-cache');
    header('Content-type: application/octet-stream');
    header('Content-Length: ' . filesize($filepath)); 
    header("Content-Disposition: attachment; filename=\"{$filename}\"");
    header('Expires: Mon, 3 Jun 2005 10:00:00 GMT');
    header('Content-Transfer-Encoding: binary');

    @readfile($filepath);
}
?>

で、普通ならこれで問題ないんだけど、今日、このスクリプトssl経由で実行したら、IEでエラーが。。。

Internet Explorerでは、hoge.datをダウンロードできません。
このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。
」って、言われちゃう。

FireFoxOperaでは問題なくダウンロード出来るし、特別な事をやってるつもりもないんだけどなぁ。

どうしたものかと、ググる事、数分。Microsoftのサポート情報に、こんな記述が

Internet ExplorerSSL 経由によるファイルのダウンロードで "No-Cache" ヘッダーを処理できない」って、え!?

IEでは、ファイルのダウンロードの際に、一回キャッシュディレクトリに保存されるから、キャッシュしないようにヘッダーで指示すると、ダウンロードできなくなってしまうのでしょうか……
ま、no-cacheだと処理出来ないってことは、no-cacheを送信しなければ問題ないだろうと思い、下記2行を変更。

<?php
    header('Pragma: private');
    header('Cache-control: private, must-revalidate');
?>

これで、無事ダウンロード出来るようになりました。

参考:http://support.microsoft.com/kb/323308/ja/マイクロソフトサポート情報)

キャッシュを無視して再読込:スーパーリロード

Webを見ていて、今まで知らなかった便利な事に出会うとうれしい物です。
遅ればせながら、スーパーリロードを知ったので、メモっておきます。

ページを再読込(リロード)するには、F5やCtrl+Rなどを使ったり、更新ボタンをクリックしたりしていると思います。
ただ、開発や、コーディングなどをやっていると、上記方法ではページの内容が更新されなかったりして、うっとおしい物です。

ブラウザでは、動作や通信を減らすために、キャッシュという一時ファイルを使ってページを表示しているのですが、通常のリロードでは関連ファイル全てが再読込されるワケではないため、(特に、スタイルシートとか画像、Flashなどが再読み込みされずに)このような現象が起きるわけですが。
実は、これまで、キャッシュをクリアしてブラウザ再起動したり……とかなり煩わしい方法でこの現象に対処してきたのですが、スーパーリロードというものがあることを知りました。

スーパーリロードを使うと、キャッシュを無視して強制的に再読み込みさせることができるため、キャッシュによって更新されないという事態を防げます。

IEなら、マウスで[Ctrl]+更新ボタンか、キーボードで[Ctrl]+[F5]
FireFoxなら、マウスで[Shift]+リロードボタンか、キーボードで[Ctrl]+[F5]、または、[Ctrl]+[Shift]+R。覚えておくと、役に立ちそうです。

IE6の「このページにはセキュリティで保護されている項目と保護されていない項目が含まれています。保護されていない項目を表示しますか?」でハマった

仕事で、とあるサイトにSSLをかけるため、HTMLを調整したりしていたのだが、IE6でチェックしたら、セキュリティの警告がどうしても出てしまった。

IE7FireFoxなどではまったくセキュアな通信だと言われるのに、なぜ!!!!と、途方に暮れてしまった。

困ったときはGoogle。いろいろググってみたが、それらのほとんどはHTTP通信が混ざっている可能性がある、といったもので、「外部CSSは見落としやすい」とか、「imgタグなどのsrcも要チェック」とか、「外部JavaScriptでwriteしていか」とか。。。

へなちょこではあるが一端の技術者として、チェックには怠りがないはずだが。
と、悩むこと10分。やっと、研削結果に引っかかってきました。

それによると、IE6で、srcなしで空のiframeがあると、セキュリティの警告がでる、といったもの。

えっ??と思ったが、

<iframe id="iframeEmpty"></iframe>

というソースを

<iframe id="iframeEmpty" src="dummy.html"></iframe>

に直したら、あっさりと解決しちゃいました。(もちろんdummy.htmlという名前の空ファイルを作ってから)

はぁ。こんなことで、1時間近くも浪費してしまうなんてー。
まだまだ知らないことがたくさんあります。。。