EC-CUBE::多数注文中にカートが空になる

MySQLを利用したEC-CUBEサイトで件名の不具合が出るようです。

原因はdtb_session.sess_dataの型がtextになっていて、文字列が足りなくなったために起こるようです。

EC-CUBEはsessionデータをDBで保存しており、serializeしたsessionデータを保存しています。

対策としては次のコードを実行する。

alter table dtb_session change sess_data sess_data longtext;

MySQLの仕様を確認したところ、文字列の長さは次の通り

text longtxt
65,535byte 4,294,967,295(4G)

私の環境では65kどころか1k程度でセッションが途切れてました。

writeする前に既に文字が途切れていた節もあって、この対応ですべて片付くかは微妙な所。

ひとまずこの対応で様子見をしてみます。

※SC_Helper_Session.sfSessWrite()の第2引数「$sess_data」がわたって来た時点で途切れていた。
※UTF-8環境で若干の日本語文字を含みます。

EC-CUBE3.0.x::xamppにインストール

php.iniを開いて次のエクステンションを有効にします。

extension=php_curl.dll
extension=php_fileinfo.dll
extension=php_openssl.dll

※私の環境だと上記でOKでした。
※エクステンションを有効にするにはxampp(apache)の再起動が必要です

あとはEC-CUBE2.x同様ルートディレクトリにアクセスすればインストールウィザードが表示されます。

ようこそ  EC-CUBEインストール

WinCacheはIIS上でしか動かないようなので無視してよさそうです。

EC-CUBE3.0.x::xampp環境でインストール時にエラー「RuntimeException in SecureRandom.php line…」

EC-CUBE3.0.xをインストールしようとしてhttp://localhost/install.phpにアクセスするとエラーが表示されました。
URLは「/install.php/step1」です。

■原因
opensslが必要なようなのでphpのエクステンション「php_openssl」を有効化しましょう。

■手順
php.iniの

#extension=php_openssl.dll

これのコメントを外して

extension=php_openssl.dll

として保存してください。

xamppを再起動すれば無事インストール画面が表示されるはずです。

PHP::先頭?が表示されるけどなんで!?

PHPでプログラムをしていてごくまれに先頭に?が表示されて「なにこれ。。。キモイ」って思うことがあります。

うん。。。あるんです。

どこで出力されてるやらさっぱり分かんない謎の「?」

その答えはきっと文字コードの問題。

UTF-8(BOM有)の保存形式になってないですか!?

UTF-8(BOM有)だと0xEF BF BF っていう3バイトの符号がファイルの先頭についてしまうんだそう。

先頭以外のところで?があったら、それはきっと「~」でしょう。
これを「~」が?になっちゃう問題を波ダッシュ問題って言います。

カテゴリー: PHP

PHP::複合チャートが作れるグラフライブラリ

PDF帳票で複合グラフチャートを出さなきゃいけなかったのでサーバサイドで画像を生成できるライブラリを探してみた結果を備忘として残します。

結果として3軸以上の複合チャートを実装できるPHPのグラフ・チャートライブラリは見つけられませんでした。

なので、ベースになるSVGのチャートを準備して、プログラム上から折れ線や棒グラフを実装することにしました。だって。。。この方が早いんだもん!w

惜しいところまでいったライブラリをご紹介

  1. pChart
    右左の2軸複合チャートまでは対応できるけど、3軸以上の複合チャートには対応できず。ライブリを継承した別機能を作らないとダメそうです。デフォルトテンプレートになるサンプルが26種類あってコードも比較的シンプルにかけて勉強・解析が楽でした。
  2. SVGGraph
    こちらも左右2軸の複合チャートまでは対応できるみたい。当然といえば当然だけど、グラフテンプレートはめ込み型のライブラリでした。
    なので、複雑なグラフでも自分でテンプレートを作れば何でもできちゃいそうな感じ。
    ただその為には内部構造を理解しながら。。。になるので勉強は大変かもしんない。。。

その他

  1. JpGraph
  2. vnStatPHP
  3. ezGraph component

その他にもPhantomJSっていうコマンドラインベースでwebkitエンジンを利用してHTML画面を画像化する手法もあるようなので、これを使えば、JSライブラリを使って画像を生成することもできるそうです。

— 2015/02/02追記

日本語文字を含むSVGをFPDIで取り込むと文字化けしてしまってこれが解決できず。。。
結局PhantomJSで画像かすることにします

ttcをttfに

フォントのお話しです。

.ttcというフォントは.ttfを複数まとめたファイル形式なんだって!

ってことは、分割もできちゃう。

UniteTTCってソフトでできるそうです。

PDT-Allinone XdebugでUnexpected termination of script

Windows7(64bit)でPDT-Allinone環境を入れてXdebugを利用した際に、「Unexpected termination of script,debugging ended.」と表示されてデバッグできない問題が発生しました。

  1. xdebugサイトからPHPバージョンにあったファイルをダウンロード(※1)
  2. DLした「php_xdebugxxxx」をphp/extに配置
  3. php.iniのzend_extensionを修正
  4. xamppを再起動

※1 xampp環境ではVC9 TS (32 bit)で正常に動作

カテゴリー: PDT

EC-CUBEのテンプレートを作る

EC-CUBEの管理画面から追加できるテンプレートパッケージを作成する方法

ディレクトリ構造として、次のようにパッケージングしtar.gzで圧縮する。

[root]—————data/Smarty/templatesに配置するもの(フォルダ名は任意)
 ├_packages———html/user_data/packages/配下に配置するもの(フォルダ名固定)

SVGをDOMでgetElementByIdするとnullになる

PHPでSVGを処理するときに、DOMDocumentオブジェクトのgetElementById()で目的の要素を取得しようとしたけど、nullになってしまってかなりはまりました。。。

結局のところ、SVGの仕様(DTD)としてid属性は宣言されていないので、idと書いてもID(識別子)として機能してくれません。
だからgetElementByIdでは取得できない。
ということのようでした。

じゃぁ、どうするか。なんだけど、PHPのDOMDocumentにはsetIdAttributeという関数があって、これがDOMにこの属性はIDだよ!って教えてくれて、getElementByIdで取得できるようになります。

PHPマニュアルにサンプルがありました。

全ての要素に定義されたidをIDとして登録するコードで、自分自身を再帰的に呼び出すことでツリー構造に対応しています。

function setAllId($DOMNode){
  if($DOMNode->hasChildNodes()){
    foreach ($DOMNode->childNodes as $DOMElement) {
      if($DOMElement->hasAttributes()){
        $id=$DOMElement->getAttribute("id");
        if($id){
          $DOMElement->setIdAttribute("id",$id);
        }
      }
      setAllId($DOMElement);
    }
  }
カテゴリー: PHP