2013年05月24日

PHPで白紙ページが表示され、デバッグできない

サーバーを変えてからというもの、なぜかPHPのエラーが表示されなくなり、困っていました。
エラーが表示されないのはサービス後に予期せぬエラーでみっともないコードがでているのも恥ずかしい、PHPの設置パスがわかってしまうなど問題ですが、逆にエラーが出て無ければ正常に稼働しているものと思って気が付かないという、どっちかというデメリットのほうが大きいと思うんですが。。。

ともかく、レンサバなのでphp.iniも変えられず、とりあえずネットで調べた情報で
php_flag display_errors On

と.htaccessファイルに入れてみましたが効果なし。
どうも現象を見ると、関数が存在しないといったエラーは表示されますが、最後の「;」を書き忘れた場合にエラーが表示されないなどレベルがある模様。

エラーレポートについては、php.iniの
display_errors

で調べられるのでここがOFFになっていたら上記のphp_flag display_errors Onで有効にできるようです。

それともう一つ、php.iniにerror_reportingという項目がありますが、ここの値によってレポートする内容を変えられるようです。具体的には
http://blog.syuhari.jp/archives/162
こちらに書いてありましたが、現状6131でした。
つまり、全部のエラーから「E_NOTICE」「E_WARNING」「E_ERROR」を抜いていた状態だったということで、
.htaccessを
php_value error_reporting 6135

にして解決!
posted by BigMoonEz at 12:43 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2013年05月20日

GDのimagettftextで文字化け

なんかすごく意味不明でむかついたのでメモっておきます。

GDで画像に文字を重ねる処理をしていましたが、レンサバのプランを変えたら動かなくなりました。
いろいろ調べなおしていると、imagettftextはUTF-8でデータを渡さなければいけないということですが、もともとUTF-8で書いているページでこれは問題なし。他の値もきちんと渡しているのに

any2eucjp(): invalid code in input string・・・


とエラーが出ています。
で、2,3時間かかってやっとみつけたのがこちらの
せりかブログ [php] imagettftext
にあった
[JIS-mapped Japanese Font Support]がサポートされている時は,内部で勝手にエンコードを変換してくれるため,エンコードしておく必要はありません.というより,'UTF-8'でエンコード済みの文字列を渡すと化けます.なので,文字列が'UTF-8'の場合,意図的に'SJIS'に変換してから渡す必要があります.

という・・・
し、しかし、文字をSJISにしてその後GDに渡してもPHPのエラーは解消するものの今度は文字化けがしますが・・・

これに関する回答は見つけられず、結局はページ自体をUTF-8からEUC-JPに直し、EUC-JPで渡した所、ページも文字化けも問題なくなりましたとさ。

こんな解決方法でいいんだろうか・・・
タグ:gd PHP
posted by BigMoonEz at 20:12 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2013年03月28日

複数のサイトのRSSを読み込んで新着順に表示する

GoogleのRSSリーダーが廃止になる・・・ということでというわけでもないのですが、サイトのリニューアル時に関連する技術関係のRSSがまとめて表示されたらいいなぁと思って、そのような機能をPHPで実装してみました。
PHPでRSSリーダーというと、simplexml_load_fileがうんたらかんたらという記事が多いのですが、やりたいことは、
・複数のサイトのRSSを取得して
・最新順に並び替えて表示
だったのですが、なかなか同じようなことをやっている人が少なく、自分で組んでみました。

ポイントは
・RSSはサイト(もしくはサービス)によって出力が異なる
・simplexml_load_fileは非常に簡単にRSSを取得して吐き出せる反面、複数のサイトに対応させようとすると面倒
・オレPHP得意じゃなかった・・・!
というところです。

で、まぁ最後はなんでわざわざそんなこと書くかというと、もっといい書き方があるんだろうけどわからないのでこう書いたわけですが、以下のサイトを参考にしています。

・ウェブ学のすすめ - PHPのsimplexmlで複数のブログのRSSを読み込み新着順に表示する方法
・FOOTMARK - PHPでRSSを読み込む方法

