PHP: バージョンアップできなくて使えない関数がある時の対応
2012年04月20日 16時03分
PHPがバージョンアップされて関数が増えたがサービスを停止するわけにもいかずPHPのバージョンアップができず使用できない。
こんな状況はないだろうか。
俺の場合は具体的にjson_decodeが使いたい。
でないとFacebookのSDKがFacebook needs the JSON PHP extensionってエラーが出て使用できない。
なんとかしたいなぁと思っていたらupgradephpというライブラリを発見した。
upgradephp
http://include-once.org/p/upgradephp/
バージョンアップされて追加された関数が定義されていない場合、追加されるという代物。
これインクルードしてからFacebookのSDKをインクルードしたらjson_decodeが定義されて問題なく処理できた。
こんなんあったんかぁ、素晴らしい。
ついでにFacebookが返すマルチバイト文字形式の\uxxxx形式が文字化けするので以下の関数をjson_decodeする前に通す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
// UTF-8文字列をUnicodeエスケープする。ただし英数字と記号はエスケープしない。 function unicode_encode($str) { return preg_replace_callback("/((?:[^\x09\x0A\x0D\x20-\x7E]{3})+)/", "encode_callback", $str); } function encode_callback($matches) { $char = mb_convert_encoding($matches[1], "UTF-16", "UTF-8"); $escaped = ""; for ($i = 0, $l = strlen($char); $i < $l; $i += 2) { $escaped .= "\u" . sprintf("%02x%02x", ord($char[$i]), ord($char[$i+1])); } return $escaped; } // Unicodeエスケープされた文字列をUTF-8文字列に戻す function unicode_decode($str) { return preg_replace_callback("/\\\\u([0-9a-zA-Z]{4})/", "decode_callback", $str); } function decode_callback($matches) { $char = mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UTF-16"); return $char; } |
facebook:fan pageのウォールに投稿された画像を一覧表示する
2012年04月16日 11時07分
ファンページのウォールに投稿した画像を自分のサイトに表示したいという要望があった。
上記ぐらいだったらSDK使わずに直にGraph APIのURL叩く方式で問題なく実装できたのでそのメモ。
アルバム一覧取得のAPI URL
http://graph.facebook.com/[ファンページID]/albums/
上記のURLを叩くとアルバム一覧がJSON形式で帰ってくるのでその一覧の中でtype属性がwallのデータのアルバムIDを取得する。
|
$album_list_cont = file_get_contents("http://graph.facebook.com/[ファンページID]/albums/"); $js = new Services_JSON(SERVICES_JSON_LOOSE_TYPE); $albums_arr = $js->decode($album_list_cont); if (!empty($albums_arr["data"])) { foreach($albums_arr["data"] as $crt_album) { if ($crt_album["type"] == "wall") { // ウォールに投稿されたデータ // $crt_album["id"]にアルバムIDが入っているので保持しておく } } } |
※PHPのバージョンが古いためjson_decodeが使えないのでPearのライブラリを使用している
次はalbumから画像を取得する手順。
アルバム一覧取得のAPI URL
http://graph.facebook.com/[アルバムID]/photos?limit=25&offset=0&fields=images
上のURLを叩くと画像一覧が取得できる。
offsetやfieldsパラメータは適せん変更するべし。
一回で取得できなかった場合は[paging][next]というパラメータに続きを取得するパラメータが入ってくるので拾うこと。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
$photos_cont = file_get_contents("http://graph.facebook.com/[アルバムID]/photos?limit=25&offset=0&fields=images"); $photos_arr = $js->decode($photos_res); $next_page_url = "first url"; while ($next_page_url != "") { $next_page_url = ""; foreach($photos_arr as $crt_photo_key => $crt_photo_val) { switch ($crt_photo_key) { case "paging": $next_page_url = isset($crt_photo_val["next"]) ? $crt_photo_val["next"] : ""; break; case "data": $crt_image_arr = get_image_infos($crt_photo_val, $thumb_size_set); $image_arr = array_merge($image_arr, $crt_image_arr); break; default: break; } } if ($next_page_url != "") { $photos_res = file_get_contents($next_page_url); $photos_arr = $js->decode($photos_res); } } // とりあえずブラウザ表示 for ($img_idx = 0 ; $img_idx < count($image_arr) ; $img_idx ++) { echo "<img src='{$image_arr[$img_idx]['source']}' />\n"; } |
サンプルURL
http://www.crossl.net/blog/pg_sample/fb_album_image/wall_images.php
※うちの会社のブランドです。
別にアルバムを作ってしまうとtypeがwallではなくnormalになるのでこの方法では取得できない。
あくまでアルバムwallの画像一覧になる。
Webの資料を調べるけど結局は本家が一番わかりやすいという罠。(英語ですが…)
Graph API参考
http://developers.facebook.com/docs/reference/api/album/
Windows7のプログラムアイコンの表示がおかしい
2012年03月27日 10時52分
Windows7のプログラムアイコンが何も関連付けが無い状態のやつになってしまった。
こんなの →
再起動しても治らないので「Windows7 アイコン 表示されない」と検索してみると一番最初にMicrosoftのヘルプページが表示された。
「Microsoft/Windows 7 および Windows Vista のスタート メニューやエクスプローラ内の表示で、一部のアプリケーションのアイコンが適切に表示されないことがある」
http://support.microsoft.com/kb/958740/ja
どうやら一般的な症状のようだ。
記載されている「手順1.画面の表示色を変更する方法」で治るかなと思って試してみたら見事に治った!
なので元の色数(32bit color)に戻してみたらまたアイコンがダメになった。
ずっと色数変えてないといけないなんて意味が無いので他の手順を試してみることにする。
「手順2.セーフ モードで起動する方法」より「方法3. IconCache.db ファイルを削除する方法」の方がお手軽そうだったので手順3を行うことにしてみた。
手順.3の要約は「普通にキャッシュファイルを削除して再ログオンする」って書いてある。
なんの問題もなく以下のパスからIconCache.dbを発見し削除。
|
%systemdrive%\ユーザー\<ログオン ユーザー名>\AppData\Local\IconCache.db |
その後、再ログオンしてみたら、、、治っていない。
何故???
と思って検索結果の他のページを調べてみると、どうやらファイル削除後にIconCache.dbという名前の空ファイルを作成しておくと上手くいくという情報があったので試してみたらうまく表示された。
なのでアイコンを復旧させるには以下の手順がお勧めです。
- %systemdrive%\ユーザー\<ログオン ユーザー名>\AppData\Local\IconCache.db ← 削除
- %systemdrive%\ユーザー\<ログオン ユーザー名>\AppData\Local\ にIconCache.dbという空ファイルを新規作成する。
- 再ログインする
※2013/07/01 追記
IconCache.dbの再作成という手順だけでは改善せずに「手順1.画面の表示色を変更する方法」と合わせて行うと改善したという報告を2件頂いてます。
上の手順だけで改善しなかった場合は表示色数変更も合わせて試してみると改善するかもしれません。
IconCache.dbファイルが無いという場合は隠しファイルが非表示の設定になっている可能性があるのでフォルダオプションから隠しファイルを表示するように設定を変更してください。
PHP:csvファイルの読み込みでfgetcsvを使用すると文字化けする対応
2012年03月23日 12時56分
phpにはcsvを読み込むfgetcsvという標準関数があるがマルチバイト系の処理に難がある。
ちょっとググってみるだけでもかなりの情報が出てくるので日本語を含むcsvを読み取るには使用しない方が無難。
じゃあどうするか、自分で作るかなぁとしぶしぶ手をキーボードにやりかけた所、
やっぱり思うところはみんな一緒らしく先人の方が素晴らしい関数を作成して公開してくださっている。
yossy.blog / PHP5でfgetcsvが正常に動作しない
http://yossy.iimp.jp/wp/?p=56
ここに記載されているfgetcsv_regをfgetcsvの変わりに呼び出せば万事OK。
mysqlで外部クライアントから接続ができない!?
2012年03月21日 20時12分
開発用MVのmysqlにローカルから接続できるが外部から接続できなくて悩んだのでメモ。
ターミナルからコマンド打てばすんなり接続できるのにWindows PCのWorkBentchからの接続は拒否される。
iptables等を切っても駄目。
何故?と悩んでたらどうやらユーザ作成のQueryが正しくなかったようだった。
|
GRANT ALL ON *.* TO user@'%' IDENTIFIED BY 'password'; |
上だと繋がらない…下のようにPRIVILEGESを追加すると意図した通りに動く。
|
GRANT ALL PRIVILEGES ON *.* TO user@'%' IDENTIFIED BY 'password'; |
※勿論、FLUSH PRIVILEGESを忘れずに!
このブログにも当てはまりますがググって簡潔に書いてあるページを見てそのまま鵜呑みにする前に公式ページを確認しようという話でした。
でもmysqlの場合は公式サイトの情報が多いのでいいけど公式の情報が少ないものも多いのでTips系Blogにはいつもお世話になっています…