Profileyoukey spacesBlogLists Tools Help

Blog


    February 02

    この改行コードが…

    Webブラウザで表示している一覧のデータをCSV形式でファイルに
    出力する機能があるのですが、どうもある一覧だけ先頭に改行コード
    が入ります。一体これは・・・?
     
    【原因】
     インクルードしているPHPのファイルの最終行に改行コードが
     入っているのが原因のようです。次のような感じ。
       ----------
       ?>
            ←ここに改行がある
       [EOF]
       ----------
     
    【対処】
     改行コードを削除しました。これだけで直りました。
       ----------
       ?>
       [EOF]
       ----------
       
     
    【コメント】
     結構繊細なものなのですね。
     
    January 02

    PHPスクリプトの暗号化ツール(ionCube PHP Encoder)

    何気なく昨年書いたブログを見ていたら、書き忘れがある
    ことに気づきました。
    PHPの暗号がツール、結局『ionCube』を購入しました。
    使い方がとてもわかりやすかったのと値段が決め手かな?
    暗号化したものはWindowsでもLinuxでも問題なく動作
    しました。
     
    以下、覚書です。
    ■====================================================■
     ionCube PHP Encoder (ionCube Ltd.)
       http://www.ioncube.jp/
    ■====================================================■
    【価  格】
      Professional Edition     62,800 円から
      Cerberus Edition       83,800 円から
    【実行環境】
      ionCube Loader が必要。(無償)
    【メ  モ】
      日本ではアシアル株式会社がionCubeのパートナーに
      なっており、日本語でのサポートをしてくれます。
      http://www.asial.co.jp/products/ioncube/
     
    そのほかには次のツールもありました。
    ■====================================================■
     Zend Encoder 3.5 日本語版 (ゼンド・ジャパン株式会社)
      http://www.zend.co.jp/products/encoder/
    ■====================================================■
    【価  格】
      プロダクト         400,000 円
      年間保守アップグレード    80,000 円
      メジャーバージョンアップ(製品価格の50%)
    【実行環境】
      Zend Optimizer が必要。(無償)
    【メ  モ】
      PHP のスクリプトエンジン Zend Engine の
      開発メンバがZend社を創設しています。

    November 10

    HTMLエンティティから通常の文字列に変換する

    HTMLエンティティから通常の文字列に変換する関数はありません。
    でも、関数の組み合わせでできるそうです。
    PHPのマニュアルにありました。

    function unhtmlentities ($string) {
       $trans_tbl =get_html_translation_table (HTML_ENTITIES );
       $trans_tbl =array_flip ($trans_tbl );
       return strtr ($string ,$trans_tbl );
    }
    October 30

    phpDocumentorを使ってみました

    PHPで書いたプログラムのドキュメントが簡単に作れないかな?
    と思って検索してヒットしたのがphpDocumentorでした。
    早速ダウンロードして使ってみました。
    結構簡単に使えるんですね。ただひとつ問題が・・・。
     
    【困ったこと】
    クォートがエスケープされちゃって、ソースコードで最初に現れた
    シングル/ダブルクォーテーション以降すべて文字列になってしまい
    ました。
     例:
      <ソースファイル>
       var $event_handlers = array(
           'docblock' => 'handleDocBlock',
           'page' => 'handlePage',
           'class' => 'handleClass',
              :
     
      <phpDocumentor>
       var $event_handlers = array(
           'docblock\' => \'handleDocBlock\', 
               :
       ※ docblock の先頭についてる「' 」以降全部文字列リテラル
         として扱われる。
     
     
    【原因】
     php.ini の マジッククォートの設定(magic_quotes_runtime)が
     on になっていた。

      magic_quotes_runtime = On

     この設定が on の場合、データベースおよびテクストファイル
     を含む外部ソースから データを返す全ての関数のクオートは、
     バックスラッシュで エスケープされます。

    【対処方法】
     php.ini のマジッククォートの設定を off にする。

      magic_quotes_runtime = Off


    以前、ある「PHP暗号化ツール」のお試し版を使用して同様の
    現象が発生したことがあるんだけど、原因は同じかも。
     
    October 20

    PHPカバレッジツール(Xdebug )-つづき

    Xdebugのカバレッジ測定用の関数を使っても、何行目を何回実行
    したかしかわからないんですよね。しかも実行されなかった行はわから
    ない。
    そこでまた何かいいものを探していたのですが、Eclipseのプラグインで
    PHPファイルのコード行、空白行、コメント行の行数を算出してくれる
    ものを見つけました(提供してくださっている方には大変感謝です)。
     
    Xdebugとこのプラグインを組み合わせると、実行されなかったコード行
    の数が簡単に(?)わかります。厳密なカバレッジとは言えませんが、
    100%でないものだけ確認すればいいので助かります。
     
    Eclipseのプラグインを作れたら面白いかも。なんて。
    October 17

    PHPカバレッジツール(Xdebug )

    PHP4用のツールを調べたのですが、これは使えるかな?
     

      PHPのデバッグ用ソフトウェア。
      カバレッジ用の関数を使うと、ソースファイルの何行目
      を何回通ったかがわかります。ただし、通らない行は
      結果として出力されません。
      そのまま使うのは難しいかも?
     
    【ライセンス】
      The Xdebug License, version 1.01
      (Based on "The PHP License", version 3.0)
      http://www.xdebug.org/license.php
    October 11

    PHP4でカバレッジは・・・

    PHP4で作ったプログラムのカバレッジを調べたいのですが、
    そんなツールはないのでしょうか・・・。
    PHP5だといくつかあるみたいなのですが。それほど違いは
    ないのでしょうか?やってみればわかるか。(ぶつぶつ)
     
    August 05

    PHPスクリプトの暗号化ツール(CODELOCK)

    PHPのコードを暗号化するツールを探していたのですが、いくつか
    見つかりました。この中で格安なのが CODELOCK という製品。
    体験版をダウンロードして使ってみました。
     
    【ダウンロードとインストール】
    体験版はここ(1)↓と
     ここ(2)↓
    http://www.agtjapan.com/mcl/index.html
    からダウンロードできますが、(2)の方はわたしの環境では起動画面
    が出てきませんでした。
    とりあえず、(2)をインストールしたあと(1)を上書きコピーしました。
    ((1)の方はフォルダが足りなかったので)
     
    【実行結果】
    それが、使い方がよくわからないのです。。。
    「とっても簡単」と書いてあるのですが。
     
    指定したフォルダ内のファイルが暗号化されるときとされないときが
    あります。そのパターンがわからず。
    復号用のファイルも生成されているようなのですが、ファイル名が
    「.php」になってしまいます。
     
    暗号化できたときにWebブラウザでアクセスしてみたのですが、
    画面は真っ白なまま。何が悪いのでしょう?
    来週またチャレンジしてみます。もしかしたらLinuxだったら動くのかな?
     
     
    【その他】
    以下、CODELOCK のちょっとした覚書です。
    ■==========================================■
     CODELOCK V2.0 ( Web Creations Ltd.)
      http://www.agtjapan.com/mcl/index.html
    ■==========================================■
    【価  格】
      6,200 円
    【ライセンス形態】
      「あなたの作成したHTMLやPHPスクリプト用に
       無制限に使用できる」
    【実行環境】
      復号用ファイルが必要。(自動生成)
    【備  考】
      日本では AGT Japan が総代理店です。(と書いてありました)
      AGT Japan: http://www.agtjapan.com/

     
    June 20

    JpGraphの画像の印刷

    先日JpGraphで作成した「ガントチャートが印刷できない」という
    問い合わせがありました。
    いったん画像をPCに保存して、それを印刷することはできるけど、
    ブラウザ(IE)に表示した画像をそのまま印刷すると白紙になるとか。
    確認したところ、確かにそうでした。

    原因はわからないのですが、このシステムのガントチャートはファイルに
    落としてない(動的に生成している)ので、それが原因かも知れません。
    IE(6.0)は印刷できないのは確認しました。他のブラウザでも確認して
    みます。

    テンポラリの領域に画像ファイルを作成するしかないのでしょうか。
    その画像ファイルを消すタイミングも考えなければ。
    まだまだわからないことが多いです。。。

    June 19

    JpGraphの日本語版

    JpGraphの日本語版の提供を始めた会社があるようです。
    http://www.asial.co.jp/products/jpgraph/
    2005年6月6日から提供開始されたとか。もう少し早ければ、
    間に合ったのに、、、。

    わたしがAditus Consulting(開発元)から購入した料金よりは
    若干安いかも。
    日本語でサポートしてくれるのはいいかもしれませんね。

    May 23

    アップロードするファイルのサイズ指定

    わたしは、ある言語を勉強するときまずは入門書を読むところ
    からはじめるのですが、少しプログラムを書けるようになってから
    読み直すとよくわかります。

    今、PHPの本を読み直しています。
    ファイルのアップロードのところを読み直して冷や汗を流しています。
    「サーバが受信することができる最大のファイルサイズの指定は、
    ファイル名入力フィールドの前に置く必要がある」

    なんて気付きませんでした。びっくりしました。勉強になります(汗)

    May 17

    可変変数

    PHPには可変変数というのがあるのですが、これって便利ですね。

    たとえば、『$a = "val";』とやると、次の2つは同じ意味になるんです。
      $$a = "Hello";
      $val = "Hello";
    つまり、動的に変数が作れるということです。動的に変数がつくれない
    かなぁと探しているときに発見しました。でも、配列で事足りたので
    出番がありません。残念。

    可変変数について、詳しくはこちら: 
    http://www.php.net/manual/ja/language.variables.variable.php

    May 11

    Fatal error: Maximum execution time of 30 seconds

    先日遭遇したエラーをご紹介します。

    【現象】
     データベース(MySQL)にデータを挿入するスクリプト実行中
     に画面(Webブラウザ)が真っ白になってしまいます。
     データベースには、途中までデータが挿入されています。
     何が起こったかわからなかったのですが、何度か繰り返すと
     次のようなエラーが出ました。 

      Fatal error: Maximum execution time of 30
             seconds exceeded in xxx.php
             on line 97

    【原因】
     処理するデータ量が多かったため、処理時間が許容値を
     超えてしまい、スクリプトがパーサにより強制終了された
     ようです。

    【解決策】
     php.iniを変更することで解決しました。
       変更前:max_execution_time = 30
      変更後:max_execution_time = 120

      max_execution_time は処理の許容時間を設定します。単位は
      秒です。0を設定すると制限なしになります。
      これは、サーバーが占有されないようにするためにある設定だとか。

      他にもスクリプト実行前に set_time_limit(秒数) を追加する方法も
      ありました。


    まだまだ知らないことがいっぱいです。

    May 10

    fgetcsv()で読み込みエラー

    日本語って扱いにくいですね。
    今日は2バイトコードの『5c』でつまづいてしまいました。

    【現象】
     fgetcsv()を使ってCSVファイルのフィールドを処理しようとして、
     うまく処理できませんでした。
     CSVファイルの内容は次のようなものです。
      ・CSVファイルの文字コードはSJIS
      ・『機能』という文字が含まれる

    【原因】
     『能』の2バイト目が 5c なので、エスケープとみなされ『能"』までが
     データとして読み込まれていました。

    【解決策】
     CSVファイルをEUCで作成してもらおうかと考えています。

    ★ここから情報をいただきました。ありがとうございました。
    [PHP-dev 868]fgetcsvてゆーか、ファイル入出力の、5cの罠
    [PHP-dev 874]Re: fgetcsvてゆーか、ファイル入出力の、5c

    April 18

    JpGraphのライセンスを購入しました

    JpGraphのライセンスをやっと購入しました。
    JpGraphは、Aditus Consulting という海外の企業が開発していて、ライセンス料の支払いはユーロで、とホームページに書かれていました。

    わたしは英語に全く自信がなく、この企業は日本に代理店がないので「どうしよう...」と思っていたのですが、海外のソフトを代理で購入してくれる企業があることを知り、ここにお願いしました。

    その代理購買会社は、見積もり依頼(メール)を出した日に回答をくださり、注文書を送付して数日後にライセンス発行の連絡をくださり、と、とても迅速にまた丁寧に対応してくださいました。請求書もちゃんと発行してくださるので、日本円で支払いもできます。手数料もそれほど高くありません。とても助かりました。(※今は請求書待ちです)

    ライセンスも購入したし、これで安心して販売できます。
    いろんな商売があるものなんですねぇ。

    March 08

    JpGraphのガントチャートで文字化け

    JpGraphのガントチャートで日本語が文字化けする現象に遭遇してしまいました。

    【現象】
     PHPのバージョンをアップすると、今までちゃんと表示されていた日本語が文字化けしました。
     ※Windowsにインストールしています。
       アップ前:PHP4.3.9  + マルチバイト対応版PHP-4.3.9
       アップ後:PHP4.3.10 + マルチバイト対応版PHP-4.3.10

    【原因】
     よくわかりませんが、php_gd2.dll が原因のようです。

    【解決方法】
     php_gd2.dll をオリジナル(マルチバイト対応版適用前)のものに戻すと文字化けが解消されました。

    ちなみに、マルチバイト対応版PHP-4.3.10 (v.1.0a,2.2MB) もインストールしてみたのですが、文字化けは解消されませんでした。もしかしたら、わたしの設定方法が間違っているのかも知れません(汗)

    March 07

    JpGraphのガントチャート(図の設定方法)

    今日は覚書です。

    // ガントチャートの期間(スケール)を指定
    $graph->SetDateRange('2004-09-27','2004-10-25');

    // ガントチャートの線の色
    $graph->SetBox(true,'yellow:0.6',2);                  //外枠
    $graph->scale->divider->SetColor('yellow:0.6');  //見出しを区切る線(行見出し)
    $graph->scale->dividerh->SetColor('yellow:0.6'); //見出しを区切る線(列見出し)

    //バーの設定
    $bar = new GanttBar(0,"","2004-10-03","2004-10-20");
    $bar->SetPattern(BAND_RDIAG,"yellow"); //バーのパターン(右斜線、左斜線など)
    $bar->SetFillColor("white");   //バーの色
    $bar->SetColor('yellow:0.6');  //バーの枠線
    $bar->SetHeight(8);              //バーの高さ
    $bar->progress->Set(0.3);     //進捗の線(この設定では30%まで線が引かれる)
    $bar->progress->SetPattern(BAND_RDIAG,'blue'); //進捗の線のパターン
    $bar->progress->SetFillColor("blue"); //進捗の線の色

    // マークの設定
    $bar->rightMark->SetType(MARK_FILLEDCIRCLE); // ←他にMARK_STARなどもあります(JpGraph.php)
    $bar->rightMark->SetFillColor("red");
    $bar->rightMark->SetColor("red");
    $bar->rightMark->SetWidth(10);
     
    // マークのタイトル
    $bar->rightMark->title->Set("A");        // 文字
    $bar->rightMark->title->SetColor("white");
    $bar->rightMark->title->SetFont(FF_ARIAL,FS_BOLD,10);
    $bar->rightMark->Show();

    $graph->Add($bar); ←最後にこれを忘れずに。

    February 07

    アドレスにセッションIDが表示される

    PHPLIBを使っているのですが、「ログイン画面でアドレスにセッションIDが表示される」という指摘がありました。まだまだWebアプリ初心者のわたしは、表示されているのは知っていましたが「そんなもの」だと全然気にしていませんでした。でも言われると気になるかも。
    ということで、今日は「セッションIDを表示させない」にチャレンジです。

    【方法】
    local.inc に書かれているSessionクラスの $fallback_mode を 書き換えました。
    ($fallback_modeは、$modeが動作しない場合のセッションID伝達のモードです。)
      変更前: var $fallback_mode = "get";
      変更後: var $fallback_mode = "";

    上記の設定にするとセッションIDは表示されなくなりました。

    【解説】
    こちら「Re: PHPLIBのログインフォームを外部に持ちたい」にわかりやすく書かれていました。
    (以下引用させていただきました)
    fallback_modeが指定されていると、同じページが2回アクセスされるからなんですね。
    1回目のアクセスではセッションIDをクッキーにセットし、
    Locationヘッダーで、もう一度強制的に自分自身にアクセスさせます。
         (途中省略)
    クッキーがOffになっていると、セッションIDが失われてしまうため、
    Locationヘッダーで指定するURLに
    PHPSESSID=xxxxxxとしてIDを埋め込み、持ち回らせようとします。

    なので、必ずcookieを使用するのであれば、$fallback_mode = ""でよいってことだと判断しました。

    February 01

    ファイルのダウンロードの[開く]でエラー

    久しぶりにPHPを触っています。ちょっと問題があったからなのですが...。

    【現象】
    ファイルをダウンロードするダイアログで[開く]ボタンをクリックすると、
    「'c:\Documents and Settings\...\...\xxx.txt'が見つかりません。ファイル名およびファイルの保存場所が正しいかどうか確認してください。」
    というメッセージが出ます。[保存]ボタンをクリックすると正常に保存され、ファイルを開くことができます。

    【原因】
    キャッシュを無効にしていたからのようです。

    【解決策】
    ダウンロードのところに次のヘッダー送信を追加しました。
      header("Cache-Control: private");
    これで「開く」ことができるようになりました。
    ちなみに php.ini の session.cache_limiter nocache にしています。

    こちらからヒントをいただきました。ありがとうございました。

    January 17

    ファイルアップロード処理時のMIMEタイプ(続報)

    先日(1/14)ご報告したタイトルの件ですが、アップロードした後にMIMEタイプを調べることにしました。
    (サーバーの OS は Windows です)

    【方法】
    mime_content_type 関数を使います。

    【設定など】
    (1)ソースに追加
     
    数台のPCからアップロードしたところ、csvファイルのMIMEタイプは "application/octet-stream" "text/plain" のどちらかになるようでした。
    また、Microsoft Access のMDBファイルをアップロードしたときのMIMEタイプは $_FILES['userfile']['type'] は "application/msaccess" 、mime_content_type関数は "" (空文字)でした。
    なので次のようにしてみました。(※あまり細かいことは気にしないでくださいませ。<(__)>)

     ----- ↓ ここから ↓---
          :
     $filetype = $_FILES['userfile']['type'];
      $tmp_file = $_FILES['userfile']['tmp_name'];
          :
      $filetype_tmp = "";
      if ($filetype == "application/octet-stream") {
       if (function_exists('mime_content_type')) {
         $filetype_tmp = mime_content_type($tmp_file);
       }
     }
     else {
       $filetype_tmp = $filetype;
     }
          :
     ----- ↑ ここまで ↑---

    (2)php.ini の変更
     
    mime_content_type関数を使うには、次の設定が必要でした。(Windows の場合)
     ・430行目あたり
      [変更前] extension_dir = "./"
      [変更後] extension_dir = "c:/php/extensions"
     ・567行目あたり
      [変更前] ;extension=php_mime_magic.dll
      [変更後] extension=php_mime_magic.dll
     ・475行目あたり (※これはどこでもよいです)
      [変更前]
      [変更後] mime_magic.magicfile = "C:\php\magic.mime"


    【コメント】
     あまり自信がありませんが、とりあえずこんな感じにしました。その後問題などあればごまたご報告します。