<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>QUOIT Blog &#187; PHP</title>
	<atom:link href="http://ken.quoit.jp/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://ken.quoit.jp</link>
	<description>Programming, OpenSource, HTML/CSS etc...</description>
	<lastBuildDate>Sat, 04 Feb 2012 17:18:36 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>忙しい人のための「初めてのPHP」</title>
		<link>http://ken.quoit.jp/2011/03/29/%e5%bf%99%e3%81%97%e3%81%84%e4%ba%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e3%80%8c%e5%88%9d%e3%82%81%e3%81%a6%e3%81%aephp%e3%80%8d/</link>
		<comments>http://ken.quoit.jp/2011/03/29/%e5%bf%99%e3%81%97%e3%81%84%e4%ba%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e3%80%8c%e5%88%9d%e3%82%81%e3%81%a6%e3%81%aephp%e3%80%8d/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 02:00:32 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[忙しい人のための]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=737</guid>
		<description><![CDATA[説明は適度に、駆け足でお届けします。 言っておきますが、これを覚えたからと言って「PHP出来ます！（ｷﾘｯ」とか言ったら鼻で笑われるレベルだということは認識しておいてくださいね。 大前提 HTML/CSSの基本的なところはわかってるものとします。FTPでアップロードするって意味さえわからない人はこのへんで勉強してください。つまり、出直してください。 あと、もっとちゃんと勉強したい人はこんな駄文を読まないほうがいいです。アシアルさんのコンテンツを読んでください。この文章の100倍素晴らしいコンテンツが満載です。 エディタ Windowsユーザなら、標準で付いてるメモ帳を使うのはやめましょう。 PHPに限らず、プログラムを触るなら、あんなもん使わないでください。文字コードも変更できない、あんな見づらいエディタを使う意味など皆無です。 最低限、PHPのコードが色付けされる、文字コードが変更できるエディタがあったほうがいいです。 Windowsで無料なら例えば、 notepad++　←僕はこれ使ってます。 ＰＨＰエディタ サクラエディタ TeraPad あたりでしょうか。Macは使ってないのでよく知りません。 今回、基本的に文字コードは全て「UTF-8N」（ボム無しUTF-8）という前提で進めます。 環境を確認 エディタで、下記のコードを「info.php」とか適当な名前で保存します。 作ったファイルをアップロードして、ブラウザでアクセスすると、ずらずらと情報が表示されます。 もしこれが表示されない場合は、そもそもそのサーバではPHPが使えません。別のサーバを使ってください。 [2011/03/30 11:00追記]→コメントにてご指摘頂きました。サーバによってはこの関数を使えない場合があります。PHPが使えるかどうかは、利用しているレンタルサーバにお問い合わせください。 細かいことは置いといて、このページを名前をつけてローカルに保存してください。保存したら、サーバから「info.php」は必ず削除してください。 さて、ローカルに保存した「info.php」をブラウザで開いてみましょう。これにはサーバのいろんな情報が書かれています。 とりあえず「DOCUMENT_ROOT」だけ確認すればいいです。絶対パスと呼ばれるものです。 （「DOCUMENT_ROOT」で検索するといくつか引っかかりますが、同じ値だと思います。） 「え？絶対パスって知ってるのと違うよ？」と思った人はHTMLでの絶対パスを思い浮かべた人でしょう。 ここでの絶対パスとは、サーバのシステムルートからの絶対パスであり、Webサーバのルートからの絶対パスではありません。 FTPで見るより、もっと深い階層があるんだと思っておけばいいです。 準備はここまで。 基本的なこと 普通のチュートリアルだとここから丁寧に変数の説明とかするんですが、超ダッシュで一息にまとめます。 コーラでも一気飲みして勢いをつけたら、下記のコードを見てください。 &#60;&#63;php // ←phpを書くための約束。&#60;html&#62;と同じようなもの # シャープがついたら、それより後ろはコメント。コメントは全部で3種類ある。 // スラッシュ2回。これもそれより後ろがコメント。 /* これもコメント。 これは囲まなきゃいけないけど、複数行コメントに出来る。 */ $hoge="test"; // ドルマークがついたら、「変数」。数値とか文字列とかを入れることが出来る。 // 変数は英数字とアンダーバーのみで、先頭は数字じゃだめよ。 // 値を入れるときには「=」を使う。 // 文字列は「""」（ダブルクオーテーション）か「''」（シングルクオーテーション）で囲まないとエラーになる。 echo $hoge; [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>説明は適度に、駆け足でお届けします。<br />
言っておきますが、これを覚えたからと言って「PHP出来ます！（ｷﾘｯ」とか言ったら鼻で笑われるレベルだということは認識しておいてくださいね。</p>
<p><span id="more-737"></span></p>
<h4>大前提</h4>
<p>HTML/CSSの基本的なところはわかってるものとします。FTPでアップロードするって意味さえわからない人は<a href="http://www.tagindex.com/hp_guide/index.html" target="_blank">このへん</a>で勉強してください。つまり、出直してください。<br />
あと、もっとちゃんと勉強したい人はこんな駄文を読まないほうがいいです。<a href="http://www.phppro.jp/school/phpschool/" target="_blank">アシアルさんのコンテンツ</a>を読んでください。この文章の100倍素晴らしいコンテンツが満載です。</p>
<h4>エディタ</h4>
<p>Windowsユーザなら、標準で付いてるメモ帳を使うのはやめましょう。<br />
PHPに限らず、プログラムを触るなら、あんなもん使わないでください。文字コードも変更できない、あんな見づらいエディタを使う意味など皆無です。<br />
最低限、PHPのコードが色付けされる、文字コードが変更できるエディタがあったほうがいいです。<br />
Windowsで無料なら例えば、</p>
<p><a href="http://notepad-plus-plus.org/" target="_blank">notepad++</a>　←僕はこれ使ってます。<br />
<a href="http://phpspot.net/php/phpeditor.html" target="_blank">ＰＨＰエディタ</a><br />
<a href="http://sakura-editor.sourceforge.net/" target="_blank">サクラエディタ</a><br />
<a href="http://www5f.biglobe.ne.jp/~t-susumu/library/tpad.html" target="_blank">TeraPad</a></p>
<p>あたりでしょうか。Macは使ってないのでよく知りません。<br />
今回、基本的に文字コードは全て「UTF-8N」（ボム無しUTF-8）という前提で進めます。</p>
<h4>環境を確認</h4>
<p>エディタで、下記のコードを「info.php」とか適当な名前で保存します。</p>
<pre name="code" class="php">
<&#63;php
 phpinfo();
&#63;>
</pre>
<p>作ったファイルをアップロードして、ブラウザでアクセスすると、ずらずらと情報が表示されます。<br />
<del datetime="2011-03-30T01:54:16+00:00"><strong>もしこれが表示されない場合は、そもそもそのサーバではPHPが使えません。</strong>別のサーバを使ってください。</del><br />
[2011/03/30 11:00追記]→コメントにてご指摘頂きました。サーバによってはこの関数を使えない場合があります。PHPが使えるかどうかは、利用しているレンタルサーバにお問い合わせください。</p>
<p>細かいことは置いといて、このページを名前をつけてローカルに保存してください。保存したら、<strong>サーバから「info.php」は必ず削除してください</strong>。</p>
<p>さて、ローカルに保存した「info.php」をブラウザで開いてみましょう。これにはサーバのいろんな情報が書かれています。</p>
<p>とりあえず「DOCUMENT_ROOT」だけ確認すればいいです。絶対パスと呼ばれるものです。<br />
（「DOCUMENT_ROOT」で検索するといくつか引っかかりますが、同じ値だと思います。）</p>
<p>「え？絶対パスって知ってるのと違うよ？」と思った人はHTMLでの絶対パスを思い浮かべた人でしょう。<br />
ここでの絶対パスとは、サーバのシステムルートからの絶対パスであり、Webサーバのルートからの絶対パスではありません。</p>
<p>FTPで見るより、もっと深い階層があるんだと思っておけばいいです。</p>
<p>準備はここまで。</p>
<h4>基本的なこと</h4>
<p>普通のチュートリアルだとここから丁寧に変数の説明とかするんですが、超ダッシュで一息にまとめます。<br />
コーラでも一気飲みして勢いをつけたら、下記のコードを見てください。</p>
<pre name="code" class="php">
&#60;&#63;php // ←phpを書くための約束。&#60;html&#62;と同じようなもの
# シャープがついたら、それより後ろはコメント。コメントは全部で3種類ある。
// スラッシュ2回。これもそれより後ろがコメント。
/* これもコメント。
これは囲まなきゃいけないけど、複数行コメントに出来る。 */

$hoge="test";
// ドルマークがついたら、「変数」。数値とか文字列とかを入れることが出来る。
// 変数は英数字とアンダーバーのみで、先頭は数字じゃだめよ。
// 値を入れるときには「=」を使う。
// 文字列は「""」（ダブルクオーテーション）か「''」（シングルクオーテーション）で囲まないとエラーになる。

echo $hoge; // ←脆弱なので、通常はこのようには書かない。
// 「echo」は出力して！って命令。
// HTMLみたいに、書けば表示されるもんじゃないので、表示してほしいものは命令しないといけない。
// ちなみに、$hogeには上で"test"って文字列を入れたのでブラウザでは「test」って表示されるはず

$arr=array();
$arr[0]=100;
$arr[1]=500;
$arr[2]=999;
// これは「配列」。変数のすごい版（嘘）で、値を複数入れることができる。
// array()っていうのが「これは配列だよ！」って宣言。
// [0]とか[1]とかが「キー」。中身が対応してる。

echo $arr[1];
// こうすると「500」が表示される。

// ちなみにこのように書くことも出来る。やってることは上と同じ。
$arr=array(100,500,999);

echo $arr[2];
// 何も書かないとキーは 0 から始まる。
// だから、上の中身は[0]=>100, [1]=>500, [2]=>999 ってなってる。
// これは999が表示される。

echo $arr[0]+$arr[1];
// これは100+500で600が表示される。計算できるんだね。だいたい察して。

$arr["aaa"] = "boke";
$arr["bbb"] = "aho";
// こんな感じで文字をキーにすることも出来る。

echo $arr["aaa"].$arr["bbb"];
// これは「bokeaho」と表示される。
// 2つ以上の文字列を連結するには「.」（ドット）を使う。ドットがないとエラーになる。

// 配列の中身を表示するのには、foreachが便利。
foreach($arr as $k=>$v){
  echo 'キー：'.$k.'　中身：'.$v;
}
// 中身とキーを表示する。

// 最初から決まってる特別な変数もある。
// とりあえず使うのは以下の２つ。
$_POST;
$_GET;
// ちなみにこんなふうにコードの中に変数が書いてあるだけだと何も起こらない。何も命令してないから当たり前だね。
// HTMLの&#60;form&#62;タグに&#60;form method="post"&#62;って書いてあったら$_POST
// 何も書いてないか、&#60;form method="get"&#62;って書いてあったら$_GET
// そこに、それぞれinputタグとかselectタグの中身が入ってくる。
// &#60;input type="text" name="onamae" /&#62;ってタグの中身は
// $_POST['onamae']として入ってくる。
// $_GETはURLにくっついてくるので、直接アドレスバーに書いて、値を決めることも出来る。
// http://quoit.jp/hoge.php?aaa=99
// これは$_GET["aaa"]=99; として中身が入ってることになる。

if($hoge=="test"){
  echo $hoge;
}elseif($hoge=="piyo"){
  echo "(´ω`)";
}elseif($hoge!="ika"){
  echo "(　ﾟдﾟ)";
}else{
  echo "(´・ω・`)";
}
// if・・・は「もし・・・だったら」ってそのまんま。
// 「=」一個だけだと「値を入れる」って意味なので、「等しい」を表すには「==」って二個にする。
// だから、$hogeが「test」だったら、中身を表示。
// elseif・・・は「そうじゃなくてもし・・・だったら」なので、「test」じゃなくて「piyo」だったら「(´ω`)」を表示
// $hogeが「ika」以外だったら「(　ﾟдﾟ)」を表示。「!」は否定を表す。
// else「そうじゃなかったら」なので、上のどれにも当てはまらなかったら「(´・ω・`)」を表示

function foo($val){
  $ret=$val."オラオラオラオラ";
  return $ret;
}
// これは「関数」。
// 「機能をまとめておけるもの」かな。
// カッコ（）の中が「引数（ひきすう）」と呼ばれるもので、関数に渡される値。
// 今回は関数の中で引数の中身に文字列をくっつけて、値を返してるので、次のようになる。

$hoge="WRYYYY!";
$hoge2=foo($hoge);
echo $hoge2;

// 表示されるのは「WRYYYY!オラオラオラオラ」。
// 最初に入ってる値が、関数で処理されることで内容が変わるんだよ、ってことですね。

// phpを書くための約束。&#60;/html&#62;と同じようなもの↓
&#63;>
</pre>
<p>ちょっとがっつりだけど、これ読んでなんとなく分かればいいです。<br />
分からない方はコメントくださいな。</p>
<h4>メールフォームを作る</h4>
<p>使えるものを作りましょう。プログラムを作る時は、まず最初に処理の流れを考えます。<br />
まぁ今回はシンプルに。</p>
<blockquote><p>
1) データを入力する<br />
　　　　↓<br />
2) 送信する
</p></blockquote>
<p>というだけにしましょう。<br />
確認画面は入れない。面倒だから。</p>
<p>言い忘れてたけど、PHPはHTMLと同居出来る。<br />
つまり、こういう書き方が出来る。</p>
<pre name="code" class="php">
&#60;html&#62;
&#60;head&#62;&#60;title&#62;テスト&#60;/title&#62;&#60;/head&#62;
&#60;body&#62;
&#60;?php
echo "hoge";
?&#62;
&#60;/body&#62;
&#60;/html&#62;
</pre>
<p>ただこれだと見づらくなるから、PHPでHTMLをテンプレートとして読み込んだりすることもあります。（例：<a href="http://www.smarty.net/docsv2/ja/" target="_blank">Smarty</a>）</p>
<p>今回は上のように同居させます。</p>
<p>さて、画面としては２つ必要です。</p>
<p>１）内容入力画面<br />
２）送信完了画面</p>
<p>送信完了画面を表示する前に、送信処理をしなきゃいけない。<br />
ただ、送信完了画面＝送信処理とすると、完了画面を更新（F5）したときに二重送信になってしまう。<br />
それを避ける方法はいくつかあるのですが、今回は送信後に完了画面にリダイレクトさせる、という方法を使います。</p>
<p>ということで、処理の流れは、</p>
<blockquote><p>
1) データを入力する<br />
　　　　↓<br />
2) 入力内容を確認　→エラーがあったら入力画面に戻る<br />
　　　　↓<br />
3) エラーがなければ送信する<br />
　　　　↓<br />
4) 送信完了画面を表示する
</p></blockquote>
<p>という流れになります。</p>
<p>さて、いよいよ実際のコーディングへ。<br />
まずは１）の内容入力画面。<br />
入力できる項目は「お問い合わせ内容」だけにします。</p>
<pre name="code" class="php">