どちらのサイトも基本的に同じ事をやっています。
「ウェブ学のすすめ」さんからは、複数サイトからのデータ抽出の仕方、「FOOTMARK」さんからは、allow_url_fopenがOFFの場合の処理の仕方&RSSによって書き方が変わるんだということを学ばせて頂きました。

んで結局どうなったのよ、というのが以下のコードですが、ちょっとお恥ずかしい・・・
知識のなさが浮き彫りですが

<?php
//1・・・はてブ、2・・・Wordpress
$rss_url = array(
'http://d.hatena.ne.jp/*****/rss<>1',
'http://********.com/feed<>2',
'http://www.******.com/feed/<>2'
);

function curl_get_contents( $url, $timeout = 60 ){
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_HEADER, false );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
$result = curl_exec( $ch );
curl_close( $ch );
return $result;
}

foreach ($rss_url as $url) {
$count = 0;
$buff=explode("<>",$url);

if(trim($buff[1])==1){
$result=curl_get_contents(trim($buff[0]), 120);
$rss = simplexml_load_string($result);
$site_title = $rss->channel->title;

foreach ($rss->item as $item) {
if ($count == 2) { //そのサイトから取得したい記事数
break;
}
$count++;

$link = $item ->link;
$title = $item ->title;
date_default_timezone_set('Asia/Tokyo');
$dc = $item ->children('http://purl.org/dc/elements/1.1/');
$day = date('Y/m/d',strtotime($dc -> date));
$key = date('YmdHi', strtotime($dc -> date));
$entryArr[$key] = "<li>$site_title - <a href=\"$link\" target=\"_blank\">$title</a>$day</p></li>\n";
}
} else if(trim($buff[1])==2){
$result=curl_get_contents(trim($buff[0]), 120);
$rss = simplexml_load_string($result);
$site_title = $rss->channel->title;
foreach ($rss->channel->item as $item) {
if ($count == 2) { //そのサイトから取得したい記事数
break;
}
$count++;

$link = $item ->link;
$title = $item ->title;
$day = date('Y/m/d',strtotime($item -> pubDate));
$key = date('YmdHi', strtotime($item -> pubDate));
$entryArr[$key] = "<li>$site_title - <a href=\"$link\" target=\"_blank\">$title</a>$day</p></li>\n";
}
}
}
krsort($entryArr);

foreach ($entryArr as $key=> $val) {
echo $val;
}
?>


いくつかポイントになる点があります。

先頭の「$rss_url = array()」の中にはRSSを取得したいページのURLを入れておきます。
以降で振り分けるため、ここでははてブを1、Wordpressで出力しているページを2として、
FeedURL+<>+番号
の形式で$rss_urlに突っ込んでいます。
違う形式のものがあれば、それも新たに登録が必要です。
あとで<>をexplodeして前後を振り分けているのですが、そんなことするんなら連想配列使えば?という人はそうしてください。(強気)

で、foreach ($rss_url as $url) {}内で、はてブの場合はこの項目をこう、Wordpressの場合はこの項目をこう・・・という処理をしています。
ここも・・・もうちょっといい方法があるんじゃないかなーと思ってますが、いい方法が思い当たらなかったので///

最終的には日付を$keyにして$entryArrに突っ込んでいます。
で、元の「ウェブ学のすすめ」さんでは、arsort()でソートしていますが、日付でソートしなければいけないので、krsortの間違いだと思われます。

これの欠点といえば、いちいちそのRSSがどのような構造になっているかを判断して登録しないといけないというところです。
もうちょっと楽に登録出来ればいいんですが。。。
posted by BigMoonEz at 16:22 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2010年03月26日

PHPで境界線を描く

PHPで境界線を判別するプログラムを作ろうと思ったのはいつのことだったか・・・
構想から含めたら1年以上かかったような気がしますが、本日ようやくサービスインしました。
画像から境界を判別して線を描く・・・すなわち「ぬりえメーカー」です。
GDでこんなライブラリを提供してくれればなぁと思うのですが、ないものは仕方がないので、いろいろ試行錯誤しました。

