Web Tech Log by 1KB

Icon

Web開発、Webデザイン、SEO、携帯コンテンツなどWebにまつわるテクノロジーを追っかけるブログ。旧名「Web屋に復帰した人間のリハビリ日記」

PHPスクリプト内で、ファイルをダウンロードして、サーバー上の特定ディレクトリに保存する最も簡単なコード

よく使うんですが、いつも忘れてしまうので、自分用に記録します。

$url = "http://example.com/abc.png";
$img = file_get_contents($url);
$filepath = "/path/file.png";
file_put_contents($filepath,$img);

スクリプトの用途によってはファイル存在チェックや、排他処理とかいろいろ考えるべきですが、おそらくこれが最もシンプル且つ簡単なコードだと思います。

SimplePie を使用してRSS/Atom FeedをWebページに組み込む

RSS関係のPHPライブラリはいろいろありますが、ファイルが一つのみで構成されていて、その名の通りシンプルなSimplePieを使ってみました。

まずは下ごしらえから

//SimplePie
require_once('../php/simplepie/simplepie.inc');
$feed = new SimplePie();
$feed->set_feed_url("http://1kb.jp/blog/feed"); // RSS Feed URL指定
$feed->set_cache_location("../php/simplepie/cache/"); // Cache ディレクトリ指定
$feed->init();
$feed->handle_content_type();

後はページの任意の位置にてforeach()で回すだけ

 <ul>
<?php
foreach ($feed->get_items() as $item){
$url   = $item->get_permalink(); //各記事のURL
$title = $item->get_title(); // 各記事のタイトル
$date  = $item->get_date('Y-m-d'); //日付 PHPのdateコマンドと同じ
echo '<li>' . $date . ' <a href="' . $url .'">' . $title . '</a></li>';
}
?>
</ul>

非常に簡単ですね。詳細なドキュメントやAPIはこちらをご参照ください。

PHPでアップロードしたJPEGファイルをGIFファイルに変換する

とあるPHPスクリプトで、GIFファイルのみアップロードを許可してJPEGファイルがアップロードしたらエラーを返していました。ユーザビリティを考えるとあまり親切ではないので、JPEGファイルがアップロードされたら、自動的に変換するようにしようと思い、ちょいと調べてみました。

//アップロード先パス
$filepath = "/path/to/filename.gif";
//アップロードしたファイルを保存
move_uploaded_file($_FILES['file']['tmp_name'], $filepath);
//書き込み許可属性を付ける
chmod($filepath, 0777);
if (preg_match("/jpeg/", $_FILES['file']['type'])) {//JPEGの場合GIF変換
//JPEGファイルを展開
$img = imagecreatefromjpeg($filepath);
//GIF形式で保存
imagegif($img, $filepath);
//メモリを解放
imagedestroy($img);
}

※実際には様々なエラー処理が必要です。PHPでのファイルアップロード処理に関しては割愛します。他を参照してください。

基本的にはPHPの関数 imagecreatefromjpeg() と imagegif() を使用して簡単にできました。もちろんGDのサポートは必須です。

PHP strtotime関数でハマった!(翌月の表現の処理)

PHPには strtotimeという関数があります。引数に例えば「+1 month」と指定すれば1ヶ月後のタイムスタンプを返してくれます。

<?php $nextmanth = date("Y-m", strtotime("+1 month"));?>

で翌月を返してくれると思ってました。しかし甘かった!!
例えば今月28日の時点では問題なかったのですが、

例:2009年1月28日の時点
<?php
$nextmonth = date("Y-m", strtotime("+1 month"));
echo $nextmonth;?>
結果:2009-02

これが31日では

例:2009年1月31日の時点
<?php
$nextmonth = date("Y-m", strtotime("+1 month"));
echo $nextmonth;
?>
結果:2009-03

となってしまう。
なぜならば、strtotime関数では1月31日の1ヶ月後は2月31日で2月は31日が存在しないので3月3日という認識らしい。

実際に以下のコードを実行すると

例:2009年1月31日の時点
<?php
$nextmonth = date("Y-m-d", strtotime("+1 month"));
echo $nextmonth;?>
結果:2009-03-03

となってしまう。
1月31日では「次の月」を3月と返してしまってくれていて、原因を突き止めるのに苦労しました。

正解は

例:2009年1月31日の時点
<?php
$nextmonth = date("Y-m", strtotime(date("Y-m-01") . "+1 month"));
echo $nextmonth;
?>
結果:2009-02

いったん「2009-01-01」と月初に戻してから、「+1 month」してやるとうまくいきました。

MySQLで昇順ソートする時、NULL を最後に持ってくる

はまったのでメモ。
某Webアプリを「スパゲッティPHPスクリプト+SQLite」から「CakePHP+MySQL」の環境に移植作業をしてました。ある情報を一覧表示したときの並び順が、移植元のアプリと違うのでorder句にあれこれ試してみてもうまくいきません。

しょうがないのでGoogle先生に聞いてみた。どうやら、DBMSによってNULLの値が上に来たり下に来たりするとのこと。昇順ソートの場合、SQLiteでは下に来て、MySQL上に来るらしい。こいつが原因だ(つーか常識?)。

上記エントリーを参考にしました。いつもありがとうございます。
答えとしてはorder by 句に ‘IS NULL ‘を追加でOK。具体的なSQL例文は以下のとおり

SELECT * FROM HOGETABLE ORDER BY priority IS NULL, priority;

CakePHP風には

$order = array('Model.priority IS NULL','Model.priority');
$alldata = $this->Model->findAllByFlag('1', null, $order);

こんな感じでしょうか。

固定ページ

킹ēǂ݂uOp[c