<&#63;php
// 先にHTMLを書いちゃうと、処理をする前に内容が表示されちゃうので、処理内容を先に書く。
// まずは何か変更があったら書き換えやすいように、設定を書きましょう。

// 宛先
$to="info@quoit.jp";
// From欄の中身
$from="info@quoit.jp";
// メールのタイトル
$title="【お問い合わせがありました】";
// [2011/03/30 11:00追記]完了画面のURL
$url="http://quoit.jp/finish.html";

// 次にデータが送られてきた場合の処理を書く。

if(isset($_POST["send"])){// データが送信されていた場合
  if(!isset($_POST["contact"])){// 本文が空だった場合はエラー文を設定 [2011/03/30 11:00修正]empty関数→isset関数に変更
    $error="本文を入力してください。";
  }else{
    // 本文の入力内容を変数に入れる
    $contact=$_POST["contact"];
    // メール送信時の日本語設定。UTF8にします。
    mb_language("japanese");
    mb_internal_encoding("utf-8");
    // ここからメール送信処理
    // PHPに初めから用意されている関数を使う。（mb_send_mail関数について詳しくはググってください）
    // この関数は、「エラーだとFALSE（否定）を返す」。
    // こういう場合、if(!mb_send_mail()){ ??; } と書くと、「??;」はエラーだった場合に実行される。
    if(!mb_send_mail(
      $to,// 宛先。
      $title,// タイトル
      $contact,// 本文（受け取った値）
      'From: '.$from."\r\n".
      'Reply-To: '.$from."\r\n".
      'X-Mailer: PHP/' . phpversion(),
      "-f ".$from
    )){
      // エラーだった場合にエラー文を設定
      $error="メールを送信できませんでした。";
    }else{
      // 問題なければ、送信完了画面（finish.html）に飛ばす
      header("Location: ".$url);
    }
  }
}

&#63;>
&#60;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&#62;
&#60;html xmlns="http://www.w3.org/1999/xhtml"&#62;
&#60;head&#62;
&#60;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&#62;
&#60;title&#62;メールフォームの入力画面&#60;/title&#62;
&#60;/head&#62;
&#60;body&#62;
<h1>メールフォーム</h1>

&#60form method="post"&#62
<!-- メールフォームだったらpostにしましょう -->
<h2>お問い合わせ内容</h2>

<!-- エラーを表示 -->
&#60;p style="color:red;"&#62;
<&#63;php echo $error; &#63;>
&#60;/p&#62;
<textarea rows="10" cols="20" name="contact"><&#63;php echo htmlspecialchars($contact, ENT_QUOTES, 'UTF-8'); &#63;></textarea>
<!-- ↑エラーがあって入力画面に戻ったとき、入力した内容を入れておく -->
<!-- ※ブラウザに表示される文字列には、htmlspecialchars関数をつかうこと！ -->

&#60;input type="submit" name="send" value="送信する" /&#62;
&#60;/form&#62;

