数学、電気の勉強始めました!プログラムにも挑戦しています!|ω・)ノ

ねごとめも背景

# ねごとめも

# カウンター

# プロフィール

negotoy

Author:negotoy
電気の勉強始めました!
テキストエディタを使ってプログラミングに挑戦中。
fc2 ブログに公開しているテンプレート等は、自由にカスタマイズして、ご活用ください。
プログラム実行の前に必ずコードの確認をお願いします。

# 最新記事

# カレンダー

04 | 2013/05 | 06
- - - 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 -

# スポンサードリンク

{ <pre></pre> タグ版のテキストエディタ作成しました }

今回は PHPを利用した csv ファイルのアップロードテスト。
参考にさせていただいたサイト。
■ [PHP] ファイルアップロードの上限サイズを変更する際にさわるディレクティブまとめ
■ ファイルのアップロード
■ PHP5 HTML フォームでアップロードファイルサイズの制限
■ テストサイト → PHP を利用した csv ファイルアップロードテスト(1)

プログラムの流れ

  1. 選択ボタンで csv ファイルを選択
  2. upload ボタンで csv ファイルをサーバーへアップロード
  3. アップロードされた csv ファイルを fgetcsv 関数を使用して配列として取得。
  4. 取得した配列の値から HTML の table タグを使用して表を出力。
  5. アップロードした csv ファイルは HTML タグ出力後削除。

■ プログラム実行結果

csv アップロードテスト実行結果

プログラムの制限と注意事項

  1. アップロードできるファイルサイズの上限は 100KB
  2. 上限を超えたファイルをアップロードするとエラー表示。
  3. csv ファイルの区切りはカンマのみ
  4. 取得した配列の値から HTML の table タグを使用して表を出力。

csv ファイルのアップロードサイズの上限は .htaccess で設定。
.htaccess ファイルへ次の二行を追加。
php_value post_max_size 100000bytes
php_value upload_max_filesize 100000bytes
上記、二行を追加してアップローロファイルへ上限の設定は出来けど、
ローカル( xampp ) で上限を超えたファイルをアップロードした場合にエラーが出力される。
このエラーを回避するの方法がわからない。

■ Warning


Warning: POST Content-Length of 307042 bytes exceeds the limit of 100000 bytes in Unknown on line 0

■ upload.php


<?php
	function putFile()
	{
		$fileName="";
		$message="";
		if(is_uploaded_file(@$_FILES["uploadFile"]["tmp_name"]))
		{
			$uploadFile=$_FILES["uploadFile"]["name"];
			$check=explode(".",$uploadFile);
			if(count($check)==2&&$check[count($check)-1]=="csv")
			{
				$fileName="tmp/".$uploadFile;
				if(move_uploaded_file($_FILES["uploadFile"]["tmp_name"],$fileName))
				{
					chmod($fileName,0644);
				}
				else
				{
					$message="ファイルアップロードに失敗しました";
				}
			}
			else
			{
				$message="拡張子が csv 以外の可能性があります。";
			}
		}
		else
		{
			$message="ファイルサイズが 100KB より大きいファイルの選択、<br>又はファイルが選択されていない可能性があります。";
		}
		return array("fileName"=>$fileName,"message"=>$message);
	}
	$result=putFile();
	if($result["message"]=="")
	{
		$fp=fopen($result["fileName"],"r");
		if($fp)
		{
			if(flock($fp,LOCK_EX))
			{
				$table="<table style=\"background-color:#333;width:auto;height:auto;\"><tbody>";
				while($line=fgetcsv($fp))
				{
					$table.="<tr>";
					for($i=0;$i<count($line);$i++)
					{
						$str=htmlspecialchars(trim($line[$i]),ENT_QUOTES);
						$str=str_replace(array("\r\n","\n"),"<br>",$str);
						$table.="<td style=\"vertical-align:top;padding:1px;background-color:#fff;\"><p style=\"white-space:nowrap;width:auto;height:auto;\">".$str."</p></td>";
					}
					$table.="</tr>";
				}
				$table.="</tbody></table>";
				echo($table);
				flock($fp,LOCK_UN);
			}
			fclose($fp);
			if(file_exists($result["fileName"]))
			{
				unlink($result["fileName"]);
			}
		}
	}
	else
	{
		echo("<p>".$result["message"]."</p>\n");
	}
?>