簡単に説明すると、閾値を使って2極にわけ、その境を描画してあげることで境界線を描いているように見せています。
なので、閾値の設定によっては色が異なっていても境界と判別されなかったりします。
特に写真は弱いですね。ベタな塗りのイラストだと結構きれいにぬりえとして出力してくれます。

http://www.oyogu.com/nurie/index.html
タグ:PHP 境界 gd 閾値
posted by BigMoonEz at 13:37 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2010年01月26日

imagettftextの「Warning: Could not find/open font・・・」と表示される問題の解決方法

ココのサービスで、サーバーを変更したら
Warning: Could not find/open font・・・というエラーが出て困ってしまったハナシです。
困ったらGoogle先生に聞くのもいいんですが、マニュアルもよく読みましょう、ということで答えはマニュアルにありました。

引用:phpマニュアル
PHP が使用している GD ライブラリのバージョンに依存しており、 fontfile が / で始まらない場合、ファイル名に .ttf が追加され、 ライブラリはライブラリが定義したフォントパスから ファイル名を検索しようとします。

ということで、このようなエラーが出た場合、フォントまでのフルパス(サーバーの絶対パス)指定を試してみてください。

また、imagettftextで文字化けする場合は、UTF8で値を渡していないために起こるようです。
文字コードをUTFにする、もしくはmb_convert_encodingなどでUTF8に変換してから値を渡してあげてみてください。


posted by BigMoonEz at 22:47 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2009年05月08日

バナーを作ろう!

いろいろ無料のバナーサイトを見て回ると、あまりいいデザインのないなー(関係者のかたスイマセンがく〜(落胆した顔))かわいいのならあるんだけど。と思って毎度のごとくPHPの勉強もかねて作ってみました。

バナーを作ろう!というなんのひねりもないタイトルですが、直感的に使えるようにしてみました。
まだベース画像の数が少ないですが、今後ちょこちょこと更新していくつもりです。
posted by BigMoonEz at 10:22 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2009年03月28日

一つのフォームで複数のSubmit処理を行いたい

そんな場合は、
<input type="image" name="hoge1">
<input type="image" name="hoge2">

として処理を分けることができますが、今回お伝えしたかったのは、受け取る側の処理でして、PHPでこの処理をしようと思うと、
if($_POST["hoge1"]){
  ・・・
}

なんてやりがちですが、これでは動きません。
input type="image"は、クリック時の座標をPOST先に渡すことでも知られていますが、実はこれを利用して
if($_POST["hoge1_x"]){
  ・・・
}

とします。
ちょっとひっかかったので^^;
posted by BigMoonEz at 22:51 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2009年02月18日

画像加工サイト第2弾!

携帯の待ち受け画像加工サイトに続き、第2弾!
アップロード画像に格子をつけて、方眼紙を作るサイトを公開しました。

実は昔、Windowsアプリで作ったものがあったのですが、刺繍や爪楊枝アートなどで使用されているようで、作者の意図したものと違う使われ方をしておりますが^^;、みなさんのお役にたっているようなので、より簡単に使えるようにWeb版を作成しました。

まぁ普通はあんまり使う機会はないと思いますが^^

これはPHPのGDを使って格子を作るという簡単なものですが、いろいろと悩むところもあったので、またボチボチTipsを公開していきます。
posted by BigMoonEz at 18:07 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

変数の型が整数型かどうかを調べる

PHPで、とある変数が整数型かどうか調べるには
is_int
を使います。
ところがブラウザから渡されたデータはすべて「文字列」として扱われるので、is_intではfalseが返ってしまうんですね。
気づかずにだいぶ悩んでしまいました。
ブラウザから渡された値の場合は、is_numericを使用するか、一度値をint型に変換してからis_intを使用されるのが良いかと思います。
posted by BigMoonEz at 14:52 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2009年01月07日