&#60;/body&#62;
&#60;/html&#62;
</pre>
<p>このファイル以外に、「送信ありがとうございました」的な内容を書いたfinish.htmlを用意しておけば完了。</p>
<p>どうでしょうか？簡単でしたか？</p>
<p>これを読んで、何となく分かった気になったら、ちなみにそれは勘違いです！</p>
<p>ご質問、ツッコミなどはコメントやTwitterでください。</p>
<p>どうぞ素敵なプログラミングライフを。</p>
<h4>2011/03/30 11:00追記</h4>
<p>コメントで頂いたご指摘と、はてなブックマークでご指摘頂いた部分を追記／修正しました。</p>
<h4>2011/03/30 12:20追記</h4>
<p>はてなブックマークでご指摘頂いた部分をちょこっと修正。</p>
<h4>2011/03/30 15:00修正</h4>
<p>「メール本文に対してhtmlspecialcharsをかけるべきではない」の意味がよく分かってなかったのですが、ご指摘頂いてようやく分かりました…ご指摘頂いた皆様ありがとうございます。一部修正しました。</p>
<h4>2011/03/30 19:00修正</h4>
<p>はてなブックマークでご指摘頂いた部分をちょこっと修正。コメントを追加。</p>
<h4>2011/03/31 19:30修正</h4>
<p>コメントで頂いたご指摘を元に、一部文言を修正。</p>
<div class="shr-publisher-737"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2011/03/29/%e5%bf%99%e3%81%97%e3%81%84%e4%ba%ba%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e3%80%8c%e5%88%9d%e3%82%81%e3%81%a6%e3%81%aephp%e3%80%8d/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>PHPExcelのラッパークラスを書き変えてみた</title>
		<link>http://ken.quoit.jp/2011/02/03/phpexcel%e3%81%ae%e3%83%a9%e3%83%83%e3%83%91%e3%83%bc%e3%82%af%e3%83%a9%e3%82%b9%e3%82%92%e6%9b%b8%e3%81%8d%e5%a4%89%e3%81%88%e3%81%a6%e3%81%bf%e3%81%9f/</link>
		<comments>http://ken.quoit.jp/2011/02/03/phpexcel%e3%81%ae%e3%83%a9%e3%83%83%e3%83%91%e3%83%bc%e3%82%af%e3%83%a9%e3%82%b9%e3%82%92%e6%9b%b8%e3%81%8d%e5%a4%89%e3%81%88%e3%81%a6%e3%81%bf%e3%81%9f/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 12:29:53 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHPExcel]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=707</guid>
		<description><![CDATA[以前書いた「今度はPHPExcelを使ってみた」という記事の中で紹介した「PHPExcelで.xls形式のファイルを扱う &#124; バシャログ。」というエントリで、PHPExcelのラッパークラスの例が書いてあります。 その例を元にラッパークラスを改変して使ってみているのですが、ちょっと自分としては使いづらいところがあったので手を加えてみました。 前提として、エクセルの読み込みのみを行なうクラスを作成することとします。 書き込みも必要な場合は元記事から適宜書き換えるといいです。自分で＾ｑ＾ class ExcelObj { function __construct(){ require_once(CORE_DIR.'Util/Excel/Classes/PHPExcel.php'); require_once(CORE_DIR.'Util/Excel/Classes/PHPExcel/IOFactory.php'); } function readXls($filepath, $sheetIndex = null){ $objReader = PHPExcel_IOFactory::createReader('Excel5'); $objPHPExcel = $objReader->load($filepath); $sheets = array(); $data = array(); if(is_null($sheetIndex)){ $sheets = $objPHPExcel->getAllSheets(); }elseif(is_array($sheetIndex)){ foreach($sheetIndex as $idx){ $sheets[$idx] = $objPHPExcel->getSheet($idx); } }elseif(is_int($sheetIndex)){ $sheets[$sheetIndex]=$objPHPExcel->getSheet($sheetIndex); } if(empty($sheets)) return $data; foreach ($sheets as $s => $v) [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>以前書いた「<a href="http://wp.me/pCvXo-89">今度はPHPExcelを使ってみた</a>」という記事の中で紹介した「<a href="http://c-brains.jp/blog/wsg/09/09/10-130907.php">PHPExcelで.xls形式のファイルを扱う | バシャログ。</a>」というエントリで、PHPExcelのラッパークラスの例が書いてあります。<br />
その例を元にラッパークラスを改変して使ってみているのですが、ちょっと自分としては使いづらいところがあったので手を加えてみました。</p>
<p><span id="more-707"></span></p>
<p>前提として、エクセルの読み込みのみを行なうクラスを作成することとします。<br />
書き込みも必要な場合は元記事から適宜書き換えるといいです。自分で＾ｑ＾</p>
<pre name="code" class="php">
class ExcelObj {

	function __construct(){
		require_once(CORE_DIR.'Util/Excel/Classes/PHPExcel.php');
		require_once(CORE_DIR.'Util/Excel/Classes/PHPExcel/IOFactory.php');
	}

	function readXls($filepath, $sheetIndex = null){

		$objReader = PHPExcel_IOFactory::createReader('Excel5');
		$objPHPExcel = $objReader->load($filepath);

		$sheets = array();
		$data = array();

		if(is_null($sheetIndex)){
			$sheets = $objPHPExcel->getAllSheets();
		}elseif(is_array($sheetIndex)){
			foreach($sheetIndex as $idx){
				$sheets[$idx] = $objPHPExcel->getSheet($idx);
			}
		}elseif(is_int($sheetIndex)){
			$sheets[$sheetIndex]=$objPHPExcel->getSheet($sheetIndex);
		}

		if(empty($sheets)) return $data;

		foreach ($sheets as $s => $v) {# sheet
			# Sheet name
			$sheetTitle = $v->getTitle();
			$data[$sheetTitle]=array();

			# get max row &#038; col
			$rowMax = $v->getHighestRow();

			$colMaxStr = $v->getHighestColumn();
			$colMax = PHPExcel_Cell::columnIndexFromString($colMaxStr);

			# get text data par 1 cell
			$sheetData = array();
			for($r=1; $r<=$rowMax; $r++){# row
				for($c=0; $c<=$colMax; $c++){# col
					$objCell = $v->getCellByColumnAndRow($c, $r);
					$sheetData[$r][$c]= $this->_getText($objCell);
				}
			}
			$data[$sheetTitle] = $sheetData;
		}
		return $data;
	}
	function _getText($objCell = null){
		if(is_null($objCell)) return false;

		$txtCell = "";
		$valueCell = $objCell->getValue();

		if(is_object($valueCell)){
			$txtParts = array();
			foreach($valueCell->getRichTextElements() as $v){
				$txtParts[] = $v->getText();
			}
			$txtCell = implode("", $txtParts);
		}else{
			if(!empty($valueCell)) $txtCell = $valueCell;
		}

		return $txtCell;
	}
}
</pre>
<p>まさかこれをコピペして動かねえええ！という人はいないと思いますが、定数「CORE_DIR」は適宜書き換えてくださいねｗ</p>
<p>変更点は以下。</p>
<p>1) 省略できそうな変数を省略した<br />
　　→正直どうでもいい</p>
<p>2) メソッドの引数を減らした<br />
　　→シートの一部分を取得することはなさそうだったので</p>
<p>3) 取得した後の連想配列を以下のように変更<br />
【変更前】</p>
<pre name="code" class="php">
array(3) {
  [0]=>
  array(2) {
    ["title"]=>
    string(4) "hoge"
    ["data"]=>
    array(10) {
      [1]=>
      array(10) {
        [0]=>
        string(6) "name"
        [1]=>
        string(4) "namef"
        ...（以下略
</pre>
<p>【変更後】</p>
<pre name="code" class="php">
array(3) {
  ["hoge"]=>
  array(10) {
    [1]=>
      array(10) {
        [0]=>
        string(6) "name"
        [1]=>
        string(4) "namef"
        ...（以下略
</pre>
<p>何が変わったかというと、以前の形だとシートのキーは数値、シート名が「title」というキーで入ってきてたのを、そもそもシートのキーが名前でいいじゃん、と。</p>
<p>何故こうしたかというと、変更前のコードは返ってきたデータをforeachとかで回す時に、元々のエクセルデータのシートの順番に依存してしまうという弱点がある。<br />
せっかく取得したのに、何番目にどのシートのデータがあるか分からない。</p>
<p>変更後のデータなら、シート名がキーになっているので、キーを指定すれば目的のデータが取得できるというわけだ。</p>
<p>シート名が日本語だった場合も、文字コードに気をつければ読み込めるはず。<br />
（一応僕の環境ではUTF8に統一して読み込めました）</p>
<p>以上です。</p>
<div class="shr-publisher-707"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2011/02/03/phpexcel%e3%81%ae%e3%83%a9%e3%83%83%e3%83%91%e3%83%bc%e3%82%af%e3%83%a9%e3%82%b9%e3%82%92%e6%9b%b8%e3%81%8d%e5%a4%89%e3%81%88%e3%81%a6%e3%81%bf%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>mysql_select_dbの挙動が気に入らない</title>
		<link>http://ken.quoit.jp/2010/12/22/mysql_select_db%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%8c%e6%b0%97%e3%81%ab%e5%85%a5%e3%82%89%e3%81%aa%e3%81%84/</link>
		<comments>http://ken.quoit.jp/2010/12/22/mysql_select_db%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%8c%e6%b0%97%e3%81%ab%e5%85%a5%e3%82%89%e3%81%aa%e3%81%84/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 09:53:38 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=589</guid>
		<description><![CDATA[何だかいろいろ試していたらあれ？ということにぶつかってしまったので、覚え書き。 解決策は考え中です。解決しました！ ※追記 10/12/22 19:50 Twitterでアドバイスを頂き、解決の方向性が見えてきました。 ※追記 10/12/23 14:00 Twitterで完全な解決策を頂きました！こしあんさんに感謝！ まず、簡単に状況説明から。 僕はphpからmysqlを使うために、DB用のクラスを作っています。 まぁ多くの方は持ってると思いますが。。 僕の場合はこんな感じ。 class DB{ var $db_encoding="UTF-8"; var $script_encoding="UTF-8"; #--------------------------- # constructer #--------------------------- function DB($host=HOST,$user=USER,$pass=PASS,$db=DBNAME){ # CONNECT MySQL if (!($mysql=mysql_connect($host,$user,$pass,TRUE))) { die("ERROR: HOST CONNECT FAILED"); } # CONNECT DB if (!(mysql_select_db($db,$mysql))) { die("ERROR: DB CONNECT FAILED"); } } #--------------------------- # class method #--------------------------- function [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>何だかいろいろ試していたらあれ？ということにぶつかってしまったので、覚え書き。<br />
<del datetime="2010-12-23T04:59:01+00:00">解決策は考え中です。</del>解決しました！</p>
<p><span style="font-size:10px;font-weight:bold;"><br />
※追記 10/12/22 19:50<br />
Twitterでアドバイスを頂き、解決の方向性が見えてきました。<br />
</span></p>
<p><span style="font-size:10px;font-weight:bold;"><br />
※追記 10/12/23 14:00<br />
Twitterで完全な解決策を頂きました！こしあんさんに感謝！<br />
</span></p>
<p><span id="more-589"></span></p>
<p>まず、簡単に状況説明から。</p>
<p>僕はphpからmysqlを使うために、DB用のクラスを作っています。<br />
まぁ多くの方は持ってると思いますが。。</p>
<p>僕の場合はこんな感じ。</p>
<pre name="code" class="php">
class DB{
	var $db_encoding="UTF-8";
	var $script_encoding="UTF-8";

	#---------------------------
	# constructer
	#---------------------------
	function DB($host=HOST,$user=USER,$pass=PASS,$db=DBNAME){
		# CONNECT MySQL
		if (!($mysql=mysql_connect($host,$user,$pass,TRUE))) {
			die("ERROR: HOST CONNECT FAILED");
		}
		# CONNECT DB
		if (!(mysql_select_db($db,$mysql))) {
			die("ERROR: DB CONNECT FAILED");
		}
	}

	#---------------------------
	# class method
	#---------------------------
	function exe($stmt){
	# Execute SQL
		if (!($data = mysql_query($stmt))) {
			echo mysql_error()."\n";
			var_dump($stmt);
			return false;
		}
		$result = Array();
		while($tmp = @mysql_fetch_assoc($data)){
			array_push($result,$tmp);
		}
		if( !empty ( $result ) ){
			return $result;
		}else{
			return TRUE;
		}
	}
}
</pre>
<p><span style="font-size:10px;">※emptyemptyってなってるのはWPプラグインのバグです。。</span></p>
<p>実際にはメソッドがやたらめったらあるので今は割愛。</p>
<p>まぁそんなに大それたことはやってません。</p>
<p>オブジェクト生成時にコンストラクタでmysql_connectを使って接続、そのあとメソッドでSQLを実行したりとか何とか。</p>
<p>いつも定数でDBへの接続情報を持っているのですが、引数で渡せば別のDBにも接続できるようになってます。</p>
<p>ふと今日、2つのDBに接続しようとして、以下のコードを書きました。</p>
<pre name="code" class="php">
$db = new DB();# DB Object
$db2 = new DB('localhost','user','password','hogedb');# DB Object

$db->exe("select * from db1table");
$db2->exe("select * from db2table");
</pre>
<p>ここで僕が期待した結果は、それぞれのDBから情報を引っ張ってくることでした。</p>
<p>しかし結果は「 Table &#8216;db1.db1table&#8217; doesn&#8217;t exist 」となって、最初のクエリが失敗。</p>
<p>今までは大概1つのDBに接続していたので気付かなかったのですが、2つのハンドラを生成した場合に後から生成されたDBハンドラに上書きされてしまったのです。</p>
<p>もっと正確に言うと、コンストラクタで使用していたmysql_select_db関数が情報を上書きしてしまい、DBを変更してしまうのです。</p>
<p>なんだ、僕の作り方が悪いんじゃないの、とも言えますが。。(´・ω・)</p>
<p>納得いかないのは、このmysql_select_db関数。</p>
<p>第二引数にmysql接続を渡すことで指定できるのに、後からの接続に情報を上書きされてしまう。</p>
<p>どうにも納得いかないんですが、どう回避したらいいのか思案中です。。。(´・ω・)</p>
<p><span style="font-size:10px;font-weight:bold;">※追記 10/12/22 19:40</span><br />
Twitterにも書いたんですが、実は今回のコードの回避策はあるにはあるのです。<br />
mysql_select_dbをメソッドexe()の最初に持ってくることで、実行前に毎回DBを選択すれば解決します。<br />
でもものっすごく気に入らないので別の回避策がないかなーと思っております。<br />
もし何か良い案があれば是非教えてください。。＞＜；</p>
<p><span style="font-size:10px;font-weight:bold;">※追記 10/12/22 19:50</span><br />
Twitterで<a href="http://twitter.com/debiru" target="_blank">debiru</a>氏にこんな助言を頂きました。</p>
<blockquote><p>
@yakumo27 クラス作ってオブジェクト思考型で処理したいなら、そもそも手続き型の関数を使うべきではないのではないでしょうか。PHP4前提だと少し難しいですね。私は PHP5.x での開発が主なので mysqli をよく用います。 <a href="http://bit.ly/gQyFvH" target="_blank">http://bit.ly/gQyFvH</a><br />
<a href="http://twitter.com/debiru/statuses/17532553573441536" target="_blank">元発言はこちら</a>
</p></blockquote>
<p>恥ずかしながら、mysqliは利用したことがなかったので未知の領域でした。<br />
環境がPHP5.xなのであれば有効なのかも。<br />
この問題はアドバイス頂いた方向で解決してみたいと思います。</p>
<p><span style="font-size:10px;font-weight:bold;">※追記 10/12/23 14:00</span><br />
Twitterで<a href="http://twitter.com/alphabet_h" target="_blank">こしあんさん</a>にこんなメッセージを頂きました！</p>
<blockquote><p>@yakumo27 ちょっと書きなおしてみました、こんな感じでどうでしょ。 <a href="https://gist.github.com/752467" target="_blank">https://gist.github.com/752467</a><br />
<a href="http://twitter.com/alphabet_h/status/17768052959485952" target="_blank">元発言はこちら</a>
</p></blockquote>
<blockquote><p>@yakumo27 多分、コネクション（$mysql）を省略していたので、最初に作ったコネクションを自動的に使ってしまってるのではないかなぁと思います。件のソースでは問題なく動きましたー＠自分の環境<br />
<a href="http://twitter.com/alphabet_h/status/17801781971001344" target="_blank">元発言はこちら</a>
</p></blockquote>
<p>全くもってそのとおりでした！</p>
<p><a href="https://gist.github.com/752467" target="_blank">こしあんさんが解決してくださったソース</a>を見るとわかるのですが、コネクションをメンバ変数に割り当てて、mysql_queryの引数に明示的にコネクションを渡しています。<br />
元の僕のソースではこれを省略してしまってたんですね。</p>
<p>いやはやこんなことに気付いてくださってソースまで書いてくださって、こしあんさんに感謝です！</p>
<p>こしあんさんの技術ブログは<a href="http://blog.livedoor.jp/petaweb/" target="_blank">こちら</a>。</p>
<div class="shr-publisher-589"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2010/12/22/mysql_select_db%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%8c%e6%b0%97%e3%81%ab%e5%85%a5%e3%82%89%e3%81%aa%e3%81%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Smartyのオプションを作る</title>
		<link>http://ken.quoit.jp/2010/12/14/smarty%e3%81%ae%e3%82%aa%e3%83%97%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e4%bd%9c%e3%82%8b/</link>
		<comments>http://ken.quoit.jp/2010/12/14/smarty%e3%81%ae%e3%82%aa%e3%83%97%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e4%bd%9c%e3%82%8b/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 05:47:55 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Smarty]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=447</guid>
		<description><![CDATA[僕はSmarty（テンプレートエンジン）をよく使うのですが、ちょっとこういう機能欲しいなーということがありまして、マニュアルを探してみたらなかったので、ないなら作っちゃえばいいじゃんというメモ。 簡単に言うと、Smartyのテンプレート側に埋め込む変数タグ {$hoge} に使うオプション {$hoge&#124;nl2br} みたいなのを自作するっていうこと。 自分で作るとは言ったものの、その前にまずはここを見てください。 Smartyマニュアル 第5章変数の修飾子 別にめんどくさかったら見なくてもいいです。 重要なのは次の部分。 変数の修飾子は、 変数 や カスタム関数 や文字列を修飾して出力することができます。修飾子を適用するには、 変数名の後に &#124; (パイプ) と修飾子の名前を指定します。 また、修飾子はその動作に影響を及ぼす追加のパラメータを受け入れる場合もあります。 そのパラメータは修飾子の後に続き、: (コロン) によって区切られます。 また、すべての PHP 関数は、暗黙的に修飾子として使用でき (あとで説明します)、修飾子は 組み合わせる こともできます。 つまり、独自に設定された修飾子じゃなくても、PHPの変数が普通に使えるってことです。なにそれ便利。 だから、こんなこともできちゃう。 {$hoge&#124;strtr:"みどり":"あか"} これを見て、なんか自分で拡張できそうだなーと思ったらできました。 やり方は以下。 【目的】　{$hoge&#124;href} と書くと、変数に含まれたURLにリンクを貼るSmartyプラグインを作る ファイル名を「modifier.href.php」とします。 コードは以下。 function smarty_modifier_href($string) { return preg_replace("/s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&#038;=+\$,%#]+/","$0",$string); } 他のファイルを参考にするとわかりますが、 ・上部に作者情報とかのコメントを書く ・ファイル名とファンクション名を一致させる というのがSmartyプラグインの通例のようです。 あとはSmartyプラグインのフォルダ（Smarty/plugins）に設置すれば使えます。 まぁコピペすれば使えるんですけど、一応置いておきますね。 ダウンロード Smartyプラグインのファンクションを生成した場合、第一引数は暗黙的に割り当てた変数の内容が入ります。 他の引数は第二引数以降に入ります。 function [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>僕はSmarty（テンプレートエンジン）をよく使うのですが、ちょっとこういう機能欲しいなーということがありまして、マニュアルを探してみたらなかったので、ないなら作っちゃえばいいじゃんというメモ。</p>
<p>簡単に言うと、Smartyのテンプレート側に埋め込む変数タグ {$hoge} に使うオプション {$hoge|nl2br} みたいなのを自作するっていうこと。</p>
<p><span id="more-447"></span></p>
<p>自分で作るとは言ったものの、その前にまずはここを見てください。</p>
<blockquote><p><a href="http://www.smarty.net/manual/ja/language.modifiers.php">Smartyマニュアル 第5章変数の修飾子</a></p></blockquote>
<p>別にめんどくさかったら見なくてもいいです。</p>
<p>重要なのは次の部分。</p>
<blockquote><p>変数の修飾子は、 変数 や カスタム関数  や文字列を修飾して出力することができます。修飾子を適用するには、 変数名の後に | (パイプ) と修飾子の名前を指定します。 また、修飾子はその動作に影響を及ぼす追加のパラメータを受け入れる場合もあります。 そのパラメータは修飾子の後に続き、: (コロン) によって区切られます。 また、<strong>すべての PHP 関数は、暗黙的に修飾子として使用でき</strong> (あとで説明します)、修飾子は 組み合わせる  こともできます。</p></blockquote>
<p>つまり、独自に設定された修飾子じゃなくても、PHPの変数が普通に使えるってことです。なにそれ便利。</p>
<p>だから、こんなこともできちゃう。</p>
<pre name="code" class="php">
{$hoge|strtr:"みどり":"あか"}
</pre>
<p>これを見て、なんか自分で拡張できそうだなーと思ったらできました。</p>
<p>やり方は以下。</p>
<p>【目的】　{$hoge|href} と書くと、変数に含まれたURLにリンクを貼るSmartyプラグインを作る<br />
ファイル名を「modifier.href.php」とします。<br />
コードは以下。</p>
<pre name="code" class="php">

function smarty_modifier_href($string)
{
    return preg_replace("/s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&#038;=+\$,%#]+/","<a href='$0' target='_blank'>$0</a>",$string);
}
</pre>
<p>他のファイルを参考にするとわかりますが、<br />
・上部に作者情報とかのコメントを書く<br />
・ファイル名とファンクション名を一致させる<br />
というのがSmartyプラグインの通例のようです。</p>
<p>あとはSmartyプラグインのフォルダ（Smarty/plugins）に設置すれば使えます。</p>
<p>まぁコピペすれば使えるんですけど、一応置いておきますね。</p>
<p><a href="http://quoit.jp/dl/dl.php">ダウンロード</a></p>
<p>Smartyプラグインのファンクションを生成した場合、第一引数は暗黙的に割り当てた変数の内容が入ります。</p>
<p>他の引数は第二引数以降に入ります。</p>
<pre name="code" class="php">

function smarty_modifier_href($string,$target='_blank')
{
    return preg_replace("/s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&#038;=+\$,%#]+/","<a href='$0' target='$target'>$0</a>",$string);
}
</pre>
<p>とした場合、</p>
<p>{$hoge|href:&#8221;_self&#8221;}</p>
<p>と書けばよいのです。<br />
ちなみにSmartyでは、「:」で区切ると複数の引数を渡せます。<br />
（例：　{$hoge|href:&#8221;_self&#8221;:&#8221;piyo&#8221;}　）</p>
<p>というわけで、簡単に作れますよというお話でした。</p>
<div class="shr-publisher-447"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2010/12/14/smarty%e3%81%ae%e3%82%aa%e3%83%97%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e4%bd%9c%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>今度はPHPExcelを使ってみた</title>
		<link>http://ken.quoit.jp/2010/11/01/%e4%bb%8a%e5%ba%a6%e3%81%afphpexcel%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/</link>
		<comments>http://ken.quoit.jp/2010/11/01/%e4%bb%8a%e5%ba%a6%e3%81%afphpexcel%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 12:52:38 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[エクセル]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=505</guid>
		<description><![CDATA[前回の挑戦が不成功に終わって悔しいのでリベンジを。 今度はちょっと重めのライブラリ、「PHPExcel」を使います。 記事執筆時点でのバージョンは1.7.4です。 参考にしたのはこちらの記事。 PHPExcelで.xls形式のファイルを扱う &#124; バシャログ。 基本的な使い方が書いてありますが、CakePHP用に書かれているので一部修正。（Extends Objectを削除しただけ） さて、これで使えるかな？と思ったら何故か最初の一列目しか取得できず…(´・ω・`) なんでだろうと思って確認したのが以下の部分。 //データ領域を確認 $rowMax = $rowCount; if (is_null($rowCount)) { $rowMax = $objSheet-&#62;getHighestRow(); } $colMax = $colCount; if (is_null($colCount)) { $colMax = $objSheet-&#62;getHighestColumn(); } どうやらここでデータの範囲を指定しているらしい… じゃあ$colMax の値がおかしいのかとおもってvar_dumpしてみたら、「 string(2) &#8220;BD&#8221; 」だってさ。 そりゃforでは回せません。。 で行き着いたのがこちら。 天文館で働くフリープログラマーのシナプスぶろぐ: PHPExcel このブログを見ると、 $colMax = $xlsSheet-&#62;getHighestColumn(); $colsno = PHPExcel_Cell::columnIndexFromString($colMax); ってほら、ちゃんとやってんじゃん。 というわけでさっきの部分以下のように書き換えて解決。 //データ領域を確認 $rowMax = $rowCount; [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://ken.quoit.jp/2010/11/01/spreadsheet_excel_reader%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/">前回</a>の挑戦が不成功に終わって悔しいのでリベンジを。</p>
<p>今度はちょっと重めのライブラリ、「<a href="http://phpexcel.codeplex.com/releases/view/26478" target="_blank">PHPExcel</a>」を使います。<br />
記事執筆時点でのバージョンは1.7.4です。</p>
<p><span id="more-505"></span></p>
<p>参考にしたのはこちらの記事。</p>
<blockquote><p><a href="http://c-brains.jp/blog/wsg/09/09/10-130907.php">PHPExcelで.xls形式のファイルを扱う | バシャログ。</a></p></blockquote>
<p>基本的な使い方が書いてありますが、CakePHP用に書かれているので一部修正。（Extends Objectを削除しただけ）</p>
<p>さて、これで使えるかな？と思ったら何故か最初の一列目しか取得できず…(´・ω・`)</p>
<p>なんでだろうと思って確認したのが以下の部分。</p>
<pre name="code" class="php">//データ領域を確認
$rowMax = $rowCount;
if (is_null($rowCount)) {
	$rowMax = $objSheet-&gt;getHighestRow();
}
$colMax = $colCount;
if (is_null($colCount)) {
	$colMax = $objSheet-&gt;getHighestColumn();
}</pre>
<p>どうやらここでデータの範囲を指定しているらしい…<br />
じゃあ$colMax の値がおかしいのかとおもってvar_dumpしてみたら、「 string(2) &#8220;BD&#8221; 」だってさ。<br />
そりゃforでは回せません。。</p>
<p>で行き着いたのがこちら。</p>
<blockquote><p><a href="http://hysd.synapse-blog.jp/devlog/2010/07/phpexcel.html">天文館で働くフリープログラマーのシナプスぶろぐ: PHPExcel</a></p></blockquote>
<p>このブログを見ると、</p>
<pre name="code" class="php">
$colMax = $xlsSheet-&gt;getHighestColumn();
$colsno =  PHPExcel_Cell::columnIndexFromString($colMax);
</pre>
<p>ってほら、ちゃんとやってんじゃん。</p>
<p>というわけでさっきの部分以下のように書き換えて解決。</p>
<pre name="code" class="php">
//データ領域を確認
$rowMax = $rowCount;
if (is_null($rowCount)) {
	$rowMax = $objSheet-&gt;getHighestRow();
}
$colMax = $colCount;
if (is_null($colCount)) {
	$colMaxStr = $objSheet-&gt;getHighestColumn();
	$colMax = PHPExcel_Cell::columnIndexFromString($colMaxStr);
}
</pre>
<p>今度はspreadsheet_excel_readerで失敗したエクセルも読み込めた！</p>
<p>しかもPHPExcel自体はEXCEL2007形式に元から対応してるので、</p>
<pre name="code" class="php">
$objReader = PHPExcel_IOFactory::createReader('Excel5');
</pre>
<p>ここを</p>
<pre name="code" class="php">
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
</pre>
<p>ってしてやれば読める（はず）。</p>
<p>これは便利！</p>
<p>これにてミッションクリアです！＾ｑ＾</p>
<p>【追記 10/11/02 11:00】<br />
難点があります。<br />
まずこのライブラリ、結構重いです。<br />
必要なクラスファイルだけで8MB近くあります。<br />
サーバに余裕が無いときはおすすめできないかもしれませんが、今時そんな容量の少ないところはない…かな？<br />
あと、PHP5.2.0以上が必須となってます。<br />
必要モジュールはphp_zip、php_xml、php_gd2。<br />
php_zipはEXCEL2007形式の時に必要とのことです。<br />
念のため。</p>
<div class="shr-publisher-505"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2010/11/01/%e4%bb%8a%e5%ba%a6%e3%81%afphpexcel%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Spreadsheet_Excel_Readerを使ってみた</title>
		<link>http://ken.quoit.jp/2010/11/01/spreadsheet_excel_reader%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/</link>
		<comments>http://ken.quoit.jp/2010/11/01/spreadsheet_excel_reader%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 06:23:35 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[エクセル]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=491</guid>
		<description><![CDATA[PHPでエクセルファイルを読み込む必要があったので、Spreadsheet_Excel_Readerを使うことにした。 しかし結構クセのある感じだったので、僕の使ったときのことを書いときます。 何かのお役に立てば。 &#160; 最初に参考にしたのは下記のブログ記事。 PHPでエクセル(excel)を読み込む「Spreadsheet_Excel_Reader」｜本を買わずに解決するWeb制作の小技 基本的な使い方も書いてあったので助かりました。 ただ、日本語（マルチバイト文字）を扱うときはもうちょい設定が必要。 僕の初期設定を書くと、以下のような感じ。 &#160; 1) ライブラリの読み込みパスを変更（そもそもなんで違うんだよ…バカなの？死ぬの？ × require_once 'Spreadsheet/Excel/Reader/OLERead.php'; ↓ ○ require_once 'oleread.inc'; 一緒に入ってるファイルを読み込むように変更します。 &#160; 2) PHPの初期設定 &#60;?php require_once('./Excel/reader.php'); # INITIALIZE $excel = new Spreadsheet_Excel_Reader(); $excel-&#62;setUTFEncoder('mb'); $excel-&#62;setOutputEncoding('UTF-8'); # エクセル読み込み $excel-&#62;read("hoge.xls"); # シート番号「0」の内容をダンプ（テストのためね） var_dump($excel-&#62;sheets[0]); ?&#62; ってな感じ。 $excel-&#62;setUTFEncoder('mb'); $excel-&#62;setOutputEncoding('UTF-8'); 日本語対応のためにこの部分を足しました。 &#160; 3) どうもやっぱりおかしい なんでか、ほとんど同じ書式のエクセルファイルでも、読み込めるものと読み込めないものがあるようです。 Spreadsheet_excel_Reader データが取り込めな&#8230; &#8211; PHP &#8211; 教えて！goo どうやら、セルの結合など、エクセルの書式が原因になっている様子？ [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>PHPでエクセルファイルを読み込む必要があったので、<a href="http://sourceforge.net/projects/phpexcelreader/" target="_blank">Spreadsheet_Excel_Reader</a>を使うことにした。</p>
<p>しかし結構クセのある感じだったので、僕の使ったときのことを書いときます。<br />
何かのお役に立てば。</p>
<p><span id="more-491"></span></p>
<p>&nbsp;</p>
<p>最初に参考にしたのは下記のブログ記事。</p>
<blockquote><p><a href="http://ameblo.jp/linking/entry-10077767160.html" target="_blank">PHPでエクセル(excel)を読み込む「Spreadsheet_Excel_Reader」｜本を買わずに解決するWeb制作の小技</a></p></blockquote>
<p>基本的な使い方も書いてあったので助かりました。</p>
<p>ただ、日本語（マルチバイト文字）を扱うときはもうちょい設定が必要。</p>
<p>僕の初期設定を書くと、以下のような感じ。</p>
<p>&nbsp;</p>
<p><strong style="font-size:16px;">1) ライブラリの読み込みパスを変更</strong><span style="font-size: 8px;">（そもそもなんで違うんだよ…バカなの？死ぬの？</span></p>
<p>×</p>
<pre name="code" class="php">
require_once 'Spreadsheet/Excel/Reader/OLERead.php';
</pre>
<p>↓<br />
○</p>
<pre name="code" class="php">
require_once 'oleread.inc';
</pre>
<p>一緒に入ってるファイルを読み込むように変更します。</p>
<p>&nbsp;</p>
<p><strong style="font-size:16px;">2) PHPの初期設定</strong></p>
<pre name="code" class="php">
&lt;?php

require_once('./Excel/reader.php');

# INITIALIZE
$excel = new Spreadsheet_Excel_Reader();
$excel-&gt;setUTFEncoder('mb');
$excel-&gt;setOutputEncoding('UTF-8');

# エクセル読み込み
$excel-&gt;read("hoge.xls");

# シート番号「0」の内容をダンプ（テストのためね）
var_dump($excel-&gt;sheets[0]);

?&gt;
</pre>
<p>ってな感じ。</p>
<pre name="code" class="php">
$excel-&gt;setUTFEncoder('mb');
$excel-&gt;setOutputEncoding('UTF-8');
</pre>
<p>日本語対応のためにこの部分を足しました。</p>
<p>&nbsp;</p>
<p><strong style="font-size:16px;">3) どうもやっぱりおかしい</strong></p>
<p>なんでか、ほとんど同じ書式のエクセルファイルでも、読み込めるものと読み込めないものがあるようです。</p>
<blockquote><p><a href="http://oshiete.goo.ne.jp/qa/4344003.html" target="_blank">Spreadsheet_excel_Reader  データが取り込めな&#8230; &#8211; PHP &#8211; 教えて！goo</a>
</p></blockquote>
<p>どうやら、セルの結合など、エクセルの書式が原因になっている様子？</p>
<p>試しに、読み込めないエクセルファイルで以下操作を行なってみました。</p>
<p>　（１） 結合されているセルを一回解除<br />
　（２） もう一回同じようにセルを結合</p>
<p>したら、直った。<br />
会社のエクセルはEXCEL 2003 SP3。</p>
<p>元のファイルを作った環境が定かでないので特定は出来ないが、環境による違いである可能性は高い。</p>
<p>ちなみに、セルの結合を全て解除した状態であれば問題なく読み込めたので、最悪の場合はそういう形でエクセルを作るのが良いだろう。</p>
<p>余談だが、ウィンドウ枠の固定は読み込みには影響ないようだ。</p>
<p>とりあえずこんな感じ。何かあったら追記します。</p>
<p>【追記 10/11/01 17:37】<br />
やはり何かがおかしい…<br />
var_dump($excel);<br />
とすると、どうやら $excel-&gt;sst というところにデータが入ってるようなのでデータ自体は読み込めてるようだが、<br />
$excel-&gt;sheets にデータが入らない。</p>
<p>$excel-&gt;sst にはセル情報が含まれないので、このままでは解析は不可能…どうしたものか(´・ω・`)</p>
<p>【追記 10/11/01 19:35】<br />
結局、下記の方法で読み込めた。</p>
<p>1) エクセルのシートを全選択してctrl + cでコピー、テキストエディタに貼りつけ（僕は<a href="http://notepad-plus-plus.org/" target="_blank">notepad++</a>使ってます）</p>
<p>2) テキストエディタの文面をctrl + cでコピー、元のエクセルに貼りつけ。</p>
<p>つまり、データを一回外に出して戻しただけ。</p>
<p>この操作でエクセルのヘッダ情報とか変わったりするのだろうか…</p>
<p>引き続き調査が必要なようです(´・ω・`)</p>
<p>【追記 10/11/01 20:21】<br />
やはりバージョンによる違いが原因になっている模様。<br />
より高機能な「<a href="http://sourceforge.jp/projects/reviser/releases/32792" target="_blank">Excel_Peruser</a>」というものがあったらしいが、2010/11/01現在、ダウンロードリンクが見つからない。<br />
プロジェクトが活動停止中となっているので、もうやめちゃったのかな…(´・ω・`)</p>
<p>今回はお客さんが直接データをあげられるために、という目的なので、CSVに変換してもらう方向で検討中…orz</p>
<p>エクセルはなかなか手強いようです(´・ω・`)</p>
<p>【結論 10/11/01 20:21】<br />
利用するエクセルのバージョンを固定することができなければ、<br />
日本語を交えたデータをSpreadsheet_Excel_Readerで扱うのは難しいようです。<br />
もし画期的な解決策があればまた記事を書きますね。</p>
<p>【追記 10/11/02 12:28】<br />
友人の<a href="http://twitter.com/ctrlAK/" target="_blank">@ctrlAK</a>氏がいろいろな環境で実験してくれました。ありがとう！<br />
ファイルの生成は以下の２環境。<br />
１）Windows XP SP3 + Excel 2003 SP3<br />
２）Mac OS X 10.5.8 + Excel 2008 for Mac<br />
文字装飾、セルの結合あり。<br />
僕と同様のプログラムで読み込みは成功したとのこと。<br />
うーん、やはり特定の環境だけで発生するものなんでしょうか…(´・ω・`)</p>
<p>&nbsp;</p>
<p>【この記事の続き】<br />
<a href="http://ken.quoit.jp/2010/11/01/%E4%BB%8A%E5%BA%A6%E3%81%AFphpexcel%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/">今度はPHPExcelを使ってみた</a></p>
<div class="shr-publisher-491"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2010/11/01/spreadsheet_excel_reader%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHPでのCOOKIEの挙動がちょっと面白かった</title>
		<link>http://ken.quoit.jp/2010/02/24/php%e3%81%a7%e3%81%aecookie%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%8c%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e9%9d%a2%e7%99%bd%e3%81%8b%e3%81%a3%e3%81%9f/</link>
		<comments>http://ken.quoit.jp/2010/02/24/php%e3%81%a7%e3%81%aecookie%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%8c%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e9%9d%a2%e7%99%bd%e3%81%8b%e3%81%a3%e3%81%9f/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 05:38:27 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[雑談]]></category>
		<category><![CDATA[COOKIE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SESSION]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=356</guid>
		<description><![CDATA[注）すっごいどうでもいい記事です。 プログラム組んでたらなんか見つけたので一応書いてみます。 &#60;?php session_start(); $_SESSION["name_s"]=&#8221;hogehoge&#8221;; setcookie(&#8220;name_c&#8221;, &#8220;hogehoge&#8221;, time()+3600); var_dump($_SESSION); var_dump($_COOKIE); ?&#62; このコードの出力結果ってどうなると思います？ まぁひっぱる内容でもないからいいんですけど。 結果はこちら。 array(1) { ["name_s"]=&#62; string(8) &#8220;hogehoge&#8221; } array(1) { ["__utma"]=&#62; string(65) &#8220;＜略＞&#8221; } あれ？クッキーがセットされてなくね…？ でも不思議なことに、ブラウザのクッキーを確認してみると、きちんと値が入っている。 関数の実行順序とかの問題？ ちなみに、ページを更新すると array(1) { ["name_s"]=&#62; string(8) &#8220;piyopiyo&#8221; } array(3) { ["__utma"]=&#62; string(65) &#8220;＜略＞&#8221; ["PHPSESSID"]=&#62; string(32) &#8220;＜略＞&#8221; ["name_c"]=&#62; string(8) &#8220;piyopiyo&#8221; } と、こうなる。 更新した時点で初めてPHPSESSIDもセットされていることが確認できるので、やっぱり実行順序の問題なんでしょう。 PHPは最後にクッキーをセットしているということですね。 ほんとどうでもいい気付きでした。 10/02/24 21:00修正 最後にセットしているわけではなく、$_COOKIEがHTTPリクエスト時のクッキー内容を参照しているとのコメントを頂きました！Nackyさん、ありがとうございます！^^ [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>注）すっごいどうでもいい記事です。</p>
<p>プログラム組んでたらなんか見つけたので一応書いてみます。</p>
<p><span id="more-356"></span></p>
<blockquote><p>&lt;?php</p>
<p>session_start();</p>
<p>$_SESSION["name_s"]=&#8221;hogehoge&#8221;;<br />
setcookie(&#8220;name_c&#8221;, &#8220;hogehoge&#8221;, time()+3600);</p>
<p>var_dump($_SESSION);<br />
var_dump($_COOKIE);</p>
<p>?&gt;</p></blockquote>
<p>このコードの出力結果ってどうなると思います？</p>
<p>まぁひっぱる内容でもないからいいんですけど。</p>
<p>結果はこちら。</p>
<blockquote><p>array(1) {<br />
["name_s"]=&gt;<br />
string(8) &#8220;hogehoge&#8221;<br />
}<br />
array(1) {<br />
["__utma"]=&gt;<br />
string(65) &#8220;＜略＞&#8221;<br />
}</p></blockquote>
<p>あれ？クッキーがセットされてなくね…？</p>
<p>でも不思議なことに、ブラウザのクッキーを確認してみると、きちんと値が入っている。</p>
<p>関数の実行順序とかの問題？</p>
<p>ちなみに、ページを更新すると</p>
<blockquote><p>array(1) {<br />
["name_s"]=&gt;<br />
string(8) &#8220;piyopiyo&#8221;<br />
}<br />
array(3) {<br />
["__utma"]=&gt;<br />
string(65) &#8220;＜略＞&#8221;<br />
["PHPSESSID"]=&gt;<br />
string(32) &#8220;＜略＞&#8221;<br />
["name_c"]=&gt;<br />
string(8) &#8220;piyopiyo&#8221;<br />
}</p></blockquote>
<p>と、こうなる。</p>
<p>更新した時点で初めてPHPSESSIDもセットされていることが確認できるので、やっぱり実行順序の問題なんでしょう。</p>
<p><del datetime="2010-02-24T12:07:37+00:00">PHPは最後にクッキーをセットしているということですね。</p>
<p>ほんとどうでもいい気付きでした。<br />
</del></p>
<div style="color:red;">
<b>10/02/24 21:00修正</b><br />
最後にセットしているわけではなく、$_COOKIEがHTTPリクエスト時のクッキー内容を参照しているとのコメントを頂きました！Nackyさん、ありがとうございます！^^
</div>
<p>↑冷静に考えたらそりゃそうですよね。<br />
ブラウザがリクエスト→サーバがレスポンスという大原則が頭から抜けてましたｗ<br />
ホント初歩的ですいませんｗ</p>
<p>この記事は自分の恥さらしということで残します…ｗ</p>
<div class="shr-publisher-356"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2010/02/24/php%e3%81%a7%e3%81%aecookie%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%8c%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e9%9d%a2%e7%99%bd%e3%81%8b%e3%81%a3%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHPでImageMagick</title>
		<link>http://ken.quoit.jp/2009/10/22/php%e3%81%a7imagemagick/</link>
		<comments>http://ken.quoit.jp/2009/10/22/php%e3%81%a7imagemagick/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 11:34:01 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ImageMagick]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=272</guid>
		<description><![CDATA[ImageMagickをPHPで使用する手段として、「PECL :: Package :: imagick」がある。 しかしながら、PHPのマニュアルにはImagickクラスについての情報が少ないのです。（なんでだろ？） 既にImageMagickを使っている人なら問題ないのかもしれない（？）ですが、私のようなヘタレSEには困った状態です。 模索しながらですが、いろいろと試してみました。 １）インストール まずはインストールから。 参考にしたのはこちら。 PHPライブラリ「Imagick」で携帯の機種に応じた画像を表示する（1/3）：CodeZine CodeZine最高だぜ！と思って普通に 「pecl install imagick」 を実行！ …phpizeが無いと怒られた。 調べてみると、どうやら「php-devel」に含まれている模様。 まずはこっちからか。。。と思って「yum install php-devel」を実行。 ここでリポジトリの追加を忘れていてハマりまくった…orz 凡ミスであればあるほどショック大きいです。。；； 気を取り直して。 php-develはインストールできましたので、改めて「pecl install imagick」を実行。 今度は素直に入ってくれましたｗ php.iniに「extension=imagick.so」を追記すればインストールは完了。 ２）使ってみる さて、早速使ってみましょうか。 たとえばこんなコードがあったとします。 ※php-gdはインストールされているものとします。 ※例によって、実際にコードをこのまま使うのは危険ですからね！ &#60;?php if(!empty($_GET)){ $filename = $_GET["f"]; }else{ echo &#8220;Error&#8221;; exit(); } $data = pathinfo($filename); $info = getimagesize($filename); $mime = $info['mime']; header(&#8216;Content-type: [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>ImageMagickをPHPで使用する手段として、「PECL :: Package :: imagick」がある。</p>
<p>しかしながら、PHPのマニュアルにはImagickクラスについての情報が少ないのです。（なんでだろ？）</p>
<p>既にImageMagickを使っている人なら問題ないのかもしれない（？）ですが、私のようなヘタレSEには困った状態です。</p>
<p>模索しながらですが、いろいろと試してみました。<br />
<span id="more-272"></span><br />
<strong>１）インストール</strong><br />
まずはインストールから。<br />
参考にしたのはこちら。</p>
<blockquote><p><a href="http://codezine.jp/article/detail/4401" target="_blank">PHPライブラリ「Imagick」で携帯の機種に応じた画像を表示する（1/3）：CodeZine</a></p></blockquote>
<p>CodeZine最高だぜ！と思って普通に 「pecl install imagick」 を実行！</p>
<p>…phpizeが無いと怒られた。</p>
<p>調べてみると、どうやら「php-devel」に含まれている模様。<br />
まずはこっちからか。。。と思って「yum install php-devel」を実行。</p>
<p><small>ここでリポジトリの追加を忘れていてハマりまくった…orz<br />
凡ミスであればあるほどショック大きいです。。；；</small></p>
<p>気を取り直して。<br />
php-develはインストールできましたので、改めて「pecl install imagick」を実行。</p>
<p>今度は素直に入ってくれましたｗ</p>
<p>php.iniに「extension=imagick.so」を追記すればインストールは完了。</p>
<p><strong>２）使ってみる</strong><br />
さて、早速使ってみましょうか。</p>
<p>たとえばこんなコードがあったとします。<br />
※php-gdはインストールされているものとします。<br />
※例によって、実際にコードをこのまま使うのは危険ですからね！</p>
<blockquote><p>&lt;?php</p>
<p>if(!empty($_GET)){<br />
$filename = $_GET["f"];<br />
}else{<br />
echo &#8220;Error&#8221;;<br />
exit();<br />
}</p>
<p>$data = pathinfo($filename);<br />
$info = getimagesize($filename);<br />
$mime = $info['mime'];</p>
<p>header(&#8216;Content-type: &#8216;.$mime);<br />
echo readfile($filename);</p>
<p>?&gt;</p></blockquote>
<p>$_GET["f"]としてファイル名を渡してあげると、それを表示するというだけの単純な仕組みです。</p>
<p>これだけならGDモジュールで充分ですが、ImageMagickのすごいところはここからの処理です。</p>
<p><strong>例１）画像サイズを任意に変換できるようにしてみる</strong><br />
さて、さっきのコードを書き換えてみます。</p>
<blockquote><p>&lt;?php</p>
<p>if(!empty($_GET)){<br />
$filename = $_GET["f"];<br />
}else{<br />
echo &#8220;Error&#8221;;<br />
exit();<br />
}</p>
<p>$img = new Imagick();</p>
<p>$img-&gt;readImageBlob(file_get_contents($filename));</p>
<p># 拡張子を取得<br />
$data = pathinfo($filename);<br />
$ext = $data['extension'];</p>
<p># 扱う画像の種別<br />
$img -&gt; setImageFormat($ext);</p>
<p><span style="color:red;"># サイズ変換<br />
$img-&gt;thumbnailImage($_GET["width"],$_GET["height"]);</span></p>
<p># 圧縮<br />
$img-&gt;setCompressionQuality(80);</p>
<p>$info = getimagesize($filename);<br />
$mime = $info['mime'];<br />
header(&#8216;Content-type: &#8216;.$mime);<br />
echo $img;</p>
<p>?&gt;</p></blockquote>
<p>$_GET["width"]と$_GET["height"]を与えてあげると、そのサイズに縮小してくれるようになりました。</p>
<p>ちなみに縦横比を維持したい場合は、基準になる値だけ指定して、<br />
もう一つを「0」とすれば（width=100&amp;height=0とか）OKです。</p>
<p>簡単ですね。ではもう一歩進めてみます。</p>
<p><strong>例２）コントラストを変えてみる</strong></p>
<p>さてまたコードをいじります。</p>
<blockquote><p>&lt;?php</p>
<p>if(!empty($_GET)){<br />
$filename = $_GET["f"];<br />
}else{<br />
echo &#8220;Error&#8221;;<br />
exit();<br />
}</p>
<p>$img = new Imagick();</p>
<p>$img-&gt;readImageBlob(file_get_contents($filename));</p>
<p># 拡張子を取得<br />
$data = pathinfo($filename);<br />
$ext = $data['extension'];</p>
<p># 扱う画像の種別<br />
$img -&gt; setImageFormat($ext);</p>
<p># サイズ変換<br />
$img-&gt;thumbnailImage($_GET["width"],$_GET["height"]);</p>
<p><span style="color:red;"># コントラスト<br />
$img-&gt;normalizeImage($_GET["contrust"]);</span></p>
<p># 圧縮<br />
$img-&gt;setCompressionQuality(80);</p>
<p>$info = getimagesize($filename);<br />
$mime = $info['mime'];<br />
header(&#8216;Content-type: &#8216;.$mime);<br />
echo $img;</p>
<p>?&gt;</p></blockquote>
<p>$_GET["contrust"]で値を渡すと、コントラストを変えてくれます。</p>
<p>さて、なんだか予想がついてきましたでしょうか…？</p>
<p>こんな簡単な変更で（頑張れば）フォトショ並みの加工を施すことができるのです！（言いすぎか？）</p>
<p>他の処理内容についてはマニュアルをどうぞ。</p>
<blockquote><p><a href="http://jp.php.net/imagick" target="_blank">PHP: ImageMagick &#8211; Manual</a></p></blockquote>
<p>※冒頭でも述べましたが、情報が少ないです！</p>
<p>引数のリストは記載されていますので、色々模索してみても楽しそうです。</p>
<div class="shr-publisher-272"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2009/10/22/php%e3%81%a7imagemagick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>submitとimageの挙動の違いについて</title>
		<link>http://ken.quoit.jp/2009/10/14/submit%e3%81%a8image%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%ae%e9%81%95%e3%81%84%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/</link>
		<comments>http://ken.quoit.jp/2009/10/14/submit%e3%81%a8image%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%ae%e9%81%95%e3%81%84%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 07:58:52 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=197</guid>
		<description><![CDATA[twitterの友人のブログ記事を見ていて思い出したこと。 CSSで検索フォームをカスタマイズ ? vanillate とても良い記事なので是非ご覧あれ。 （長くなっちゃったので、覚悟して読んでね！） さて本題。 formタグからデータを送信する方法として、一般的に &#60;input type=&#8221;submit&#8221; value=&#8221;送信&#8221; /&#62; とする方法と &#60;input src=&#8221;hoge.gif&#8221; type=&#8221;image&#8221; value=&#8221;送信&#8221; /&#62; として画像を送信ボタンにする方法がある。 さらにsubmitにはnameタグをつけて、そのデータを取得することが出来る。 例えば。 （※これは乱暴なコードです！決して実際に使おうとか考えないように！） &#60;form action=&#8221;recieve.php&#8221; method=&#8221;post&#8221;&#62; &#60;input name=&#8221;text01&#8243; id=&#8221;text01&#8243; type=&#8221;text&#8221; /&#62; &#60;input id=&#8221;submit_id&#8221; name=&#8221;submit_name&#8221; type=&#8221;submit&#8221; value=&#8221;送信&#8221; /&#62; &#60;/form&#62; このフォームから送信されたデータはこちら。 array(2) { ["text01"]=&#62; string(9) &#8220;テスト&#8221; ["submit_name"]=&#62; string(6) &#8220;送信&#8221; } まぁ、普通ですね。 では次。 フォーム内に複数の送信ボタンがあったらどうでしょう？ 面倒なのでついでに画像の送信ボタンも置いてみました。 &#60;form method=&#8221;post&#8221; action=&#8221;recieve.php&#8221;&#62; &#60;input [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>twitterの友人のブログ記事を見ていて思い出したこと。</p>
<blockquote><p><a href="http://vanillate.org/archives/147">CSSで検索フォームをカスタマイズ ?  vanillate</a></p></blockquote>
<p>とても良い記事なので是非ご覧あれ。<br />
<br />
（長くなっちゃったので、覚悟して読んでね！）<br />
<span id="more-197"></span><br />
<br />
さて本題。<br />
formタグからデータを送信する方法として、一般的に</p>
<p>&lt;input type=&#8221;submit&#8221; value=&#8221;送信&#8221; /&gt;</p>
<p>とする方法と</p>
<p>&lt;input src=&#8221;hoge.gif&#8221; type=&#8221;image&#8221; value=&#8221;送信&#8221; /&gt;</p>
<p>として画像を送信ボタンにする方法がある。</p>
<p>さらにsubmitにはnameタグをつけて、そのデータを取得することが出来る。<br />
<br />
例えば。</p>
<p>（※これは乱暴なコードです！決して実際に使おうとか考えないように！）</p>
<blockquote><p>&lt;form action=&#8221;recieve.php&#8221; method=&#8221;post&#8221;&gt;<br />
&lt;input name=&#8221;text01&#8243; id=&#8221;text01&#8243; type=&#8221;text&#8221; /&gt;<br />
&lt;input id=&#8221;submit_id&#8221; name=&#8221;submit_name&#8221; type=&#8221;submit&#8221; value=&#8221;送信&#8221; /&gt;<br />
&lt;/form&gt;</p></blockquote>
<p>このフォームから送信されたデータはこちら。</p>
<blockquote><p>array(2) {<br />
["text01"]=&gt;<br />
string(9) &#8220;テスト&#8221;<br />
["submit_name"]=&gt;<br />
string(6) &#8220;送信&#8221;<br />
}</p></blockquote>
<p>まぁ、普通ですね。<br />
では次。</p>
<p>フォーム内に複数の送信ボタンがあったらどうでしょう？<br />
面倒なのでついでに画像の送信ボタンも置いてみました。</p>
<blockquote><p>&lt;form method=&#8221;post&#8221; action=&#8221;recieve.php&#8221;&gt;<br />
&lt;input type=&#8221;text&#8221; name=&#8221;text01&#8243; id=&#8221;text01&#8243; /&gt;</p>
<p>&lt;input type=&#8221;submit&#8221; name=&#8221;submit_name&#8221; id=&#8221;submit_id&#8221; value=&#8221;送信&#8221; /&gt;<br />
&lt;input type=&#8221;submit&#8221; name=&#8221;cancel_name&#8221; id=&#8221;cancel_id&#8221; value=&#8221;キャンセル&#8221; /&gt;<br />
&lt;input type=&#8221;image&#8221; name=&#8221;image_name&#8221; id=&#8221;image_id&#8221; value=&#8221;送信&#8221; src=&#8221;hoge.gif&#8221; /&gt;<br />
&lt;/form&gt;</p></blockquote>
<p>まずは普通の送信ボタンを押したとき。</p>
<blockquote><p>array(2) {<br />
["text01"]=&gt;<br />
string(9) &#8220;テスト&#8221;<br />
["submit_name"]=&gt;<br />
string(6) &#8220;送信&#8221;<br />
}</p></blockquote>
<p>さっきと同じですね。<br />
キャンセルボタンと画像ボタンのデータは来てません。<br />
<br />
ではキャンセルボタンを押したとき。</p>
<blockquote><p>array(2) {<br />
["text01"]=&gt;<br />
string(9) &#8220;テスト&#8221;<br />
["cancel_name"]=&gt;<br />
string(15) &#8220;キャンセル&#8221;<br />
}</p></blockquote>
<p>送信ボタンを押したときと同じです。<br />
キャンセルボタンのデータが送信され、送信ボタンと画像ボタンのデータは無視されます。<br />
<br />
では最後に画像ボタン。</p>
<blockquote><p>array(4) {<br />
["text01"]=&gt;<br />
string(9) &#8220;テスト&#8221;<br />
["image_name_x"]=&gt;<br />
string(2) &#8220;31&#8243;<br />
["image_name_y"]=&gt;<br />
string(1) &#8220;5&#8243;<br />
["image_name"]=&gt;<br />
string(6) &#8220;送信&#8221;<br />
}</p></blockquote>
<p>画像ボタンではクリックした座標の情報も来ますので、上の２つとは送信されるデータが違うわけです。<br />
ご存知の方も多いと思いますが。</p>
<p>さて、この画像での送信ボタン。<br />
問題になるのはどういう時か。</p>
<blockquote><p>&lt;form method=&#8221;post&#8221; action=&#8221;recieve.php&#8221;&gt;<br />
&lt;input type=&#8221;text&#8221; name=&#8221;text01&#8243; /&gt;</p>
<p>&lt;input type=&#8221;image&#8221; name=&#8221;trg_ok&#8221; value=&#8221;送信&#8221; src=&#8221;hoge.gif&#8221; /&gt;<br />
&lt;input type=&#8221;submit&#8221; name=&#8221;trg_cancel&#8221; value=&#8221;キャンセル&#8221; /&gt;<br />
&lt;/form&gt;</p></blockquote>
<p>画像の送信ボタンとsubmitのキャンセルボタンを配置しました。<br />
ここまでは問題ないのですが、受取側のプログラムが次のようになっていたとしましょう。</p>
<blockquote><p># POSTデータ受取し、キーの名前の変数に値を入れる<br />
foreach( $_POST as $k =&gt; $v ){<br />
if( strpos($k,&#8221;trg&#8221;)===FALSE ){<br />
$k = $v;<br />
}else{<br />
$trg = explode(&#8220;_&#8221;,$k);<br />
$trg_val = $v;<br />
}<br />
}</p>
<p>switch( $trg[1] ){<br />
case &#8220;ok&#8221;:echo $trg_val ;break;<br />
case &#8220;cancel&#8221;:echo $trg_val ;break;<br />
}</p></blockquote>
<p>（この処理自体あまりやらないかもしれませんが。。）<br />
<br />
Firefoxで画像送信ボタンを押した場合、「送信」と表示されます。<br />
<br />
問題は例によってIE6/7の場合。<br />
IE6/7の環境下では<strong>座標の数字が表示されてしまう</strong>のです。<br />
フォームから送信されたデータを見てみると、<br />
＜Firefoxの場合＞</p>
<blockquote><p>array(4) {<br />
["text01"]=&gt;<br />
string(9) &#8220;テスト&#8221;<br />
["trg_ok_x"]=&gt;<br />
string(2) &#8220;21&#8243;<br />
["trg_ok_y"]=&gt;<br />
string(2) &#8220;10&#8243;<br />
["trg_ok"]=&gt;<br />
string(6) &#8220;送信&#8221;<br />
}</p></blockquote>
<p>これに対して、<br />
＜IE6/7の場合＞</p>
<blockquote><p>array(3) {<br />
["text01"]=&gt;<br />
string(4) &#8220;test&#8221;<br />
["trg_ok_x"]=&gt;<br />
string(2) &#8220;45&#8243;<br />
["trg_ok_y"]=&gt;<br />
string(1) &#8220;7&#8243;<br />
}</p></blockquote>
<p>「　["trg_ok"] =&gt;&#8221;送信&#8221;　」の組合せがどっか行ってしまいました。<br />
しかもimageではなく、submitではちゃんと送信されてるから性質が悪い。<br />
あな恐ろしや。</p>
<p>自分が昔ハマッたバグのお話でした。<br />
こういう処理をするときには是非ご注意を。</p>
<div class="shr-publisher-197"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2009/10/14/submit%e3%81%a8image%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%ae%e9%81%95%e3%81%84%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>symfonyの勉強</title>
		<link>http://ken.quoit.jp/2009/10/13/symfony%e3%81%ae%e5%8b%89%e5%bc%b7/</link>
		<comments>http://ken.quoit.jp/2009/10/13/symfony%e3%81%ae%e5%8b%89%e5%bc%b7/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 06:20:36 +0000</pubDate>
		<dc:creator>yakumo</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://ken.quoit.jp/?p=154</guid>
		<description><![CDATA[さて、業務でsymfonyを使うことになったので目下勉強中なわけですが、 参考になった情報をいくつか書いておきます。 symfony.jp &#8211; PHP5用フレームワークsymfony日本語情報サイト ※この記事執筆時点で、symfonyのバージョンは1.3.0ALPHA1までがリリースされています。 まずアマゾンで書籍を探したのですが、どうもピンとくる（日本語の）書籍がありませんでした。 洋書なら良さそうなのがあるのですが、読むのに時間かかりそうなので、 インターネット上で日本語のドキュメントを探すことにしました。 まずは当然ながら公式ドキュメント。GoogleCodeに和訳がありました。 http://code.google.com/p/symfony-doc-ja/ 頻繁に更新されているようです。まずはここからでしょう。 次にCodeZine。 symfony入門（1）：symfonyで始めるPHPフレームワーク 全文を読むには確か会員登録が必要だったはず。 読みやすかったけど、ちょっと記事が古いようです。 あとは公式サイトで解説されているPractical symfony &#124; symfony &#124; Web PHP Framework。日本語訳。 ２４日をかけて少しずつ勉強していくというコンセプトで、ちょっと長いので１日でやるのはオススメできません。 いかにも日本語訳な感じなので、読みづらいところはありますが、わかりやすいとは思います。 とりあえず自分が手をつけたのはこのへんでした。]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>さて、業務でsymfonyを使うことになったので目下勉強中なわけですが、<br />
参考になった情報をいくつか書いておきます。<br />
<span id="more-154"></span><br />
<a href="http://symfony.jp/">symfony.jp &#8211; PHP5用フレームワークsymfony日本語情報サイト</a></p>
<p>※この記事執筆時点で、symfonyのバージョンは1.3.0ALPHA1までがリリースされています。</p>
<p>まずアマゾンで書籍を探したのですが、どうもピンとくる（日本語の）書籍がありませんでした。<br />
洋書なら良さそうなのがあるのですが、読むのに時間かかりそうなので、<br />
インターネット上で日本語のドキュメントを探すことにしました。</p>
<p>まずは当然ながら公式ドキュメント。GoogleCodeに和訳がありました。</p>
<p>http://code.google.com/p/symfony-doc-ja/</p>
<p>頻繁に更新されているようです。まずはここからでしょう。</p>
<p>次に<a href="http://codezine.jp/">CodeZine</a>。<br />
<a href="http://codezine.jp/article/detail/704">symfony入門（1）：symfonyで始めるPHPフレームワーク </a><br />
全文を読むには確か会員登録が必要だったはず。<br />
読みやすかったけど、ちょっと記事が古いようです。</p>
<p>あとは公式サイトで解説されている<a href="http://www.symfony-project.org/jobeet/1_2/Propel/ja/" target="_blank">Practical symfony | symfony | Web PHP Framework</a>。日本語訳。<br />
２４日をかけて少しずつ勉強していくというコンセプトで、ちょっと長いので１日でやるのはオススメできません。<br />
いかにも日本語訳な感じなので、読みづらいところはありますが、わかりやすいとは思います。</p>
<p>とりあえず自分が手をつけたのはこのへんでした。</p>
<div class="shr-publisher-154"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://ken.quoit.jp/2009/10/13/symfony%e3%81%ae%e5%8b%89%e5%bc%b7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

