The mysql driver is not currently installed と言われて怒られた話。

今日、Zend Frameworkで組まれたWebアプリを動かしたらこんなエラーが出た。

Fatal error: Uncaught exception ‘Zend_Db_Adapter_Exception’ with message ‘The mysql driver is not currently installed’

mysqlドライバーがインストールされてないから使えませんよ>< ってことかなぁ。phpinfo()で状況を見たら、確かにmysqlモジュールは読み込まれてなかった。

昨日までは動いていたんですけどね(´;ω;`)  とりあえずphp.iniにextensionでmysql.spやらpdo_mysql.soあたりの記述がされてないなかなーと思って見てみたけどそれもしっかり書かれていた。

PHPだけじゃないかもしれないと思い、Apacheのエラーログをみてみると、なんだか怪しい記述を発見。

PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php/modules/mysql.so’ – libmysqlclient.so.15: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php/modules/mysqli.so’ – libmysqlclient.so.15: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php/modules/pdo_mysql.so’ – libmysqlclient.so.15: cannot open shared object file: No such file or directory in Unknown on line 0

おお……問題の箇所どんぴしゃりなエラーですな。共有オブジェクト「libmysqlclient.so.15」が開けませんよ~ということですかね。
試しにfindコマンドでこのファイルを探してみたら、/usr/lib/mysql に入っていました。コイツ自体はシンボリックリンクの模様。実体は「libmysqlclient.so.15.0.0」っていう名前でした。

ファイルはあるのに読み込めないということは、リンクを繋ぎ直してやればいい、ということで、ldconfigコマンドで共有オブジェクトのリンクを更新してみました。

# ldconfig -v | grep libmysql

しかしお目当ての文字列は出てこず。

設定ファイルであるld.so.confの中身を見ると、以下の記述がありました。

include ld.so.conf.d/*.conf]

操作していた当時は特におかしいと思わなかったのですが、「]」って本来いらない文字列ですよね。
この時はどうしても読み込まないので、デフォルトの共有ディレクトリ直下(/usr/lib)に「libmysqlclient.so.15」をコピーしました。

# cp /usr/lib/mysql/libmysqlclient.so.15 /usr/lib

これでまたldconfig -v | grep libmysql をやってみたら、やっと出て来ました;;

Webサーバーを再起動して一応一件落着。

解決した後、ld.so.confの怪しい記述を修正してみました。

include ld.so.conf.d/*.conf

この状態でもう一度ldconfigを実行したら、しっかり出てくるようになりました!

# /sbin/ldconfig -v |grep libmysql
libmysqlclient_r.so.15 -> libmysqlclient_r.so.15.0.0
libmysqlclient.so.15 -> libmysqlclient.so.15.0.0
libmysqlclient_r.so.15 -> libmysqlclient_r.so.15
libmysqlclient.so.15 -> libmysqlclient.so.15

ダブってしまっているので暫定的に作ったリンクは削除して、重複を解消して今度こそフィニッシュ。

間違いの元は記述ミスだったんですね……まじつらいわ(´;ω;`)

wsdl2php を使ってSOAPクライアント用PHPスケルトンコードを生成してみる。

「SOAP?WSDL?なんのことかさっぱりわからんちん( -ω-)」状態から半日過ぎ、WSDLと言われる呪文を唱えてWebサーバーとやり取りするんだな、というところまでようやくたどり着きました。

そこで、サーバーに司令を送るためのクライアントを、SOAPサーバーが参照しているWSDL文書をもとにシコシコ書いてたんですが、数行書いたところで早くも折れましたorz

そういえば、風のうわさによれば、Java界隈には「wsdl2java」という、手書きでいちいち書くのを数秒かからずに終わらせてくれる魔法のようなツールがあるというではないですか!
こ、これはもしや「wsdl2xxx」のノリでPHPでも出ているのでは!?とグーグル先生に聞いてみたら、ほんとにそのままのネーミングでありましたwww

wsdl2php – http://www.urdalen.no/wsdl2php/

いかにもパパっと手早くやってくれそうな感じがしますね!!ちょーわくわくしますね!!でも日本語の記事が無いんですね!(´;ω;`)

仕方ないので、俺の雰囲気英語力でそれっぽい記事を読んで見ることにしました。以下に続く使い方はこの記事に書いてある内容と同じなので、読める人はそっちを読んだほうがいいですよ!

IT Workarounds: Simple SOAP client with wsdl2php using WSDL – http://itworkarounds.blogspot.jp/2011/10/simple-soap-client-with-wsdl2php-using.html

ちなみにうちの鯖の環境はこちら↓。

  • CentOS 5.7
  • apache 2.2.3
  • PHP 5.3.3
  • php-pear 1.4.9

※すべてLinuxのコマンドライン上での操作です。
はじめに、公式サイトのsourceforgeから最新のpear.tgzファイルをDLしてきます。

pear install コマンドでインストール。

インストールに成功したら、「wsdl2php」コマンドが有効になっているはずなので、wsdlファイルのパスを投げてPHPコードを生成します。

こうすると、カレントのディレクトリに生成されたPHPコードが置かれているはずです。

 

ここまで特につっかえることなく進んじゃいましたので、「できないよ~(´;ω;`)」って言われてもわかりません!ごめんなさい><