PHPのurlencodeでなぜだか最後の1文字がエンコードされない問題

POSTされたデータをURLエンコードして、別なページにPOSTするPHPを作ってたんですが、なぜかエンコードした文字列の最後の1文字分が足りない。
例えば、
%E3%83%A1%E3%83%A2%E3%83%AA

%E3%83%A1%E3%83%A2
になる感じなんです。
おっかしーなーおっかしーなーと悩むこと数時間、やっと原因をみつけました。

.htaccessを設定していたのですが、
php_value mbstring.language Japanese
php_flag mbstring.encoding_translation On
php_value mbstring.script_encoding SJIS
php_value mbstring.internal_encoding SJIS

php_value default_charset SJIS
php_value mbstring.http_output pass
php_value mbstring.http_input SJIS
と設定して、文字コードが異なっていたためでした。
posted by BigMoonEz at 16:05 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2008年12月28日

携帯の待ち受け画像が作れるサービス

こんなん作ってみました
自分のPCにある画像をケイタイに転送するサービス。
もちろん、縦横のサイズは自動判別してちょうどいいように変換します。
従来のサービスと違うのは、
・画像を斜めにできる!
・背景画を好きな色で塗りつぶせる!
・変換画像を公開できる!
といったところです。
特にヒトの作った画像はなかなか面白いのでいろいろ試してみてください。
ちょっと対応機種が最新機種にかたよってしまっているので、徐々に古い機種にも対応させていきます。
あと、携帯サイトのほうにもデザイナーが作った待ち受け画像を徐々に増やしていく予定です。

それから、これを作った過程でいろいろ勉強しましたので、その辺のTipsも紹介していきたいと思います。
お正月の暇つぶしに是非どおぞ!^^;
posted by BigMoonEz at 23:38 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年06月14日

サイトが正常に表示しているかどうかを監視するスクリプト

最近、立て続けに管理しているサイトが表示できない問題がありました。
ドメインの更新忘れとか、ファイルの転送間違いとか原因はいろいろあるのですが、サイトが正常に表示されているかどうかを調べるプログラムを作ってみました。
本来こういうのはUNIXのクーロンなんかで動作させるものだとは思いますが、そんな知識も持っていないのでPHPで作ってみました。

このスクリプトは、<meta>タグを使って自分自身を一定間隔でリロードさせ、指定されたページを読み込み、ページが読み込めなかったら指定のメールアドレスにアラートを送信するスクリプトです。

Ping送信させてチェックする方法も考えたのですが、サーバーが生きていてもページが表示されていない場合を想定してファイル読み込み方式をとっています。
反面、普通にhttpdでファイルを読みに行きますので、アクセスログに足跡が残ってしまいます。
設置したページから定期的にチェックしていることをそのサーバーの管理者に知られたくない場合は、チェック間隔を長くすることをオススメします。

【用意するもの】
24時間動作しているPC
PHPが動作し、メールが送れるサーバー(PHP4.2以上、上記PCで動作すればそれで可)

【設置方法】
1.まずはファイルをダウンロードし、テキストエディタで開いて修正します。

2.先頭の以下の部分を修正します。

//メール送信先
$mailto="user@server.jp";
サイトが表示できないときに送るメールの受信先を指定します。


//確認するドメイン
$domains=array(
"hogehoge.jp/index.html",
"hogehoge.com/",
);
確認するサイトのURLを先頭の「http://」を抜いて記述します。
複数記述する場合は「,」で区切ります。
サイトの指定は、ファイル名まできちんと指定したほうがよいです。


//メールのタイトル
$title="[alert!!] サイトの表示ができません";
エラー時に送信するタイトルを指定します。


//メール送信用文字エンコード
$enc="EUC";
メールの文字エンコードを指定します。
送信されるメールが文字化けしている場合は、ここを変更してください。
ページ自体のエンコードも合わせてください。


//調査する時間(分おき:秒で指定)
$ftime=3600;
サイトを確認する時間を指定します。


3.サーバーにアップロードします。