今回は yahoo の急上昇ワード デイリーの取得テスト。
テストサイト → 急上昇ワード デイリー - Yahoo!検索データ取得テスト(1)
前回やった google 急上昇ワードは、 simplexml_load_file 関数と、
simple_load_string を使用して xml ファイルの値を取得。
今回は、同じく xml 値をツリー化して取得出来る new DomDocument クラス?を使用して、
xml 値の取得テスト。
yahoo の急上昇ワードデイリーのは "http://searchranking.yahoo.co.jp/rss/burst_ranking-rss.xml"
xml 形式で格納されてる。
new DomDocument の load 関数で xml をツリー化して値を格納。
あとは、 getElementsByTagName 関数でタグに格納されている値を取得。


<?php
	$url="http://searchranking.yahoo.co.jp/rss/burst_ranking-rss.xml";
	$doc=new DomDocument;
	$flg=@$doc->load($url);
	if($flg)
	{
		$root=$doc->documentElement;
		$channel=$root->getElementsByTagName("channel")->item(0);
		$title=$channel->getElementsByTagName("title")->item(0)->firstChild->nodeValue;
		$link=$channel->getElementsByTagName("link")->item(0)->firstChild->nodeValue;
		$lastBuildDate=$channel->getElementsByTagName("lastBuildDate")->item(0)->firstChild->nodeValue;
		$flg=preg_match("/[a-zA-Z]+, [0-9]+ [a-zA-Z]+ [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}/",$lastBuildDate,$match);
		echo("<div id=\"caption\">");
		echo("<a href=\"".$link."\" target=\"_top\">".$title."</a><br>");
		echo("<span style=\"font-size:80%\">lastBuildDate:[ ".$match[0]." ]</span>");
		echo("</div>");
		$items=$channel->getElementsByTagName("item");
		echo("<ol>\n");
		for($i=0;$i<$items->length;$i++)
		{
			$item=$items->item($i);
			$title=$item->getElementsByTagName("title")->item(0)->firstChild->nodeValue;
			$href=$item->getElementsByTagName("link")->item(0)->firstChild->nodeValue;
			$description=$item->getElementsByTagName("description")->item(0)->firstChild->nodeValue;
			echo("<li>[ ".$description." ]<br><a href=\"".$href."\" target=\"_top\">".$title."</a></li>\n");
		}
		echo("</ol>\n");
	}
	unset($doc);
?>

■ PHPを利用した Yahoo 急上昇ワード取得


今回は google の急上昇ワード取得テスト。
参考にさせていただいたサイト。
■ Google トレンドからのデータの取得方法
■ SimpleXMLでCDATAを取得したいときはLIBXML_NOCDATAを使う
■ テストサイト → google 急上昇ワード取得テスト(1)

google の急上昇ワードは http://www.google.co.jp/trends/hottrends/atom/hourly
xml 形式で格納されている。
確認した範囲で xml ファイルをツリー化して取得する場合に使用出来たのは
simplexml_load_file 関数と new DomDocument クラス?
xml ファイルをダウンロードしてさっそくテスト。
まずは simplexml_load_file 関数。
急上昇ワードが格納されている ol の値を取得しようと試みるも失敗
なぜ(?_?;)
xml ファイルをみてみると CDATA で囲まれている ol 値がツリー化出来てない模様。
色々試して CDATA で囲まれている xml の値はテキストとして取得する事が出来た。
その値を xml としてツリー化するのに使用した関数が simplexml_load_string 関数。
第一引数へ値を渡すとツリー化された値が戻ってくる。
その値を使用して 急上昇ワードを書き出し。
new DomDocument クラス? を使用しても CDATA で囲まれた値はツリーとしての取得が出来なかった。
同じくテキストとして取得。

なお、 CDATA で囲まれてる ol の値をそのまま出力するだけで順位とリンク付きの急上昇ワードが表示できる。

google 急上昇ワードは google 急上昇ワード のページの右上にある
”埋め込む” のボタンから簡単にウィジェットのタグが取得できるようになっていて、
タグを埋め込むだけで簡単にホームページやブログなどに設置できる。


<?php

	function getTrends($text)
	{
		$result="";
		if($text)
		{
			$result.="<ol>\n";
			$ol=simplexml_load_string($text);
			if($ol)
			{
				foreach($ol->li as $list)
				{
					$a=$list->span->a;
					$href=$list->span->a["href"];
					$pop=$list->span["class"];
					$result.="<li><a href=\"".$href."\">".$a."</a><span>[ ".$pop." ]</span></li>\n";
				}
				$result.="</ol>\n";
			}
		}
		return $result;
	}
	$url="http://www.google.co.jp/trends/hottrends/atom/hourly";
	$xml=simplexml_load_file($url);
	if($xml)
	{
		$text=$xml->entry->content;
		$trends=getTrends($text);
		echo($trends);
	}

	/*
	$doc=new DomDocument;
	$doc->load($url);
	if($doc)
	{
		$root=$doc->documentElement;
		if($root->getElementsByTagName("content"))
		{
			$content=$root->getElementsByTagName("content");
			$text=$content->item(0)->textContent;
			$trends=getTrends($text);
			echo($trends);
		}
	}
	*/
