<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.3" -->
<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/"
	>

<channel>
	<title>MT312 &#187; php</title>
	<link>http://www.mt312.com</link>
	<description></description>
	<pubDate>Sun, 13 Jul 2008 21:49:58 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.3</generator>
	<language>ja</language>
			<item>
		<title>正規表現メモ</title>
		<link>http://www.mt312.com/php/46/</link>
		<comments>http://www.mt312.com/php/46/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 13:21:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mt312.com/php/46/</guid>
		<description><![CDATA[パターン中のメタ文字を纏めてエスケープする
PHP4.3.3以降では、\Q～\Eで囲むとメタ文字を纏めてエスケープできます。
PLAIN TEXT
PHP:




preg_match&#40;'/^\Q(+*%&#38;)\E$/', '(+*%&#38;)'&#41;; 






部分的にオプションを変更する
(?オプション文字)を使うとオプションの設定と解除が可能です。
PLAIN TEXT
PHP:




// 設定


preg_match&#40;'/abc((?i)def)ghi/', 'abcDEFghi', $matches&#41;;


print_r&#40;$matches&#41;;


// Array ( [0] =&#62; abcDEFghi [1] =&#62; DEF )


&#160;


// 解除


preg_match&#40;'/abc((?-i)def)ghi/i', 'ABCdefGHI', $matches&#41;;


print_r&#40;$matches&#41;;


// Array ( [0] =&#62; ABCdefGHI [1] =&#62; def ) 






部分的にキャプチャを避ける
(?:)を使うとサブパターンがキャプチャされなくなります。
PLAIN TEXT
PHP:




preg_match&#40;'/(?:say) (hello)/', 'say hello', $matches&#41;;


print_r&#40;$matches&#41;;


// Array ( [0] =&#62; say hello [1] =&#62; hello ) 






キャプチャにキーを指定する
(?P&#60;キー名&#62;パターン)でキーを指定できます。
PLAIN TEXT
PHP:




preg_match&#40;'/say (?P&#60;key&#62;hello)/', 'say hello', $matches&#41;;


print_r&#40;$matches&#41;;


// Array ( [0] =&#62; [...]]]></description>
			<content:encoded><![CDATA[<h3>パターン中のメタ文字を纏めてエスケープする</h3>
<p>PHP4.3.3以降では、\Q～\Eで囲むとメタ文字を纏めてエスケープできます。</p>
<div class="igBar"><span id="lphp-8"><a href="#" onclick="javascript:showCodeTxt('php-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-8">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/^<span style="color:#990000;">\Q</span>(+*%&amp;)<span style="color:#990000;">\E</span>$/'</span>, <span style="color:#990000;">'(+*%&amp;)'</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>部分的にオプションを変更する</h3>
<p>(?オプション文字)を使うとオプションの設定と解除が可能です。</p>
<div class="igBar"><span id="lphp-9"><a href="#" onclick="javascript:showCodeTxt('php-9'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-9">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 設定</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/abc((?i)def)ghi/'</span>, <span style="color:#990000;">'abcDEFghi'</span>, <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#0000CC;">print_r</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// Array ( [0] =&gt; abcDEFghi [1] =&gt; DEF )</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 解除</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/abc((?-i)def)ghi/i'</span>, <span style="color:#990000;">'ABCdefGHI'</span>, <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#0000CC;">print_r</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// Array ( [0] =&gt; ABCdefGHI [1] =&gt; def ) </span></div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>部分的にキャプチャを避ける</h3>
<p>(?:)を使うとサブパターンがキャプチャされなくなります。</p>
<div class="igBar"><span id="lphp-10"><a href="#" onclick="javascript:showCodeTxt('php-10'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-10">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/(?:say) (hello)/'</span>, <span style="color:#990000;">'say hello'</span>, <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#0000CC;">print_r</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// Array ( [0] =&gt; say hello [1] =&gt; hello ) </span></div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>キャプチャにキーを指定する</h3>
<p>(?P&lt;キー名&gt;パターン)でキーを指定できます。</p>
<div class="igBar"><span id="lphp-11"><a href="#" onclick="javascript:showCodeTxt('php-11'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-11">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/say (?P&lt;key&gt;hello)/'</span>, <span style="color:#990000;">'say hello'</span>, <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#0000CC;">print_r</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// Array ( [0] =&gt; say hello [key] =&gt; hello [1] =&gt; hello ) </span></div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>先読み言明</h3>
<p>ある文字の直後を限定します。<br />
言明パターンはキャプチャされません。</p>
<div class="igBar"><span id="lphp-12"><a href="#" onclick="javascript:showCodeTxt('php-12'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-12">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 肯定: 直後がbarのfoo</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/foo(?=bar)/'</span>, <span style="color:#990000;">'foobar'</span>, <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#0000CC;">print_r</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// Array ( [0] =&gt; foo )</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 否定: 直後がvaa以外のfoo</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/foo(?!vaa)/'</span>, <span style="color:#990000;">'foobar'</span>, <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#0000CC;">print_r</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// Array ( [0] =&gt; foo ) </span></div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>戻り読み言明</h3>
<p>ある文字の直前を限定します。<br />
言明パターンはキャプチャされません。</p>
<div class="igBar"><span id="lphp-13"><a href="#" onclick="javascript:showCodeTxt('php-13'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-13">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 肯定: 直前がfooのbar</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/(?&lt;=foo)bar/'</span>, <span style="color:#990000;">'foobar'</span>, <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#0000CC;">print_r</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// Array ( [0] =&gt; bar )</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 否定: 直前がhoo以外のbar</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/(?&lt;!hoo)bar/'</span>, <span style="color:#990000;">'foobar'</span>, <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#0000CC;">print_r</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// Array ( [0] =&gt; bar ) </span></div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>繰り返し指定の再試行をキャンセル</h3>
<p>サブパターン中に*、+、{}によって繰り返しが指定されている場合、その続きのマッチングに失敗すると、繰り返し部分の桁が調整され、再度マッチングが行われます。この繰り返しが無駄だと分かっている場合には、再試行無しのサブパターン(?>)を使ってキャンセルできます。<br />
このパターンもキャプチャされません。</p>
<div class="igBar"><span id="lphp-14"><a href="#" onclick="javascript:showCodeTxt('php-14'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-14">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 再試行あり</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/(<span style="color:#990000;">\d</span>+)bar/'</span>, <span style="color:#990000;">'0123456789foo'</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 再試行なし</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/(?&gt;<span style="color:#990000;">\d</span>+)bar/'</span>, <span style="color:#990000;">'0123456789foo'</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>参考文献</h3>
<p><a href="http://jp.php.net/manual/ja/reference.pcre.pattern.syntax.php">PHPパターン構文</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mt312.com/php/46/feed/</wfw:commentRss>
		</item>
		<item>
		<title>携帯端末番号（個体識別番号）判別</title>
		<link>http://www.mt312.com/php/45/</link>
		<comments>http://www.mt312.com/php/45/#comments</comments>
		<pubDate>Fri, 21 Sep 2007 18:06:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mt312.com/php/45/</guid>
		<description><![CDATA[携帯の端末番号の取得方法を紹介します。こういった携帯にまつわる問題は各社仕様がバラバラで面倒です。とにかく簡単に済ませたいもんです。
方法
DoCoMoとSoftBankはユーザーエージェントに番号が含まれますので、これを解析すればすぐにわかります。AUはユーザーエージェントには含まれず$_SERVER['HTTP_X_UP_SUBNO'];に格納されています。この特殊な変数があれば、ほぼ端末番号であると分かる訳ですが、ログとして保存したい場合には個別に保存項目が必要になりやっかいです。そこで前の番号部分を抜いてユーザーエージェントに連結させます。これで大手三社の番号をユーザーエージェントだけで確認できます。
DoCoMo

// MOVA
DoCoMo/1.0/X503i/c10/ser12345678901
serの後に11桁英数字

// FOMA
DoCoMo/2.0 N2001(c10;ser12345678901;
icc12345678901234567890)
serの後に15桁英数字
iccの後に20桁英数字
改行が含まれます。

PLAIN TEXT
PHP:




// ser以降で判別


$agent = $_SERVER&#91;'HTTP_USER_AGENT'&#93;;


$hasSubno = preg_match&#40;'/ser[0-9A-Za-z]{11,15}/', $agent&#41;; 






SoftBank

// Vodafone
Vodafone/1.0/V802SH/SHJ002/SN123456789012345 Browser/UP.Browser/7.0.2.1 Profile/
MIDP-2.0 Configuration/CLDC-1.1 Ext-J-Pr

// SoftBank
SoftBank/1.0/705P/PJP10/SN123456789012345 Browser/Teleca-Browser/3.1 Profile/
MIDP-2.0 Configuration/CLDC-1.1

いずれも/SNの後に15桁英数字

PLAIN TEXT
PHP:




// /SN以降で判別


$agent = $_SERVER&#91;'HTTP_USER_AGENT'&#93;;


$hasSubno = preg_match&#40;'/\/SN[0-9A-Za-z]{15}/', $agent&#41;; 






AU
AUの場合だけ先にユーザーエージェントに番号を付けます。
PLAIN TEXT
PHP:




// 05051234567890_ae.ezweb.ne.jp


// 4桁地域コードと10桁端末コード


$subno = $_SERVER&#91;'HTTP_X_UP_SUBNO'&#93;;


// KDDI-CA23 UP.Browser/5.1 (GUI) MMP/2.0/SUB05051234567890_ae


$_SERVER&#91;'HTTP_USER_AGENT'&#93; .= '/SUB'.substr&#40;$subno, 0, -12&#41;; 






PLAIN TEXT
PHP:




// 連結した末尾で判別


$agent = $_SERVER&#91;'HTTP_USER_AGENT'&#93;;


$hasSubno = preg_match&#40;'/\/SUB0\d0\d\d{10}_[a-z\d]{2}$/', $agent&#41;; 






まとめ
これで端末番号を送信しているかどうかユーザーエージェントだけで判断できるし、特定の端末番号を拒否する事もできます。今回は省略しましたが、以前の携帯判別のコードと合わせれば便利に書けるかもしれません。
ユーザーエージェント携帯判別
注意
これらの環境変数($_SERVER)は信用してはいけません。保存したり、ページへ出力させる場合にはどんな文字が入っていても問題ない様にしましょう。
]]></description>
			<content:encoded><![CDATA[<p>携帯の端末番号の取得方法を紹介します。こういった携帯にまつわる問題は各社仕様がバラバラで面倒です。とにかく簡単に済ませたいもんです。</p>
<h3>方法</h3>
<p>DoCoMoとSoftBankはユーザーエージェントに番号が含まれますので、これを解析すればすぐにわかります。AUはユーザーエージェントには含まれず$_SERVER['HTTP_X_UP_SUBNO'];に格納されています。この特殊な変数があれば、ほぼ端末番号であると分かる訳ですが、ログとして保存したい場合には個別に保存項目が必要になりやっかいです。そこで前の番号部分を抜いてユーザーエージェントに連結させます。これで大手三社の番号をユーザーエージェントだけで確認できます。</p>
<h3>DoCoMo</h3>
<pre>
// MOVA
DoCoMo/1.0/X503i/c10/ser12345678901
serの後に11桁英数字

// FOMA
DoCoMo/2.0 N2001(c10;ser12345678901;
icc12345678901234567890)
serの後に15桁英数字
iccの後に20桁英数字
改行が含まれます。
</pre>
<div class="igBar"><span id="lphp-19"><a href="#" onclick="javascript:showCodeTxt('php-19'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-19">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// ser以降で判別</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$agent</span> = <span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_USER_AGENT'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$hasSubno</span> = <a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/ser[0-9A-Za-z]{11,15}/'</span>, <span style="color:#0000CC;">$agent</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>SoftBank</h3>
<pre>
// Vodafone
Vodafone/1.0/V802SH/SHJ002/SN123456789012345 Browser/UP.Browser/7.0.2.1 Profile/
MIDP-2.0 Configuration/CLDC-1.1 Ext-J-Pr

// SoftBank
SoftBank/1.0/705P/PJP10/SN123456789012345 Browser/Teleca-Browser/3.1 Profile/
MIDP-2.0 Configuration/CLDC-1.1

いずれも/SNの後に15桁英数字
</pre>
<div class="igBar"><span id="lphp-20"><a href="#" onclick="javascript:showCodeTxt('php-20'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-20">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// /SN以降で判別</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$agent</span> = <span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_USER_AGENT'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$hasSubno</span> = <a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/<span style="color:#990000;">\/</span>SN[0-9A-Za-z]{15}/'</span>, <span style="color:#0000CC;">$agent</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>AU</h3>
<p>AUの場合だけ先にユーザーエージェントに番号を付けます。</p>
<div class="igBar"><span id="lphp-21"><a href="#" onclick="javascript:showCodeTxt('php-21'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-21">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 05051234567890_ae.ezweb.ne.jp</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 4桁地域コードと10桁端末コード</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$subno</span> = <span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_X_UP_SUBNO'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// KDDI-CA23 UP.Browser/5.1 (GUI) MMP/2.0/SUB05051234567890_ae</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_USER_AGENT'</span><span style="color:#006600;">&#93;</span> .= <span style="color:#990000;">'/SUB'</span>.<a href="http://www.php.net/substr"><span style="color:#0000CC;">substr</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$subno</span>, <span style="color:#CC66CC;color:#800000;">0</span>, -<span style="color:#CC66CC;color:#800000;">12</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<div class="igBar"><span id="lphp-22"><a href="#" onclick="javascript:showCodeTxt('php-22'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-22">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 連結した末尾で判別</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$agent</span> = <span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_USER_AGENT'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$hasSubno</span> = <a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/<span style="color:#990000;">\/</span>SUB0<span style="color:#990000;">\d</span>0<span style="color:#990000;">\d</span><span style="color:#990000;">\d</span>{10}_[a-z<span style="color:#990000;">\d</span>]{2}$/'</span>, <span style="color:#0000CC;">$agent</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>まとめ</h3>
<p>これで端末番号を送信しているかどうかユーザーエージェントだけで判断できるし、特定の端末番号を拒否する事もできます。今回は省略しましたが、以前の携帯判別のコードと合わせれば便利に書けるかもしれません。<br />
<a href="http://www.mt312.com/php/33/">ユーザーエージェント携帯判別</a></p>
<h3>注意</h3>
<p>これらの環境変数($_SERVER)は信用してはいけません。保存したり、ページへ出力させる場合にはどんな文字が入っていても問題ない様にしましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mt312.com/php/45/feed/</wfw:commentRss>
		</item>
		<item>
		<title>$fpが権限を握るflockによるファイルロック</title>
		<link>http://www.mt312.com/php/44/</link>
		<comments>http://www.mt312.com/php/44/#comments</comments>
		<pubDate>Wed, 19 Sep 2007 19:15:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mt312.com/php/44/</guid>
		<description><![CDATA[果たして、この記事が役に立つか疑問ですが、私の様にポカをする人がいないとも限りませんし、忘備録的に書いてみます。
先日カウンターのログが頻繁に壊れると指摘があり、原因が分からず2日程考えていた時、ふと疑問が。テストしてみると、全くロックできていない。実はこう書いていました。
PLAIN TEXT
PHP:




function lock&#40;&#41; &#123;


&#160; $fp = fopen&#40;'./lock', 'w'&#41;;


&#160; return $fp &#38;&#38; flock&#40;$fp, LOCK_EX&#41;;


&#125;


if&#40;!lock&#40;&#41;&#41; &#123;


&#160; // ロック失敗で終了


&#125;


// ログ保存


$fp = fopen&#40;LOG_FILE, 'wb'&#41;;


fwrite&#40;$fp, $lines&#41;;


fclose&#40;$fp&#41;; 






自分では正しいと思っていたんですけど、実はlock()はtrueしか返さず、後にロックが外れます。どうなっているかと言うと、lcok()と同時にロックされ真が返りますが、$fpがローカル変数で既に用済みな為、ロックが外れてしまうのです。flockによるファイルロックは$fpが生きている必要があります。つまり、以下でもロックが外れます。
PLAIN TEXT
PHP:




$fp = fopen&#40;'./lock', 'w'&#41;;


flock&#40;$fp, LOCK_EX&#41;;


unset&#40;$fp&#41;; 






よって、こう書いて解決。
関数にしなきゃいいだけの話。
PLAIN TEXT
PHP:




// ファイル生成可能で空にするコストがないaを指定


$l_fp = fopen&#40;'./lock', 'a+'&#41;;


$locked = $l_fp &#38;&#38; flock&#40;$l_fp, LOCK_EX&#41;;


if&#40;!$locked&#41; &#123;


&#160; // ロック失敗で終了


&#125;


// ログ保存


$fp = fopen&#40;LOG_FILE, 'wb'&#41;;


fwrite&#40;$fp, $lines&#41;;


fclose&#40;$fp&#41;; 






上の例と違い、ログファイルを追記モードで扱う場合はロックファイルを用意する必要はありません。また、追記モードで書込モードの様に空にしてから書き込む事もできます。
PLAIN TEXT
PHP:




// ファイルがなければ生成


$fp = fopen&#40;LOG_FILE, 'a+b'&#41;;


// ロックしてファイルを空にする


$prepared = $fp [...]]]></description>
			<content:encoded><![CDATA[<p>果たして、この記事が役に立つか疑問ですが、私の様にポカをする人がいないとも限りませんし、忘備録的に書いてみます。</p>
<p>先日カウンターのログが頻繁に壊れると指摘があり、原因が分からず2日程考えていた時、ふと疑問が。テストしてみると、全くロックできていない。実はこう書いていました。</p>
<div class="igBar"><span id="lphp-27"><a href="#" onclick="javascript:showCodeTxt('php-27'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-27">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">function</span> lock<span style="color:#006600;">&#40;</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#0000CC;">$fp</span> = <a href="http://www.php.net/fopen"><span style="color:#0000CC;">fopen</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'./lock'</span>, <span style="color:#990000;">'w'</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#008000;">return</span> <span style="color:#0000CC;">$fp</span> &amp;&amp; <a href="http://www.php.net/flock"><span style="color:#0000CC;">flock</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span>, LOCK_EX<span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span>!lock<span style="color:#006600;">&#40;</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#F27900;">// ロック失敗で終了</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// ログ保存</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$fp</span> = <a href="http://www.php.net/fopen"><span style="color:#0000CC;">fopen</span></a><span style="color:#006600;">&#40;</span>LOG_FILE, <span style="color:#990000;">'wb'</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/fwrite"><span style="color:#0000CC;">fwrite</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span>, <span style="color:#0000CC;">$lines</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/fclose"><span style="color:#0000CC;">fclose</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
自分では正しいと思っていたんですけど、実はlock()はtrueしか返さず、後にロックが外れます。どうなっているかと言うと、lcok()と同時にロックされ真が返りますが、$fpがローカル変数で既に用済みな為、ロックが外れてしまうのです。flockによるファイルロックは$fpが生きている必要があります。つまり、以下でもロックが外れます。</p>
<div class="igBar"><span id="lphp-28"><a href="#" onclick="javascript:showCodeTxt('php-28'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-28">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$fp</span> = <a href="http://www.php.net/fopen"><span style="color:#0000CC;">fopen</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'./lock'</span>, <span style="color:#990000;">'w'</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/flock"><span style="color:#0000CC;">flock</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span>, LOCK_EX<span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/unset"><span style="color:#0000CC;">unset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
よって、こう書いて解決。<br />
関数にしなきゃいいだけの話。</p>
<div class="igBar"><span id="lphp-29"><a href="#" onclick="javascript:showCodeTxt('php-29'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-29">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// ファイル生成可能で空にするコストがないaを指定</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$l_fp</span> = <a href="http://www.php.net/fopen"><span style="color:#0000CC;">fopen</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'./lock'</span>, <span style="color:#990000;">'a+'</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$locked</span> = <span style="color:#0000CC;">$l_fp</span> &amp;&amp; <a href="http://www.php.net/flock"><span style="color:#0000CC;">flock</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$l_fp</span>, LOCK_EX<span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span>!<span style="color:#0000CC;">$locked</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#F27900;">// ロック失敗で終了</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// ログ保存</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$fp</span> = <a href="http://www.php.net/fopen"><span style="color:#0000CC;">fopen</span></a><span style="color:#006600;">&#40;</span>LOG_FILE, <span style="color:#990000;">'wb'</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/fwrite"><span style="color:#0000CC;">fwrite</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span>, <span style="color:#0000CC;">$lines</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/fclose"><span style="color:#0000CC;">fclose</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
上の例と違い、ログファイルを追記モードで扱う場合はロックファイルを用意する必要はありません。また、追記モードで書込モードの様に空にしてから書き込む事もできます。</p>
<div class="igBar"><span id="lphp-30"><a href="#" onclick="javascript:showCodeTxt('php-30'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-30">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// ファイルがなければ生成</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$fp</span> = <a href="http://www.php.net/fopen"><span style="color:#0000CC;">fopen</span></a><span style="color:#006600;">&#40;</span>LOG_FILE, <span style="color:#990000;">'a+b'</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// ロックしてファイルを空にする</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$prepared</span> = <span style="color:#0000CC;">$fp</span> &amp;&amp; <a href="http://www.php.net/flock"><span style="color:#0000CC;">flock</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span>, LOCK_EX<span style="color:#006600;">&#41;</span> &amp;&amp; <a href="http://www.php.net/ftruncate"><span style="color:#0000CC;">ftruncate</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span>, <span style="color:#CC66CC;color:#800000;">0</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span>!<span style="color:#0000CC;">$prepared</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#F27900;">// 準備失敗で終了</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/fwrite"><span style="color:#0000CC;">fwrite</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span>, <span style="color:#0000CC;">$lines</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/fclose"><span style="color:#0000CC;">fclose</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$fp</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
この場合、fclose($fp);する前にflock($fp, LOCK_UN);でロックを解除すると閉じる前に他の書き込みが割り込む可能性があり、好ましくありません。ロックはfclose()で解除されますし、fclose()は記述がなければスクリプト終了時にコールされます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mt312.com/php/44/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DoCoMo絵文字データ保存方法</title>
		<link>http://www.mt312.com/php/43/</link>
		<comments>http://www.mt312.com/php/43/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 04:00:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mt312.com/php/43/</guid>
		<description><![CDATA[携帯から入力された絵文字の判定を簡単に行う方法があるようです。mb_substitute_character();を使って存在しない文字コードを炙り出します。
携帯端末からの投稿を保存
PLAIN TEXT
PHP:




// 出力文字エンコーディングに文字コードが存在しない場合の代替文字を指定


mb_substitute_character&#40;'long'&#41;;


&#160;


// 太陽絵文字入り文字列


$str = '今日も暑いですね・';


// 強制的に絵文字部分がBAD+16進コードに変換される


$str = mb_convert_encoding&#40;$str, mb_internal_encoding&#40;&#41;&#41;;


// 絵文字を[d:絵文字コード]に変換して保存


$str = preg_replace&#40;'/BAD\+(F[89][0-F]{2})/', '[d:$1]', $str&#41;; 






こうしておけば[d:～]を探して変換すれば、PCには絵文字画像、携帯には直接絵文字を表示させる事ができる。記事の修正が必要になっても絵文字を意識しなくて済みます。
保存ログを携帯端末へ出力
PLAIN TEXT
PHP:




$str = '今日も暑いですね[d:F8A0]';


$str = preg_replace&#40;'/\[d:(F[89][0-F]{2})\]/e', "pack('H*', $1)", $str&#41;;


print $str; 






まとめ
BAD+からF3、F4、F6、F7で始まる文字列を調査すれはAU絵文字も判別可能らしい。めちゃくちゃ楽だな、これ。
参考文献
絵文字の抽出をPHPで最も簡単にする方法 ぎじゅっやさん
]]></description>
			<content:encoded><![CDATA[<p>携帯から入力された絵文字の判定を簡単に行う方法があるようです。mb_substitute_character();を使って存在しない文字コードを炙り出します。</p>
<h3>携帯端末からの投稿を保存</h3>
<div class="igBar"><span id="lphp-33"><a href="#" onclick="javascript:showCodeTxt('php-33'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-33">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 出力文字エンコーディングに文字コードが存在しない場合の代替文字を指定</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/mb_substitute_character"><span style="color:#0000CC;">mb_substitute_character</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'long'</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 太陽絵文字入り文字列</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$str</span> = <span style="color:#990000;">'今日も暑いですね・'</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 強制的に絵文字部分がBAD+16進コードに変換される</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$str</span> = <a href="http://www.php.net/mb_convert_encoding"><span style="color:#0000CC;">mb_convert_encoding</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$str</span>, <a href="http://www.php.net/mb_internal_encoding"><span style="color:#0000CC;">mb_internal_encoding</span></a><span style="color:#006600;">&#40;</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 絵文字を[d:絵文字コード]に変換して保存</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$str</span> = <a href="http://www.php.net/preg_replace"><span style="color:#0000CC;">preg_replace</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/BAD<span style="color:#990000;">\+</span>(F[89][0-F]{2})/'</span>, <span style="color:#990000;">'[d:$1]'</span>, <span style="color:#0000CC;">$str</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>こうしておけば[d:～]を探して変換すれば、PCには絵文字画像、携帯には直接絵文字を表示させる事ができる。記事の修正が必要になっても絵文字を意識しなくて済みます。</p>
<h3>保存ログを携帯端末へ出力</h3>
<div class="igBar"><span id="lphp-34"><a href="#" onclick="javascript:showCodeTxt('php-34'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-34">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$str</span> = <span style="color:#990000;">'今日も暑いですね[d:F8A0]'</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$str</span> = <a href="http://www.php.net/preg_replace"><span style="color:#0000CC;">preg_replace</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/<span style="color:#990000;">\[</span>d:(F[89][0-F]{2})<span style="color:#990000;">\]</span>/e'</span>, <span style="color:#990000;">"pack('H*', $1)"</span>, <span style="color:#0000CC;">$str</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#0000CC;">$str</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>まとめ</h3>
<p>BAD+からF3、F4、F6、F7で始まる文字列を調査すれはAU絵文字も判別可能らしい。めちゃくちゃ楽だな、これ。</p>
<h3>参考文献</h3>
<p><a href="http://hain.jp/index.php/tech-j/2006/09/11/%E6%90%BA%E5%B8%AF%E7%B5%B5%E6%96%87%E5%AD%97">絵文字の抽出をPHPで最も簡単にする方法 ぎじゅっやさん</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mt312.com/php/43/feed/</wfw:commentRss>
		</item>
		<item>
		<title>携帯特有の注意点</title>
		<link>http://www.mt312.com/php/42/</link>
		<comments>http://www.mt312.com/php/42/#comments</comments>
		<pubDate>Tue, 15 May 2007 08:28:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mt312.com/php/42/</guid>
		<description><![CDATA[ホスト名
携帯はホスト名が頻繁に変わってしまいます。
またホスト名の後半でキャリア判別すると失敗する場合があり、信用できません。正確に携帯判別するには各社サイトに掲載されているIPリストと照合する必要があります。
Content-Lengthを付ける
DoCoMoはContent-Lengthがないと表示できない場合があります。
「接続先のサーバーは現在ご利用できません」
リダイレクトは避ける
正しく処理されなかったり、エラーになる機種があります。
「無効なデータを受信しました」
POST後の二重投稿防止ボタン
PLAIN TEXT
HTML:




&#60;form action="./index.php" method="post"&#62;


&#160; &#60;p&#62;投稿完了しました&#60;/p&#62;


&#160; &#60;p&#62;&#60;input type="submit" value="戻る" /&#62;&#60;/p&#62;


&#60;/form&#62; 






POST後にこれを踏むと二重投稿を防ぐ事ができます。
GETでは駄目。
&#60;input&#62;フィールド内で改行を入力
PCブラウザでは改行できなくても携帯ではできてしまいます。
&#60;textarea&#62;フィールド内の改行コード
&#60;textarea&#62;フィールドに文章を出力する場合は改行コードをCRLFにする。
LFでは改行されません。
istyle属性
istyle="1" 全角かな
istyle="2" 半角カナ
istyle="3" 半角英字
istyle="4" 半角数字
パスワード入力欄&#60;input　type=&#34;password&#34;&#62;はDoCoMoはistyleが無視されて半角数字モードになりますが、AUでは付けていないと全角モードになるのでここにもistyleを付けておく。最近のSoftBank携帯はistyleに対応しているようです。
まとめ
携帯の機能はよりPCに近づいています。
この記事も、すぐに当てにならなくなるかもしれませんので、参考程度に。
]]></description>
			<content:encoded><![CDATA[<h3>ホスト名</h3>
<p>携帯はホスト名が頻繁に変わってしまいます。<br />
またホスト名の後半でキャリア判別すると失敗する場合があり、信用できません。正確に携帯判別するには各社サイトに掲載されているIPリストと照合する必要があります。</p>
<h3>Content-Lengthを付ける</h3>
<p>DoCoMoはContent-Lengthがないと表示できない場合があります。<br />
「接続先のサーバーは現在ご利用できません」</p>
<h3>リダイレクトは避ける</h3>
<p>正しく処理されなかったり、エラーになる機種があります。<br />
「無効なデータを受信しました」</p>
<h3>POST後の二重投稿防止ボタン</h3>
<div class="igBar"><span id="lhtml-36"><a href="#" onclick="javascript:showCodeTxt('html-36'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">HTML:</span>
<div id="html-36">
<div class="html">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><a href="http://december.com/html/4/element/form.html"><span style="color: #000000;">&lt;form</span></a> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">"./index.php"</span> <span style="color: #000066;">method</span>=<span style="color: #ff0000;">"post"</span><span style="color: #000000;">&gt;</span></a></span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/p.html"><span style="color: #000000;">&lt;p&gt;</span></a></span>投稿完了しました<span style="color: #009900;"><span style="color: #000000;">&lt;/p&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #009900;"><a href="http://december.com/html/4/element/p.html"><span style="color: #000000;">&lt;p&gt;</span></a></span><span style="color: #009900;"><a href="http://december.com/html/4/element/input.html"><span style="color: #000000;">&lt;input</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"submit"</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"戻る"</span> /<span style="color: #000000;">&gt;</span></a></span><span style="color: #009900;"><span style="color: #000000;">&lt;/p&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="color: #000000;">&lt;/form&gt;</span></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
POST後にこれを踏むと二重投稿を防ぐ事ができます。<br />
GETでは駄目。</p>
<h3>&lt;input&gt;フィールド内で改行を入力</h3>
<p>PCブラウザでは改行できなくても携帯ではできてしまいます。</p>
<h3>&lt;textarea&gt;フィールド内の改行コード</h3>
<p>&lt;textarea&gt;フィールドに文章を出力する場合は改行コードをCRLFにする。<br />
LFでは改行されません。</p>
<h3>istyle属性</h3>
<p>istyle="1" 全角かな<br />
istyle="2" 半角カナ<br />
istyle="3" 半角英字<br />
istyle="4" 半角数字</p>
<p>パスワード入力欄&lt;input　type=&quot;password&quot;&gt;はDoCoMoはistyleが無視されて半角数字モードになりますが、AUでは付けていないと全角モードになるのでここにもistyleを付けておく。最近のSoftBank携帯はistyleに対応しているようです。</p>
<h3>まとめ</h3>
<p>携帯の機能はよりPCに近づいています。<br />
この記事も、すぐに当てにならなくなるかもしれませんので、参考程度に。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mt312.com/php/42/feed/</wfw:commentRss>
		</item>
		<item>
		<title>処理速度最適化法</title>
		<link>http://www.mt312.com/php/41/</link>
		<comments>http://www.mt312.com/php/41/#comments</comments>
		<pubDate>Thu, 10 May 2007 11:50:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mt312.com/php/41/</guid>
		<description><![CDATA[いろいろ纏めようと思っていたんですが、すでに分かりやすいサイトが沢山あります。
PHP最適化tipsまとめサイト
基礎構文処理速度のあれこれ
require VS require_once
実際に計測してみた所、試行回数が少なかったせいか、あまり差は見られませんでした。
（未読ファイルの読み込みに関して）
一度しか読まないのが分かっていればrequire_onceを使うメリットはないと思います。
速度は気にせず以下で使い分ければOK。
複数回読まれる可能性があるが、一度しか読む必要がない。require_once
それ以外。require
== VS ===
型を含めて比較する後者の方が若干速い。
パスワードなど外部データと比較する場合にセキュリティーホールとなる可能性があるので、理由がない限り===を常用する。
is_hoge() VS ===
PLAIN TEXT
PHP:




if&#40;is_null&#40;$var&#41;&#41; &#123;&#125;


if&#40;$var===null&#41; &#123;&#125; 






後者が速い。
count($array)>0 VS (bool)$array
配列に要素があるかどうかの判別。
後者が速い。
array_merge() VS +演算子
array_mergeは連結後に数字キーを振り直すので、連想配列の場合は+演算子を使った方が速い。
PLAIN TEXT
PHP:




$a = array&#40;'a'=&#62;1, 'b'=&#62;2&#41;;


$b = array&#40;'a'=&#62;3, 'c'=&#62;4&#41;;


&#160;


// array_merge($a, $b) == $b + $a; 






バージョン分岐
PHPのメジャーバージョンで分岐したい場合はversion_compare()を使うより各バージョン特有の定数を調べるのが良い。
PLAIN TEXT
PHP:




// PHP_VERSIONの一文字目を調べるより速い


$isPHP5 = defined&#40;'E_STRICT'&#41;; 






is_file() VS file_exists()
file_exists()はディレクトリも含まれるので、ファイルの有無を調べたいだけならis_file()の方が高速。
文字列連結速度
PLAIN TEXT
PHP:




$str = $str1.$str2;


$str = "$str1$str2";


$str = "{$str1}{$str2}"; 






上から順に高速。 
splitは使うな
文字列を分割して配列を作成する場合、splitは遅いので避ける。
正規表現分割は、 preg_split (PHP 3.0.9, 4, 5)
固定文字分割は、 explode (PHP 3, 4, 5)
分割して一部分だけ取得したい場合は、分割数を制限する3番目のlimit引数を付けておきます。 [...]]]></description>
			<content:encoded><![CDATA[<p>いろいろ纏めようと思っていたんですが、すでに分かりやすいサイトが沢山あります。</p>
<p><a href="http://labs.unoh.net/2007/05/phptips.html">PHP最適化tipsまとめサイト</a><br />
<a href="http://www.phppro.jp/phptips/archives/vol15/#3">基礎構文処理速度のあれこれ</a></p>
<h3>require VS require_once</h3>
<p>実際に計測してみた所、試行回数が少なかったせいか、あまり差は見られませんでした。<br />
（未読ファイルの読み込みに関して）<br />
一度しか読まないのが分かっていればrequire_onceを使うメリットはないと思います。<br />
速度は気にせず以下で使い分ければOK。</p>
<p>複数回読まれる可能性があるが、一度しか読む必要がない。require_once<br />
それ以外。require</p>
<h3>== VS ===</h3>
<p>型を含めて比較する後者の方が若干速い。<br />
パスワードなど外部データと比較する場合にセキュリティーホールとなる可能性があるので、理由がない限り===を常用する。</p>
<h3>is_hoge() VS ===</h3>
<div class="igBar"><span id="lphp-45"><a href="#" onclick="javascript:showCodeTxt('php-45'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-45">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span><a href="http://www.php.net/is_null"><span style="color:#0000CC;">is_null</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$var</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span><span style="color:#006600;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$var</span>===<span style="color:#008000;">null</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
後者が速い。</p>
<h3>count($array)>0 VS (bool)$array</h3>
<p>配列に要素があるかどうかの判別。<br />
後者が速い。</p>
<h3>array_merge() VS +演算子</h3>
<p>array_mergeは連結後に数字キーを振り直すので、連想配列の場合は+演算子を使った方が速い。</p>
<div class="igBar"><span id="lphp-46"><a href="#" onclick="javascript:showCodeTxt('php-46'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-46">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$a</span> = <a href="http://www.php.net/array"><span style="color:#0000CC;">array</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'a'</span>=&gt;<span style="color:#CC66CC;color:#800000;">1</span>, <span style="color:#990000;">'b'</span>=&gt;<span style="color:#CC66CC;color:#800000;">2</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$b</span> = <a href="http://www.php.net/array"><span style="color:#0000CC;">array</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'a'</span>=&gt;<span style="color:#CC66CC;color:#800000;">3</span>, <span style="color:#990000;">'c'</span>=&gt;<span style="color:#CC66CC;color:#800000;">4</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// array_merge($a, $b) == $b + $a; </span></div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>バージョン分岐</h3>
<p>PHPのメジャーバージョンで分岐したい場合はversion_compare()を使うより各バージョン特有の定数を調べるのが良い。</p>
<div class="igBar"><span id="lphp-47"><a href="#" onclick="javascript:showCodeTxt('php-47'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-47">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// PHP_VERSIONの一文字目を調べるより速い</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$isPHP5</span> = <a href="http://www.php.net/defined"><span style="color:#0000CC;">defined</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'E_STRICT'</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>is_file() VS file_exists()</h3>
<p>file_exists()はディレクトリも含まれるので、ファイルの有無を調べたいだけならis_file()の方が高速。</p>
<h3>文字列連結速度</h3>
<div class="igBar"><span id="lphp-48"><a href="#" onclick="javascript:showCodeTxt('php-48'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-48">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$str</span> = <span style="color:#0000CC;">$str1</span>.<span style="color:#0000CC;">$str2</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$str</span> = <span style="color:#990000;">"$str1$str2"</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$str</span> = <span style="color:#990000;">"{$str1}{$str2}"</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
上から順に高速。 </p>
<h3>splitは使うな</h3>
<p>文字列を分割して配列を作成する場合、splitは遅いので避ける。<br />
正規表現分割は、 preg_split (PHP 3.0.9, 4, 5)<br />
固定文字分割は、 explode (PHP 3, 4, 5)<br />
分割して一部分だけ取得したい場合は、分割数を制限する3番目のlimit引数を付けておきます。 特にループ内で繰り返し使う場合、全分割するより時間を短縮できます。 </p>
<div class="igBar"><span id="lphp-49"><a href="#" onclick="javascript:showCodeTxt('php-49'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-49">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$str</span> = <span style="color:#990000;">'id,date,name,msg,pwd'</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// limit引数：必要なデータ数 + 1</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$arr</span> = <a href="http://www.php.net/explode"><span style="color:#0000CC;">explode</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">','</span>, <span style="color:#0000CC;">$str</span>, <span style="color:#CC66CC;color:#800000;">3</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/print_r"><span style="color:#0000CC;">print_r</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$arr</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 出力結果 Array ([0] =&gt; 'id' [1] =&gt; 'date' [2] =&gt; 'name,msg,pwd') </span></div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>time()を何度も呼ばない</h3>
<p>何度も使う場合は定数にするなりして使い回す。（2回だけなら定数化しない方が速いかもしれないが。）PHP5では$_SERVER['REQUEST_TIME'];でも可能。</p>
<div class="igBar"><span id="lphp-50"><a href="#" onclick="javascript:showCodeTxt('php-50'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-50">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/define"><span style="color:#0000CC;">define</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'REQUEST_TIME'</span>, <a href="http://www.php.net/time"><span style="color:#0000CC;">time</span></a><span style="color:#006600;">&#40;</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>in_array()よりisset()</h3>
<p>調べたい要素が複数ある、又は複数回調べたい、それが空文字以外の文字や整数（つまりキーになりうる）で重複していない（整数1と文字'1'は重複）事が確かならarray_flip()で反転させてキーで調べると速い。</p>
<div class="igBar"><span id="lphp-51"><a href="#" onclick="javascript:showCodeTxt('php-51'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-51">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 0と5はある？</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$nums</span> = <a href="http://www.php.net/array"><span style="color:#0000CC;">array</span></a><span style="color:#006600;">&#40;</span><span style="color:#CC66CC;color:#800000;">5</span>, <span style="color:#CC66CC;color:#800000;">4</span>, <span style="color:#CC66CC;color:#800000;">3</span>, <span style="color:#CC66CC;color:#800000;">1</span>, <span style="color:#CC66CC;color:#800000;">2</span>, <span style="color:#CC66CC;color:#800000;">0</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$nums</span> = array_filp<span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$nums</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span><a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$nums</span><span style="color:#006600;">&#91;</span><span style="color:#CC66CC;color:#800000;">0</span><span style="color:#006600;">&#93;</span>, <span style="color:#0000CC;">$num</span><span style="color:#006600;">&#91;</span><span style="color:#CC66CC;color:#800000;">5</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#990000;">'あった！'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>array_key_exists()よりisset()</h3>
<p>配列の要素がnullの場合両者の挙動が異なります。<br />
それでも影響がない場面ではisset()を使った方が速い。</p>
<h3>大文字小文字変換</h3>
<p>大文字変換 strtoupper();<br />
小文字変換 strtolower();<br />
速度は変換数に比例して遅くなる。</p>
<div class="igBar"><span id="lphp-52"><a href="#" onclick="javascript:showCodeTxt('php-52'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-52">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$s</span> = <span style="color:#990000;">'aaaaaAaaaaAaaaaaa'</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 大文字が少ない分strtolower($s);よりstrtoupper($s);の方が時間がかかる。 </span></div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>まとめ</h3>
<p>関数を使わずに済むならその方が高速。<br />
正規表現を使わずに済むならその方が高速。<br />
その他、同様の役割でも何かしらの判断基準が設けられている場合は、そちらの方が遅くなる傾向にあります。</p>
<p>また、計算式では誤差が生じたり可読性が落ちるのでキャストは使わずにintvalなどの変換関数を用いる。状況に応じて速度と手間と可読性のどれを重視するか判断しましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mt312.com/php/41/feed/</wfw:commentRss>
		</item>
		<item>
		<title>コメントスパム対策法</title>
		<link>http://www.mt312.com/php/40/</link>
		<comments>http://www.mt312.com/php/40/#comments</comments>
		<pubDate>Thu, 10 May 2007 11:42:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mt312.com/php/40/</guid>
		<description><![CDATA[近年スパム被害が増えています。
誰でも投稿できるブログや掲示板も狙われています。
ここでは手間のかからない、簡単な対処法をいくつか紹介します。

主な対処法

禁止ワードを設定
日本語が使えない環境からの投稿を拒否
半角英数字のみの投稿を拒否
投稿できるURLの数を制限
プロキシサーバ経由の投稿を拒否
リファラーを参照してフォームを経由したか判断
フォームを表示してから投稿するまでの許容時間を設定する
ダミー項目を作り入力があった場合に拒否
フォームを解析されない様に、ロボットを排除
データ送信先を頻繁に変更
Captcha画像認証



検索ロボットを排除
PLAIN TEXT
HTML:




&#60;meta name="robots" content="none,noindex,nofollow,noarchive" /&#62;


&#60;meta name="googlebot" content="noindex,nofollow,noarchive,nosnippet" /&#62;


&#60;meta name="libwww-perl" content="none,noindex,nofollow" /&#62; 






ロボットを完全に排除するのは難しい様ですが、少しは効果があると思います。googlebotのsnippetは検索結果に表示される該当ページからの抜粋です。これがある方がクリック率が高まるそうです。これを削除(nosnippet)するとキャッシュも削除されます。
Googleページ削除
リファラーからフォームを経由したか調べる
PLAIN TEXT
PHP:




$from = $_SERVER&#91;'HTTP_REFERER'&#93;;


$host = $_SERVER&#91;'HTTP_HOST'&#93;;


if&#40;!stristr&#40;$from, $host&#41;&#41; &#123;


&#160; print '不正なリファラーです。';


&#125; 






リファラーを持たない環境は結構あります。ノートン等のセキュリティソフトによって隠蔽されている可能性もあります。ドコモなど一部携帯でアウト。
逆引き不可能なIPアドレスを拒否
PLAIN TEXT
PHP:




$ip = $_SERVER&#91;'REMOTE_ADDR'&#93;;


$host = getHostByAddr&#40;$ip&#41;;


if&#40;$ip==$host&#41; &#123;


&#160; print '逆引き不可能なIPアドレスです。';


&#125;


&#160;


// これでも可能


if&#40;!preg_match&#40;'/[a-z]/', $host&#41;&#41; &#123;


&#160; print '逆引き不可能なIPアドレスです。';


&#125; 






プロキシ経由を拒否
プロキシ特有の環境変数とホスト名を調べる方法です。
環境変数を吐かない匿名プロキシもあって、すべてを検出できる訳ではありません。
他にはプロキシリストを作成したり、ポートスキャンする方法もあります。
PLAIN TEXT
PHP:




$systems = $_SERVER + $_ENV;


&#160;


$ip = $systems&#91;'REMOTE_ADDR'&#93;;


$host = getHostByAddr&#40;$ip&#41;;


// ドコモの携帯はproxyが存在するので注意


// anonym=anonymous,anonymizer


// prox=proxy,proxify


$proxhost = preg_match&#40;


'/anonym&#124;cache&#124;delegate&#124;firewall&#124;gateway&#124;httpd&#124;keeper&#124;prox&#124;squid&#124;via&#124;www/',


$host&#41;;


&#160;


$bools = array&#40;


&#160; isset&#40;$systems&#91;'HTTP_CLIENT_IP'&#93;&#41;,


&#160; isset&#40;$systems&#91;'HTTP_FORWARDED'&#93;&#41;,


&#160; isset&#40;$systems&#91;'HTTP_MAX_FORWARS'&#93;&#41;,


&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>近年スパム被害が増えています。<br />
誰でも投稿できるブログや掲示板も狙われています。<br />
ここでは手間のかからない、簡単な対処法をいくつか紹介します。</p>
<ul>
<li>主な対処法
<ul>
<li>禁止ワードを設定</li>
<li>日本語が使えない環境からの投稿を拒否</li>
<li>半角英数字のみの投稿を拒否</li>
<li>投稿できるURLの数を制限</li>
<li>プロキシサーバ経由の投稿を拒否</li>
<li>リファラーを参照してフォームを経由したか判断</li>
<li>フォームを表示してから投稿するまでの許容時間を設定する</li>
<li>ダミー項目を作り入力があった場合に拒否</li>
<li>フォームを解析されない様に、ロボットを排除</li>
<li>データ送信先を頻繁に変更</li>
<li>Captcha画像認証</li>
</ul>
</li>
</ul>
<h3>検索ロボットを排除</h3>
<div class="igBar"><span id="lhtml-62"><a href="#" onclick="javascript:showCodeTxt('html-62'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">HTML:</span>
<div id="html-62">
<div class="html">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><a href="http://december.com/html/4/element/meta.html"><span style="color: #000000;">&lt;meta</span></a> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"robots"</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">"none,noindex,nofollow,noarchive"</span> /<span style="color: #000000;">&gt;</span></a></span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><a href="http://december.com/html/4/element/meta.html"><span style="color: #000000;">&lt;meta</span></a> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"googlebot"</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">"noindex,nofollow,noarchive,nosnippet"</span> /<span style="color: #000000;">&gt;</span></a></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><a href="http://december.com/html/4/element/meta.html"><span style="color: #000000;">&lt;meta</span></a> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"libwww-perl"</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">"none,noindex,nofollow"</span> /<span style="color: #000000;">&gt;</span></a></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
ロボットを完全に排除するのは難しい様ですが、少しは効果があると思います。googlebotのsnippetは検索結果に表示される該当ページからの抜粋です。これがある方がクリック率が高まるそうです。これを削除(nosnippet)するとキャッシュも削除されます。</p>
<p><a href="http://www.google.co.jp/intl/ja/remove.html">Googleページ削除</a></p>
<h3>リファラーからフォームを経由したか調べる</h3>
<div class="igBar"><span id="lphp-63"><a href="#" onclick="javascript:showCodeTxt('php-63'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-63">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$from</span> = <span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_REFERER'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$host</span> = <span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_HOST'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span>!<a href="http://www.php.net/stristr"><span style="color:#0000CC;">stristr</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$from</span>, <span style="color:#0000CC;">$host</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#990000;">'不正なリファラーです。'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
リファラーを持たない環境は結構あります。ノートン等のセキュリティソフトによって隠蔽されている可能性もあります。ドコモなど一部携帯でアウト。</p>
<h3>逆引き不可能なIPアドレスを拒否</h3>
<div class="igBar"><span id="lphp-64"><a href="#" onclick="javascript:showCodeTxt('php-64'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-64">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$ip</span> = <span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'REMOTE_ADDR'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$host</span> = <a href="http://www.php.net/gethostbyaddr"><span style="color:#0000CC;">getHostByAddr</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$ip</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$ip</span>==<span style="color:#0000CC;">$host</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#990000;">'逆引き不可能なIPアドレスです。'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// これでも可能</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span>!<a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'/[a-z]/'</span>, <span style="color:#0000CC;">$host</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#990000;">'逆引き不可能なIPアドレスです。'</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>プロキシ経由を拒否</h3>
<p>プロキシ特有の環境変数とホスト名を調べる方法です。<br />
環境変数を吐かない匿名プロキシもあって、すべてを検出できる訳ではありません。<br />
他にはプロキシリストを作成したり、ポートスキャンする方法もあります。</p>
<div class="igBar"><span id="lphp-65"><a href="#" onclick="javascript:showCodeTxt('php-65'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-65">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$systems</span> = <span style="color:#0000CC;">$_SERVER</span> + <span style="color:#0000CC;">$_ENV</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$ip</span> = <span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'REMOTE_ADDR'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$host</span> = <a href="http://www.php.net/gethostbyaddr"><span style="color:#0000CC;">getHostByAddr</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$ip</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// ドコモの携帯はproxyが存在するので注意</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// anonym=anonymous,anonymizer</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// prox=proxy,proxify</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$proxhost</span> = <a href="http://www.php.net/preg_match"><span style="color:#0000CC;">preg_match</span></a><span style="color:#006600;">&#40;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#990000;">'/anonym|cache|delegate|firewall|gateway|httpd|keeper|prox|squid|via|www/'</span>,</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$host</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$bools</span> = <a href="http://www.php.net/array"><span style="color:#0000CC;">array</span></a><span style="color:#006600;">&#40;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_CLIENT_IP'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_FORWARDED'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_MAX_FORWARS'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_PROXY_CONNECTION'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_SP_HOST'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_TE'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_VIA'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_X_FORWARDED_FOR'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_X_LOCKING'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_XONNECTION'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span>,</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/isset"><span style="color:#0000CC;">isset</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$systems</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_XROXY_CONNECTION'</span><span style="color:#006600;">&#93;</span><span style="color:#006600;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$proxvar</span> = <a href="http://www.php.net/in_array"><span style="color:#0000CC;">in_array</span></a><span style="color:#006600;">&#40;</span><span style="color:#008000;">TRUE</span>, <span style="color:#0000CC;">$bools</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$proxhost</span> || <span style="color:#0000CC;">$proxvar</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#990000;">'プロキシ経由です。'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
<a href="http://www.7key.jp/security/proxy.html">ネットワーク総合辞書 - プロクシとは</a><br />
<a href="http://www.cybersyndrome.net/">サイバーシンドローム</a></p>
<h3>その他の変数</h3>
<div class="igBar"><span id="lphp-66"><a href="#" onclick="javascript:showCodeTxt('php-66'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-66">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 使用言語（ja以外のen-US等は不可）</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$lang</span> = <span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_ACCEPT_LANGUAGE'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span>!<a href="http://www.php.net/stristr"><span style="color:#0000CC;">stristr</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$lang</span>, <span style="color:#990000;">'ja'</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#990000;">'海外からのアクセスです。'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<div class="igBar"><span id="lphp-67"><a href="#" onclick="javascript:showCodeTxt('php-67'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-67">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 接続状況（none,close等は不可）</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$conn</span> = <span style="color:#0000CC;">$_SERVER</span><span style="color:#006600;">&#91;</span><span style="color:#990000;">'HTTP_CONNECTION'</span><span style="color:#006600;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span>!<a href="http://www.php.net/stristr"><span style="color:#0000CC;">stristr</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$conn</span>, <span style="color:#990000;">'Keep-Alive'</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#990000;">'接続状況が不明です。'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
これらの方法は携帯では使えない場合が多い。</p>
<h3>URL数を制限</h3>
<div class="igBar"><span id="lphp-68"><a href="#" onclick="javascript:showCodeTxt('php-68'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-68">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// URLを3つまでに制限する</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span><a href="http://www.php.net/substr_count"><span style="color:#0000CC;">substr_count</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$message</span>, <span style="color:#990000;">'http://'</span><span style="color:#006600;">&#41;</span>&gt; <span style="color:#CC66CC;color:#800000;">3</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#990000;">'URLは3つ以下に制限されています。'</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
URLを載せる目的のスパムが多いので効果的。</p>
<h3>日本語を含まない投稿を拒否</h3>
<div class="igBar"><span id="lphp-69"><a href="#" onclick="javascript:showCodeTxt('php-69'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-69">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span>!<a href="http://www.php.net/mb_ereg"><span style="color:#0000CC;">mb_ereg</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">'[あ-んア-ン]'</span>, <span style="color:#0000CC;">$message</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#990000;">'日本語が含まれていません。'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
効果的ですが、鎖国的で残念な方法。</p>
<h3>禁止ワードの入力を拒否</h3>
<div class="igBar"><span id="lphp-70"><a href="#" onclick="javascript:showCodeTxt('php-70'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-70">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 投稿されたくないキーワードをカンマ区切りで設定</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$spamword</span> = <span style="color:#990000;">'アホ,バカ'</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#F27900;">// 正規表現に変換</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$spamword</span> = <a href="http://www.php.net/preg_quote"><span style="color:#0000CC;">preg_quote</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$spamword</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000CC;">$spamword</span> = <a href="http://www.php.net/str_replace"><span style="color:#0000CC;">str_replace</span></a><span style="color:#006600;">&#40;</span><span style="color:#990000;">','</span>, <span style="color:#990000;">'|'</span>, <span style="color:#0000CC;">$spamword</span><span style="color:#006600;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">if</span><span style="color:#006600;">&#40;</span><a href="http://www.php.net/mb_eregi"><span style="color:#0000CC;">mb_eregi</span></a><span style="color:#006600;">&#40;</span><span style="color:#0000CC;">$spamword</span>, <span style="color:#0000CC;">$message</span>, <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#41;</span><span style="color:#006600;">&#41;</span> <span style="color:#006600;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <a href="http://www.php.net/print"><span style="color:#0000CC;">print</span></a> <span style="color:#0000CC;">$matches</span><span style="color:#006600;">&#91;</span><span style="color:#CC66CC;color:#800000;">0</span><span style="color:#006600;">&#93;</span>.<span style="color:#990000;">'が含まれています。'</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
（preg_quoteはShift_JISでは無効）</p>
<p><a href="http://www.moonover.jp/zikotu/senden/">宣伝書き込み調査中</a></p>
<p>日本語のスパムが目立ち始めたので、NGワード集を作成してみました。<br />
<textarea cols="20" rows="1">《,》,『,』,【,】,♂,♀,§,☆,★,○,●,◎,◇,◆,□,■,△,▲,▽,▼,※,→,←,↑,↓,〓,⇒,⇔,∀,∇,≪,≫,♪,━,─,逢,兄,姉,妹,淫,嘘,噂,裏,占,王,億,男,女,株,髪,姦,鬼,喰,恋,乞,咲,寂,尻,賑,精,即,溜,畜,巷,妻,奴,殿,奈,菜,覗,縛,秘,婦,某,娘,妄,儲,萌,桃,誘,夢,裸,烈,乱,足跡,貴方,案内,浮気,運命,援交,援助,円満,架空,覚醒,家事,加入,喫茶,究極,求人,業界,巨大,緊急,金融,厳守,懸賞,厳選,豪華,交際,豪邸,購読,好評,合法,攻略,困惑,在宅,殺到,至急,時給,資金,実録,始動,自慢,指名,借金,収入,衝撃,証拠,招待,所得,絶好,続出,損害,体験,代表,達人,団地,延滞,調教,直ア,直メ,抽選,出会,盗撮,投資,当社,当選,読者,年上,年下,内緒,入会,美人,必見,必死,便乗,風俗,副業,沸騰,不倫,返済,報酬,放題,本舗,麻薬,満喫,満載,銘柄,融資,優良,楽々,連合,遊ぼう,あなた,今だけ,受取人,急上昇,実施中,写真集,消費者,たった,動画集,誰でも,登録料,年会費,ほんと,ほんの,未払い,めちゃ,楽して,資料請求,こっそり,こんなに,ーす。,～す。,いよ。,くね。,事。,来てね。,だよ。,だよね。,ようね。,できる。,のである。,む。,ぃ,ぅ,ぇ,ぉ,～ス,～ｽ,アダルト,ｱﾀﾞﾙﾄ,アフィリ,ｱﾌｨﾘ,アルバイト,ｱﾙﾊﾞｲﾄ,イチオシ,ｲﾁｵｼ,イベント,ｲﾍﾞﾝﾄ,エロ,ｴﾛ,オークション,ｵｰｸｼｮﾝ,ガチ,ｶﾞﾁ,キャッシング,ｷｬｯｼﾝｸﾞ,ギャル,ｷﾞｬﾙ,キャンセル,ｷｬﾝｾﾙ,キャンペーン,ｷｬﾝﾍﾟｰﾝ,クレジット,ｸﾚｼﾞｯﾄ,ゲッツ,ｹﾞｯﾂ,ゴージャス,ｺﾞｰｼﾞｬｽ,合コン,合ｺﾝ,ココ,ｺｺ,コスプレ,ｺｽﾌﾟﾚ,コンパ,ｺﾝﾊﾟ,サービス,ｻｰﾋﾞｽ,サイコー,ｻｲｺｰ,サンプル画像,ｻﾝﾌﾟﾙ画像,サンプル動画,ｻﾝﾌﾟﾙ動画,スケベ,ｽｹﾍﾞ,スゴイ,ｽｺﾞｲ,ズバリ,ｽﾞﾊﾞﾘ,セレブ,ｾﾚﾌﾞ,ダイエット,ﾀﾞｲｴｯﾄ,タダ,ﾀﾀﾞ,チャット,ﾁｬｯﾄ,チャンス,ﾁｬﾝｽ,チャンネル,ﾁｬﾝﾈﾙ,ツッコミ,ﾂｯｺﾐ,テレクラ,ﾃﾚｸﾗ,ドラッグ,ﾄﾞﾗｯｸﾞ,ナイス,ﾅｲｽ,ナンパ,ﾅﾝﾊﾟ,ナース,ﾅｰｽ,ヌード,ﾇｰﾄﾞ,ノウハウ,ﾉｳﾊｳ,パートナー,ﾊﾟｰﾄﾅｰ,ビジネス,ﾋﾞｼﾞﾈｽ,ビック,ﾋﾞｯｸ,ビッグ,ﾋﾞｯｸﾞ,プレゼント,ﾌﾟﾚｾﾞﾝﾄ,フレンド,ﾌﾚﾝﾄﾞ,ポルノ,ﾎﾟﾙﾉ,マニア,ﾏﾆｱ,メル友,ﾒﾙ友,ランキング,ﾗﾝｷﾝｸﾞ,リッチ,ﾘｯﾁ,ローン,ﾛｰﾝ,ワンクリ,ﾜﾝｸﾘ</textarea></p>
<h3>まとめ</h3>
<p>スパムは、フォーム情報をスキャンして一方的に大量に送りつけられます。以前は英語のスパムが殆どで対処も楽でしたが、最近は日本語のスパムも目立つ様になってきました。フォームを探すだけでなく、手動で登録したり、弾かれても内容を変えてリトライさせるスパム生成アプリまで販売されています。</p>
<p>有名なスクリプトや一般的な対処法はすぐに狙われてしまいます。効果的で簡単な対処方法はなかなかありませんが、ちょっとした「ひねり」を加える事で被害を抑える事ができます。例えばフォームを表示してから投稿するまでの時間を計測して短すぎたら拒否するのも賢い手法といえます。また、セッションを活用するのも効果的です。今後良い方法を入手できたら紹介したいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mt312.com/php/40/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Amazon Web Service</title>
		<link>http://www.mt312.com/php/39/</link>
		<comments>http://www.mt312.com/php/39/#comments</comments>
		<pubDate>Thu, 10 May 2007 11:42:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mt312.com/php/39/</guid>
		<description><![CDATA[Amazon Web Service(AWS)を使うと、Amazonで検索した商品データを自分のサイトに載せる事ができます。商品データはXML形式で返されますので、これをPHPで解析してHTMLに成型します。

このサービスを利用するには登録が必要です。

商品広告で収入を得る為のアソシエイト登録
AWSを利用する為のSubscription Idの取得



商品検索方法
http://xml-jp.amznxslt.com/onca/xml3?local=jp
このアドレスに検索用のパラメータを連結させて問い合わせします。


オプションパラメータ


f=
XSLTを適用する場合はそのURL
f=xmlとするとそのままXMLを取得できます。


locale=
国コード 日本はjp


type=
lite 簡易版
heavy 完全版


t=
アソシエイトID


dev-t=
Subscription Id （デベロッパトークン）


page=
結果が複数ページに渡る場合のページ数


mode=
検索する商品のジャンル


和書
books-jp


洋書
books-us


音楽
music-jp


音楽クラシック
classical-jp


DVD
dvd-jp


ビデオ
vhs-jp


エレクトロニクス
electronics-jp


ソフトウェア
software-jp


ゲーム
videogames-jp


ASINSearch=
商品固有のASIN(Amazon Standard Item Number)コード、もしくは書籍に付いているISBNコードを指定。 カンマ（,）で区切って複数指定可能


KeywordSearch=
検索単語


これ以外にも詳細な検索が行えるパラメータがいくつかあります。
XMLを解析する
アマゾンから返ってきたXMLは、PHP標準のDOM関数を使って自力で解析しても良いのですが、構造が複雑になると少々大変です。そこで、PEARのXML_Serializerパッケージに含まれているXML_Unserializerクラスを使います。これを使えば、XMLテキストを瞬時に連想配列にしてくれますので、後で好きな様にHTMLに加工できます。
（注） PEARがない場合、まずPEARを導入して下さい。
http://pear.php.net/package/XML_Serializer
PLAIN TEXT
PHP:




// XML_Unserializerクラスの読み込み


require 'XML/Unserializer.php';


&#160;


class AWS_QueryString &#123;


&#160; var $_params;


&#160;


&#160; function AWS_QueryString&#40;$token, $assoc,　$type = 'heavy', $format = 'xml',


$locale = 'jp'&#41; &#123;


&#160; &#160; $this-&#62;_params = array&#40;&#41;;


&#160; &#160; // 基本データだけ入れておく


&#160; &#160; $this-&#62;add&#40;'dev-t', $token&#41;;


&#160; &#160; $this-&#62;add&#40;'t', $assoc&#41;;


&#160; &#160; $this-&#62;add&#40;'locale', $locale&#41;;


&#160; &#160; $this-&#62;add&#40;'f', $format&#41;;


&#160; &#160; $this-&#62;add&#40;'type', $type&#41;;


&#160; &#125;


&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Amazon Web Service(AWS)を使うと、Amazonで検索した商品データを自分のサイトに載せる事ができます。商品データはXML形式で返されますので、これをPHPで解析してHTMLに成型します。</p>
<ul>
<li>このサービスを利用するには登録が必要です。
<ul>
<li><a href="http://associates.amazon.co.jp/gp/associates/join/main.html/250-9149221-5127435">商品広告で収入を得る為のアソシエイト登録</a></li>
<li><a href="http://www.amazon.co.jp/exec/obidos/subst/associates/join/webservices.html/250-9149221-5127435">AWSを利用する為のSubscription Idの取得</a></li>
</ul>
</li>
</ul>
<h3>商品検索方法</h3>
<p><strong>http://xml-jp.amznxslt.com/onca/xml3?local=jp</strong><br />
このアドレスに検索用のパラメータを連結させて問い合わせします。</p>
<table>
<tr>
<th colSpan="3">オプションパラメータ</th>
</tr>
<tr>
<td>f=</td>
<td colSpan="2">XSLTを適用する場合はそのURL<