ではでは~(´・ω・)ノシ

[PHP] mb_ereg_match()は部分一致検索してくれないのね……

http://www.php.net/manual/ja/function.mb-ereg-match.php#86429

ユーザー投稿に書いてありますね。これをよく見なかったがために、数字一文字ひっかけるのにえらい苦労してしまいましたとさ(;ω;`)

以下、上記URLからの引用。

Note that this function matches a string from the beginning only (though not necessarily till the end):

<?php

$test = mb_ereg_match(“a”, “some apples”); // returns false
$test = mb_ereg_match(“a”, “a kiwi”);      // returns true

?>

If you want to check for a match anywhere in the string, use the wild-card & repeat operators .*

<?php

$test = mb_ereg_match(“.*a”, “some apples”); // returns true

?>

「この関数は前方一致しかしてくれないから、部分一致検索をしたいときは “.*” を使ってね!」 ということが書いてあると思います。多分。(しっかり読めてません)

まぁどうして引っかからないのか分かってよかったよかった(*´ω`)

ECCUBE 商品カテゴリをDBから手動で登録するときの注意点メモ

ECCUBEのカテゴリ管理でのお話です。

カテゴリのCSV一括登録機能では、category_id, category_name, parent_category_id フィールドが入ったCSVをアップロードして一気に登録します。新規登録ならば、色々と自動的に割り振っていい感じにしてくれるかと思いますが、更新目的で一括登録機能を使用すると、カテゴリの構成を大幅に変更したとき、いろいろと不都合が生じます。(その前にそんな大幅な変更が入らないようにしっかり構成にしろって話ですが……)

その時は仕方ないのでDBを直接操作することになると思いますが、そこでの注意点をいくつかメモっておきたいと思います。

ますは、dtb_categoryテーブルの構造です。

  • category_id
    カテゴリID
  • category_name
    カテゴリ名
  • parent_category_id
    親カテゴリID
  • level
    階層
  • rank
    ランク
  • creator_id
    作成者ID
  • create_date
    作成日時
  • update_date
    更新日時
  • del_flg
    削除フラグ

ECCUBEのカテゴリは、階層上に構成することができます。その際の階層レベルはlevelフィールドで設定します。一番上が1で、あとは2,3……と設定していきます。あるカテゴリの子供としてカテゴリを設定変更した際は、この辺の変更をしないとおかしくなります;;

そして、おそらく一番面倒なのが順番の設定だと思います。rankフィールドの変更です。 ほかのECCUBEのテーブルと同様、降順で番号を割り振ります。つまり、番号の大きい順から並んで「1」がリストの一番下に配置されます。

……なんだかいちいち説明するのがめんどくさいので結論から言いますと、親カテゴリ「お菓子」のrankが10だとしたら、その子供になるカテゴリは 9,8,7 という具合に、親の連番としてrankを割り振った方が変な表示になりにくいです。どうしても連番にならなければ、親カテゴリと子供カテゴリの間には、別のカテゴリは入り込まないように注意するべきです。 処理上は問題ないみたいですが、表示上では別のカテゴリが紛れ込んでいるかのような見え方になってしまいます。

自分が実際に行ったやり方は、level1の親カテゴリには、あらかじめrank200個分ぐらいの間隔を取って番号を割り振り、その範囲の中で子カテゴリに番号を割り振っていきました。 こうすれば別のカテゴリ同士が混じることはないと思います。

なんだかごちゃごちゃな説明ですが、とりあえずこの辺で……

[PHP]大量の配列をPOST/GETで渡す時に、要素が途中で切れて、すべて渡せない件。

分かった今はなんてことないのですが……(・ω・`)

PHPで大量のパラメータをPOSTで送ろうとする(自分の場合は1160個程度)と、こんなエラーが出てきました。

Warning: Maximum number of allowable file uploads has been exceeded in Unknown on line 0

とりあえず調べると、php.ini内にある「max_input_vars」プロパティをいじくれよ!と公式ドキュメントに書いてありました。
http://php.net/manual/ja/info.configuration.php

自分のphp.iniを見てみると、どこにも書いていないのでとりあえず追加。

max_input_vars = 2000

ちなみにデフォルトの値は1000みたいです。普通ならこの数で十分足りるはずなんですけどね……。

ほんと、なんてことない話なんですけど、俺がこの問題にぶつかったときにいじくっていたのがECCUBEで、こいつは画面上にPHPのエラーをそのまま吐き出してくれないんですよね。
仕方ないのでapacheのエラーログを見てみると、明らかに怪しいエラーがわんさかあったので、それを手掛かりに解決できました。

……あれ、この記事を書いていて思ったんだけど、よく考えたら、ECCUBEほどのものなら、デバッグモードぐらい用意されてるんじゃないだろうか?

探してみたらありました。これで出てくるんじゃないかしらorz
http://web-karakuri.com/archives/2510