?>


PHP を使って twitter トレンドの取得テスト(1)。
参考にさせて頂いたサイト
■ 【CakePHP】TwitterAPIをつかって検索とトレンドを取得しよう!!
■ テストサイト → twitter trends 取得テスト(1)

(/・ω・)/...twitter trends 取得テスト中....●

twitter のトレンドの地域情報は https://api.twitter.com/1/trends/available.json に JSON 形式で格納されている。
PHP の file_get_contents 関数でファイルデータを取得後、
json_decode 関数で連想配列へ値を格納。
地域の一覧を HTML の select 要素を使用してメニューを作成。
メニューの option が変更された場合、該当する地域のトレンドが表示される。

連想配列の woeid 値に地域に割り当てられた数字が格納されてる。
日本に割り当てられた数字は 23424856

ローカルでダウンロードした JSON ファイルから地域の一覧を HTML の select 要素を使用してメニューを作成。
地域一覧の出力に成功。
サーバーにアップロードしてテストしてみると??
日本語で表記されていた地域名が英語で表記されてしまう。。。
検索してみたけど解決方法がわからない。
思いつきで url の後に ?lang=ja を追加してみた。
むおおおっ!うまくいった。
英語表記が日本語になった。

■ search.php


<?php
$url="https://api.twitter.com/1/trends/available.json?lang=ja";
$json=file_get_contents($url);
$decode=json_decode($json,true);
	if($decode)
	{
		$result="<select id=\"targetArea\">\n";
		foreach($decode as $item)
		{
			$target=(intval($item["woeid"])==23424856)? " selected=\"selected\"" : "";
			$result.="<option value=\"".$item["woeid"]."\"".$target.">".$item["name"]."</option>\n";
		}
		$result.="</select>\n";
		echo($result);
	}
?>

■ getTrends.php


<?php
	function getTrends($area)
	{
		$url="https://api.twitter.com/1/trends/".$area.".json";
		$json=file_get_contents($url);
		$decode=json_decode($json,true);
		$result="";
		if($decode)
		{
			$result.="<ol>\n";
			foreach($decode[0]["trends"] as $item)
			{
				$result.="<li><a href=\"".$item["url"]."\" target=\"_top\">".$item["name"]."</a></li>\n";
			}
			$result.="</ol>\n";
		}
		return $result;
	}
	$area=(isset($_POST["area"]))? $_POST["area"] : "23424856";
	echo(getTrends($area));
?>

前回作成した PHP カウンターは、予め用意してある数を描画した画像を読み込んで表示していた。
今回作成した PHP カウンターはサーバー上で画像を生成して表示するように変更。
imagecreate 関数でイメージを作成。
imagecolorallocate 関数で色の作成。
imagestring 関数で文字列の描画。
ImageFilter 関数で文字列のぼかし。
imagepng 関数でファイルへ出力。
imagedestroy 関数で保持している画像メモリの解放。


	function createImage($length,$count,$src)// 桁数, 訪問数, 画像のurl
	{
		$format='%0'.$length.'d';
		$count=sprintf($format,$count);
		$img=imagecreate($length*8,15);// 画像の幅、高さ
		$bg=imagecolorallocate($img,255,255,255);//背景色の設定
		$br=imagecolorallocate($img,100,100,100);//ぼかし色の設定
		$fg=imagecolorallocate($img,0,0,0);//フォントの色の設定
		imagestring($img,4,0,0,$count,$br);
		ImageFilter($img,IMG_FILTER_GAUSSIAN_BLUR);//ぼかし
		imagestring($img,4,-1,-1,$count,$fg);//文字列の描画
		imagepng($img,$src);//画像ファイルの出力
		imagedestroy($img);//メモリ解放
	}
	
	createImage($todaySize,$today,"today.png");//今日のカウントを png 画像へ出力
	createImage($yesterdaySize,$yesterday,"yesterday.png");//昨日のカウントを png 画像へ出力
	createImage($totalSize,$total,"total.png");//トータルカウントを png 画像へ出力
	$result="<span id=\"counter_box\">";
	$result.="today:<img src=\"today.png\" width=\"".($todaySize*8)."\" height=\"15\" alt=\"today\">";
	$result.="  yesterday:<img src=\"yesterday.png\" width=\"".($yesterdaySize*8)."\" height=\"15\" alt=\"yesterday\">";
	$result.="  total:<img src=\"total.png\" width=\"".($totalSize*8)."\" height=\"15\" alt=\"total\">";
	$result.="&nbsp;</span>";
	echo($result);


# スポンサードリンク