4.24時間稼動しているPCで設置したファイルをブラウザで表示します。
  その後は定期的に指定した秒数ごとにサイトを巡回します。

【注意】
本稼動に移る前に、必ず表示できないURLなどを登録してみて、きちんとメールが届くことを確認してください。

【利用規定】

  1. 個人・法人に限らず自由に使用することができますが、著作権は放棄していません。

  2. スクリプトを改造して利用することは自由ですが、改造後の動作については作者は一切の責任は負いません。

  3. スクリプトを再配布することは可能ですが、当ホームページで配布されているまま再配布してください。

  4. 再配布される場合はなるべくご連絡ください。

  5. プロバイダやバージョンなど、すべての環境で動作する事は保証していません。

  6. 当サイトのスクリプトを利用した事によるいかなる損害も作者は一切の責任を負いません。

  7. 作者に著しく不利益があると判断した場合には一方的にスクリプトの使用を中止していただくことがありますのでご了承ください。

  8. この利用規定は予告なく改編・加筆を行うことがあります。

posted by BigMoonEz at 12:16 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年03月31日

拡張子.htmlのファイルでもPHPが動作するようにする(.htaccess編)

以前、
http://umioyo.seesaa.net/article/33639546.html
にて拡張子.htmlのファイルでもPHPが動作するようにする方法をApache版とAN HTTPD版でお送りしましたが、レンタルサーバーなどご使用の場合での設定方法をご紹介します。
ご使用のレンタルサーバーで.htaccessファイルが許可されている場合に限る方法です。

.htaccessファイルは、ディレクトリ単位で利用者がサーバーの設定を変更できるApacheの設定ファイルです。
Basic認証やエラー表示の場合の設定などにも利用できますが、これはまた別の機会に。。。

で、設定方法ですが、.htaccessというファイルを作り、その中に
AddType application/x-httpd-php .php .html

と記述すれば、拡張子が.phpでも.htmlでもPHPファイルが動作するようになります。

Windowsの場合は、ファイル名がなく、拡張子だけのファイルは作成できませんので、「a.htaccess」とか適当に名前をつけてサーバーにアップし、リネームするのが良いと思います。
(a.htaccessだと、降順でトップにくるので。)
posted by BigMoonEz at 11:17 | Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2007年02月15日

array_multisortの使い方

データベースから値を持ってきて多次元配列にし、その後に自由にソートしたいときなんかがあります。
ExcelとかAccessとか使えば簡単にできますが、Webアプリだとそんなこともできませんし。
例えば、
1 山田太郎 2007.4.3
2 岩鬼正美 2006.5.13
3 殿馬一人 2007.3.22

というデータがあると仮定して、行の関係を維持したまま月日で昇順、降順にソートをかけたいということがあります。

まずは多次元配列に落とし込みます。
$data = array(
[0] => array(
"num" => 1,
"name" => "山田太郎",
"add_date" => "2007.4.3"
),
[1] => array(
"num" => 2,
"name" => "岩鬼正美",
"add_date" => "2006.5.13"
),
[2] => array(
"num" => 3,
"name" => "殿馬一人",
"add_date" => "2007.3.22"
)
);

次に、列方向の配列を得ます。
foreach ($data as $key => $row) {
$num[$key] = $row['num'];
$name[$key] = $row['name'];
$add_date[$key] = $row['add_date'];
}

最後にarray_multisortを使ってソートします。
array_multisort($num, SORT_ASC, $name, SORT_DESC, $add_date SORT_DESC, $data);

この例だと、$numを昇順、他を降順に並べ替えます。

では、日付をキーにしてソートしたいときは?
array_multisort($add_date SORT_ASC, $num, SORT_DESC, $name, SORT_DESC, $data);

のように、先頭にキーにしたいものを持ってきましょう。

<<参考>>
http://jp2.php.net/array_multisort/
posted by BigMoonEz at 10:07 | Comment(0) | TrackBack(1) | PHP | このブログの読者になる | 更新情報をチェックする