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

<channel>
	<title>$i-&#62;php();</title>
	<atom:link href="http://i-php.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://i-php.net</link>
	<description>Hãy tiết kiệm điện và sử dụng opensource để bảo vệ môi trường</description>
	<lastBuildDate>Fri, 05 Feb 2010 08:26:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Giới thiệu các cú pháp thay thế của PHP</title>
		<link>http://i-php.net/2010/02/php-alternate-syntax/</link>
		<comments>http://i-php.net/2010/02/php-alternate-syntax/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 08:22:30 +0000</pubDate>
		<dc:creator>ngocbd</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[PHP-Alternate-Syntax]]></category>
		<category><![CDATA[Syntax]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=576</guid>
		<description><![CDATA[Giới thiệu các cú pháp thay thế (Alternate-Syntax) sử dụng trong php 
Các cú pháp này nhằm đơn giản hoá, rút gọn các cú pháp chuẩn của php . Cũng có thể chúng được tạo ra để nhìn cho giống mộ vài ngôn ngữ động khác như python , perl , ruby . Mà cũng [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><strong>Giới thiệu các cú pháp thay thế (Alternate-Syntax) sử dụng trong php </strong></p>
<p style="text-align: left;">Các cú pháp này nhằm đơn giản hoá, rút gọn các cú pháp chuẩn của php . Cũng có thể chúng được tạo ra để nhìn cho giống mộ vài ngôn ngữ động khác như python , perl , ruby . Mà cũng có thể làm cho php có vẻ gì đó mới mẻ không biết chừng <img src='http://i-php.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  .</p>
<p style="text-align: left;"><em>Các Alternate-Syntax thường sử dụng dấu `:` </em>(ternary)</p>
<p style="text-align: left;">1. if &#8211; else</p>
<div>
<div>
<div><code> &lt;?php if ($a == 5): ?&gt;<br />
A is equal to 5<br />
&lt;?php endif; ?&gt; </code></div>
</div>
<div>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</div>
<div>
<div>
<div>
<div><code> &lt;?php<br />
if ($a == 5):<br />
echo "a equals 5";<br />
echo "...";<br />
elseif ($a == 6):<br />
echo "a equals 6";<br />
echo "!!!";<br />
else:<br />
echo "a is neither 5 nor 6";<br />
endif;<br />
?&gt; </code></div>
</div>
</div>
</div>
</div>
<p style="text-align: left;">&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p style="text-align: left;">&lt;?php</p>
<p style="text-align: left;"><code>print $foo = ($hour &lt; 12) ? "Good morning!" : "Good afternoon!";</code></p>
<p style="text-align: left;">?&gt;</p>
<p style="text-align: left;">2.Switch &#8211; case</p>
<p style="text-align: left;">&lt;?php</p>
<p style="text-align: left;"><code> switch($var):<br />
case 1:<br />
//statements</code></p>
<p style="text-align: left;"><code> break;</code></p>
<p>case 2:<br />
//statements<br />
break;<br />
case 3:<br />
//statements<br />
break;<br />
endswitch;</p>
<p style="text-align: left;">?&gt;</p>
<p style="text-align: left;">
<p style="text-align: left;">3.for ( bao gồm cả foreach)</p>
<p style="text-align: left;">&lt;?php</p>
<p style="text-align: left;"><code>for(exp):<br />
//statements;<br />
endfor;</code></p>
<p style="text-align: left;">?&gt;</p>
<p style="text-align: left;">
<p style="text-align: left;">Nhìn chung nếu php mix với mã HTML thì dùng Alternate-Syntax &#8220;khá sướng&#8221; . Vì nó dễ phân biết ra các block tạo ra bởi các cấu trúc khác nhau như if else , for , while hơn rất nhiều so với bracket .</p>
<p style="text-align: left;"><code>&lt;ul&gt;</code></p>
<p><var>&lt;?php foreach($todo as $item): ?&gt;</var></p>
<p>&lt;li&gt;<var>&lt;?=$item?&gt;</var>&lt;/li&gt;</p>
<p><var>&lt;?php endforeach; ?&gt;</var></p>
<p>&lt;/ul&gt;</p>
<p style="text-align: left;">
<p style="text-align: left;">Kết luận :</p>
<p style="text-align: left;">PHP-Alternate-Syntax thích hợp cho làm view , template file</p>
<p style="text-align: left;">PHP-Alternate-Syntax không nên dùng trong các file thuần php ( vì ko phát huy hiệu quả , và không thân thiện với IDE)</p>
<p style="text-align: left;">Một số các framework hay các CMS ( ví dụ cái WordPress này chẳng hạn ) bắt đầu dùng Alternate-Syntax nhiều .</p>
<p style="text-align: left;">
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2010/02/php-alternate-syntax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Use Flash with PHP</title>
		<link>http://i-php.net/2009/12/how-to-use-flash-with-php/</link>
		<comments>http://i-php.net/2009/12/how-to-use-flash-with-php/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 10:36:43 +0000</pubDate>
		<dc:creator>ngocbd</dc:creator>
				<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=570</guid>
		<description><![CDATA[Đây là bài viết chuẩn bị cho topic cùng tên trong PHPDAY .
Có rất nhiều cách giúp Flash client và PHP có thể giao tiếp được với nhau .
Về nguyên tắc flash client có thể sử dụng giao thức TCP/IP  ( và mới đây là Peer-to-Peer )  . Tuy nhiên thông dụng nhất vẫn là [...]]]></description>
			<content:encoded><![CDATA[<p><em>Đây là bài viết chuẩn bị cho topic cùng tên trong PHPDAY .</em></p>
<p>Có rất nhiều cách giúp Flash client và PHP có thể giao tiếp được với nhau .</p>
<p>Về nguyên tắc flash client có thể sử dụng giao thức TCP/IP  ( và mới đây là Peer-to-Peer )  . Tuy nhiên thông dụng nhất vẫn là qua HTTP . Như vậy mọi mọi kết nối HTTP đều có thể dùng flash để giao tiếp ngon lành <img src='http://i-php.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  .</p>
<p>1. Dùng plain text</p>
<p>Tôi sẽ cố gắng load nội dung một file text trên i-php.net ( url của file : http://i-php.net/phpday/example.txt)</p>
<p>Ở đây  tôi minh họa bằng action script 3</p>
<blockquote><p>var request:URLRequest = new URLRequest(&#8220;http://i-php.net/phpday/example.txt&#8221;);<br />
var loader:URLLoader = new URLLoader(request);</p>
<p>// Handler when Loader complete<br />
loader.addEventListener(Event.COMPLETE, completeHandler);</p>
<p>function completeHandler(event:Event):void<br />
{<br />
var loader:URLLoader = URLLoader(event.target);<br />
trace(&#8220;loaded content: &#8221; + loader.data);<br />
}</p></blockquote>
<p>// output  loaded content: Hello Flash client</p>
<p>Tất nhiên là flash client chẳng quan tâm đến file plain text ( ở đây là http://i-php.net/phpday/example.txt) là file tĩnh hay output của một server side process &#8211; server side script cả . Bạn có thể thay thế bằng việc gọi tới một file php script bằng cách thay URL .</p>
<blockquote><p>var request:URLRequest = new URLRequest(&#8220;http://i-php.net/about/&#8221;);</p></blockquote>
<p>Như vậy đối với flash việc đọc một file trên http server là dễ dàng . Từ việc đọc được một text file ta có thể dùng nhiều cách để giao tiếp với server ( load variable , Json, XML-RPC, SOAP , REST , &#8230;)</p>
<p>2. Dùng load variable</p>
<p>Dùng kỹ thuật này đề load các dữ liệu có định dạng name=value .</p>
<p>Ở actionscript 2 thì chỉ cần gọi hàm <span style="color: navy;">loadVariables</span><br />
Ở actionscript 3 ta sửa đoạn code trên .<br />
<code>var request:URLRequest = new URLRequest("http://i-php.net/phpday/loadme.php");<br />
var loader:URLLoader = new URLLoader(request);<br />
// format result as VARIABLES<br />
loader.dataFormat = URLLoaderDataFormat.VARIABLES</code></p>
<p>// Handler when Loader complete<br />
loader.addEventListener(Event.COMPLETE, completeHandler);</p>
<p>function completeHandler(event:Event):void<br />
{<br />
var loader:URLLoader = URLLoader(event.target);</p>
<p>if(loader.data is URLVariables)<br />
{<br />
trace(loader.data.user+&#8221;:&#8221;+loader.data.message);</p>
<p>}<br />
}</p>
<p>File loadme.php chỉ đơn giản là echo ra nội dung :<br />
<code><br />
echo 'message=Hello&amp;user=system';<br />
?&gt;<br />
</code><br />
Như vậy loadvar thực chất là định dạng nội dung theo định dang name=value pairs .</p>
<p>Với những dữ liệu đơn giản thì chỉ cần các cách 1 và 2 là đủ . Tuy nhiên với các dạng dữ liệu phức tạp như Object hay Array thì cần những phương pháp serialization . Vậy serialization là gì và tại sao phải serialization  ?</p>
<p>Trong các ứng dụng client-server ta muốn send các object qua mạng , mà bản thân các giao thức mạng ( tầng thấp ) đều không hiểu object là gì hết nó chỉ hiểu các bit ( 1001100111 &#8230; ) hoặc cao cấp cỡ HTTP cũng chỉ hiểu text và text . Nên chúng ta cần đưa các object về các dạng nhị phân hoặc text , truyền chúng qua mạng rồi về đến client sẽ dựng lại thành các object . Công việc như vậy gọi là serialization  và deserialization  .</p>
<p>Như vậy mỗi phương pháp serialization &#8211; deserialization  khác nhau sẽ tạo ra một giao thức khác nhau SOAP,XML-RPC dùng XML , Json,Yaml dùng các nested text block ,&#8230;</p>
<p>Các Text based serialization như SOAP,XML-RPC , Json,Yaml tôi sẽ không đi sâu trong bài viết này .<br />
Mà chỉ chỉ ra nhược điểm lớn nhất của chúng là vấn đề tốc độ truyền tải sẽ rất chậm .<br />
Chậm vì các xml tag của SOAP,XML-RPC vừa thừa,  vừa tốn thời gian serialization &#8211; deserialization.</p>
<p>Chính vì nhu cầu cần có giao thức có tốc độ truyền và serialization &#8211; deserialization nhanh hơn , và tốt hơn cả là binary thay vì text base nên với mỗi ngôn ngữ &#8211; công nghệ có các giải pháp khác nhau .<br />
Như Java có RMI<br />
Như .Net có .Net remoting<br />
Python có RPyC<br />
Flash có AMF</p>
<p>Vậy  AMF là công nghệ RPC giúp client là Flash/AIR player giao tiếp với server .<br />
Server của AMF có thể là  :</p>
<p>Java &#8211; BlazeDS, RED 5, Cinnamon, OpenAMF, Pimento, Granite<br />
.NET &#8211; WebORB, FluorineFx, AMF.NET<br />
PHP &#8211; AMFPHP, SabreAMF, WebORB<br />
Python &#8211; PyAMF, Flashticle, amfast, Plasma<br />
Perl &#8211; AMF::Perl<br />
Ruby &#8211; RubyAMF, WebORB</p>
<p>Nếu kết hợp với các framework phía server thì có các thư viện</p>
<p>Ruby on Rails &#8211; RubyAMF<br />
Zend Framework &#8211; Zend_AMF<br />
OSGi Framework &#8211; AMF3 for OSGi<br />
Django &#8211; Django AMF<br />
CakePHP &#8211; CakeAMFPHP</p>
<p>3. PHPAMF .<br />
Như vậy PHPAMF chẳng qua chỉ là một thư viện giúp flash client có thể gửi và nhận dữ liệu với server side là php .<br />
PHPAMF có một số đặc điểm<br />
&#8230;. ( lười list)<br />
Cụ thể các công việc mà PHPAMF sẽ làm khi nhận được flash client yêu cầu :</p>
<p>    *  Deserializes the request<br />
    * Finds the corresponding remote class<br />
    * Instantiates the class<br />
    * Performs security checks<br />
    * Calls the remote method using the specified arguments<br />
    * Serializes the returned data<br />
( Lười dịch -> cần sơ đồ )</p>
<p>4. Cài đặt và Demo .<br />
Only demo , nothing here <img src='http://i-php.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/12/how-to-use-flash-with-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tự tạo captcha đơn giản cho ứng dụng của bạn</title>
		<link>http://i-php.net/2009/11/t%e1%bb%b1-t%e1%ba%a1o-captcha-d%c6%a1n-gi%e1%ba%a3n-cho-%e1%bb%a9ng-d%e1%bb%a5ng-c%e1%bb%a7a-b%e1%ba%a1n/</link>
		<comments>http://i-php.net/2009/11/t%e1%bb%b1-t%e1%ba%a1o-captcha-d%c6%a1n-gi%e1%ba%a3n-cho-%e1%bb%a9ng-d%e1%bb%a5ng-c%e1%bb%a7a-b%e1%ba%a1n/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 19:15:47 +0000</pubDate>
		<dc:creator>namvl</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=568</guid>
		<description><![CDATA[Bài viết này bao gồm các phần:
- captcha là gì
- captcha được tạo như thế nào
- tiến hành code
- viết thành thư viện để sử dụng lại
1. Captcha là gì?
Một CAPTCHA (ˈkæptʃə, đọc giống như &#8220;capture&#8221;) là một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác định xem người dùng [...]]]></description>
			<content:encoded><![CDATA[<p>Bài viết này bao gồm các phần:</p>
<p>- captcha là gì</p>
<p>- captcha được tạo như thế nào</p>
<p>- tiến hành code</p>
<p>- viết thành thư viện để sử dụng lại</p>
<p>1. Captcha là gì?</p>
<p>Một CAPTCHA (ˈkæptʃə, đọc giống như &#8220;capture&#8221;) là một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác định xem người dùng có phải là con người hay không. &#8220;CAPTCHA&#8221; là một dạng sắp đặt chữ đầu của &#8220;Completely Automated Public Turing test to tell Computers and Humans Apart&#8221; (Phép thử Turing công cộng hoàn toàn tự động để phân biệt máy tính với người), được trường Đại học Carnegie Mellon cố gắng đăng kí thương hiệu nhưng đã bị bác bỏ. Đây là một quá trình một máy tính (máy chủ) yêu cầu một người dùng hoàn tất một kiểm tra đơn giản mà máy tính có thể dễ dàng tạo ra và đánh giá, nhưng không thể tự giải nó được. Vì máy tính không thể giải quyết CAPTCHA, bất kỳ người dùng nào nhập vào lời giải đúng sẽ được xem là con người.</p>
<p>Thuật ngữ CAPTCHA được Luis von Ahn, Manuel Blum, Nicholas J. Hopper (tất cả đều thuộc Đại học Carnegie Mellon), và John Langford (khi đó thuộc IBM) đặt ra vào năm 2000. Một loại CAPTCHA phổ biến yêu cầu người dùng phải nhập các chữ cái trong một tấm hình méo mó, đôi khi cùng với một dãy số hoặc chữ lờ mờ xuất hiện trên màn hình.</p>
<p>Một CAPTCHA đôi khi được mô tả như một phép thử Turing ngược, vì nó được một máy tạo ra và nhắm vào con người, ngược lại với phép thử Turing chuẩn do con người tạo ra và nhắm vào máy.</p>
<p>&lt;nguồn wikipedia&gt;</p>
<p>2. captcha được tạo như thế nào</p>
<p>Đầu tiên ta cần phải ghi ra file ảnhtừ các chuỗi random.</p>
<p>Lưu chuỗi random này vào session.</p>
<p>So sánh chuỗi random trong session với request được gửi lên</p>
<p>Nếu chính xác thì thự hiện tiến trình</p>
<p>Nếu không thì trả về lỗi.</p>
<p>3. code nào</p>
<p>Đầu tiên để có thể ghi 1 string lên image file, tôi đi tìm đọc về thư viện image của php:</p>
<p>http://www.php.net/manual/en/ref.image.php</p>
<p>Có rất nhiều, keyword tôi quan tâm là draw &#8211; string &#8211; images</p>
<p>Lúc này có 2 sự lựa chọn tôi tìm thấy.1 là có file ảnh sẵn, đọc và ghi và file đó.2 sử dụng 1 file php, gen ra ảnh khi có parameter.</p>
<p>Cách 1 xem chừng khá đơn giản, nhưng chỉ chạy được khi có 1 request. còn nhiều req thì chịu</p>
<p>Cách thứ 2 tôi đã chọn, truyền chuỗi vào nó tự gen ra ngay trên phía client 1 file có header dạng image.</p>
<p>Như vậy tôi có 2 file:</p>
<p>- gen_image.php</p>
<p>- test.php</p>
<p>&#8212;&gt; GEN_IMAGE.PHP &#8212;&gt;</p>
<p>&lt;?php</p>
<p>// thông báo đây là image type</p>
<p>header (&#8220;Content-type: image/png&#8221;);</p>
<p>$img=ImageCreate(80,30); // quy định kích cỡ của ảnh<br />
$bgcolor=ImageColorAllocate($img,255,255,255); // cho màu nền là màu trắng<br />
$red=ImagecolorAllocate($img,255,0,0); // quy định chữ màu đỏ cho nổi</p>
<p>ImageString($img,10,10,10, $_REQUEST['text'],$red); // add cái text lấy được từ request vào obj image</p>
<p>ImageSetPixel($img,50,50,$red);<br />
ImagePNG($img);<br />
ImageDestroy($img);<br />
?&gt;</p>
<p>Như vậy là xong file gen_image.php. Nếu bạn gõ địa chỉ gen_image.php?text=&#8221;abcabc&#8221;, nó sẽ gen ra ảnh png với text trong ảnh là abcabc</p>
<p>Giờ tạo file test nào:</p>
<p>- chúng ta cần 1 hàm cho ra chuỗi random, ở đây tôi mượn hàn gen ra chuỗi mã màu random</p>
<p>function get_random_color()<br />
{<br />
$c=&#8221;;<br />
for ($i = 0; $i&lt;6; $i++)<br />
{<br />
$c .=  dechex(rand(0,15));<br />
}<br />
return &#8220;$c&#8221;;<br />
}</p>
<p>Giờ đến phần phân tích xem user gõ cái gì vào hay không và so sánh với chuỗi k tự trong session</p>
<p>$captcha = get_random_color();<br />
$captcha_url = &#8221;;</p>
<p>if( !isset($_SESSION['dCaptchaContentb']) || !isset($_REQUEST['captcha']))<br />
{<br />
$_SESSION['dCaptchaContentb'] = $captcha;<br />
$captcha_url = &#8216;/gen.php?text=&#8217;.$captcha;<br />
}<br />
else if(isset($_REQUEST['captcha']))<br />
{<br />
if($_SESSION['dCaptchaContentb'] == $_REQUEST['captcha'])<br />
{<br />
//proccess<br />
}<br />
else<br />
{<br />
//noproccess</p>
<p>}<br />
unsset($_SESSION['dCaptchaContentb']);<br />
}</p>
<p>Tạo form ở bên dưới test</p>
<p>&lt;form method=&#8217;post&#8217;&gt;<br />
&lt;img src=&#8217;&lt;?php echo $captcha_url ?&gt;&#8217; /&gt;<br />
&lt;input type=&#8217;text&#8217; name=&#8217;captcha&#8217; /&gt;<br />
&lt;input type=&#8217;submit&#8217; value=&#8217;submit&#8217; /&gt;<br />
&lt;/form&gt;</p>
<p>Giờ là lúc test thử xem ok không</p>
<p>4. viết thành thư viện để sử dụng lại</p>
<p>phần này mọi người thực hành xem sao nhé <img src='http://i-php.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/11/t%e1%bb%b1-t%e1%ba%a1o-captcha-d%c6%a1n-gi%e1%ba%a3n-cho-%e1%bb%a9ng-d%e1%bb%a5ng-c%e1%bb%a7a-b%e1%ba%a1n/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gởi email text, HTML và tiếng Việt Unicode</title>
		<link>http://i-php.net/2009/11/g%e1%bb%9fi-email-text-html-va-ti%e1%ba%bfng-vi%e1%bb%87t-unicode/</link>
		<comments>http://i-php.net/2009/11/g%e1%bb%9fi-email-text-html-va-ti%e1%ba%bfng-vi%e1%bb%87t-unicode/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 06:48:36 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[email]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=563</guid>
		<description><![CDATA[HÀM MAIL() CỦA PHP
Send email trong PHP rất đơn giản, ta chỉ cần dùng duy nhất 1 hàm mail() được PHP cung cấp sẵn là đủ. Cú pháp của hàm mail() như sau:
bool mail(string to, string subject, string message[, string additional_headers])
Các tham số của hàm mail() có ý nghĩa như sau:

to &#8211; địa chỉ người [...]]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color: #009010;">HÀM MAIL() CỦA PHP</span></strong></p>
<p>Send email trong PHP rất đơn giản, ta chỉ cần dùng duy nhất 1 hàm <code>mail()</code> được PHP cung cấp sẵn là đủ. Cú pháp của hàm <code>mail()</code> như sau:</p>
<p><code>bool mail(string to, string subject, string message[, string additional_headers])</code></p>
<p>Các tham số của hàm <code>mail()</code> có ý nghĩa như sau:</p>
<ul>
<li><strong>to</strong> &#8211; địa chỉ người nhận email, là 1 string. Các giá trị hợp lệ của tham số <strong>to</strong> có dạng như sau:<br />
<code>'user@domain.com'</code><br />
<code>'user1@domain.com, user2@domain.com'</code><br />
<code>'User Name &lt;user@example.com&gt;'</code><br />
<code>'User Name 1 &lt;user1@example.com&gt;, User Name 2 &lt;user2@example.com&gt;'</code><br />
<code>'User Name 1 &lt;user@example.com&gt;, user2@domain.com, User Name 3 &lt;user3@example.com&gt;'</code></li>
<li><strong>subject</strong> &#8211; tiêu đề của email, là 1 string. Tiêu đề của email không được chứa ký tự xuống dòng (<strong>\r</strong> hoặc <strong>\n</strong>).</li>
<li><strong>message</strong> &#8211; nội dung email, là 1 string. Nội dung email có thể do nhiều dòng ghép lại với nhau, mỗi dòng được phân cách bằng ký tự <strong>\n</strong>.</li>
<li><strong>additional_headers</strong> &#8211; (tuỳ chọn) dùng để chèn thêm các header vào email. Các header này không nằm trong phần nội dung của email mà dùng để quản lý việc gởi email (ví dụ chèn thêm các trường CC, BCC khi gởi email). Nhiều header có thể cùng ghép lại thành 1 string trong <em>additional_headers</em>, các header được phân cách nhau bằng chuỗi <strong>\r\n</strong>.</li>
</ul>
<p> </p>
<p>Hàm <code>mail()</code> sẽ trả về giá trị TRUE nếu như email được chấp nhận gởi đi và FALSE trong trường hợp ngược lại.<br />
<span style="text-decoration: underline;">Lưu ý:</span> Hàm <code>mail()</code> trả về giá trị TRUE không có nghĩa là email sẽ được gởi đến nơi nhận thành công. Giá trị TRUE được trả về chỉ có ý nghĩa là email được server chấp nhận gởi đi, còn khi nào thì email thực sự được gởi, gởi có tới nơi hay không thì chương trình không biết được (như vậy nếu bạn nhập sau địa chỉ người nhận ở tham số To thì sẽ không có cách nào chương trình biết được địa chỉ To có đúng hoặc tồn tại hay không!).</p>
<p><strong><span style="color: #009010;">MỘT VÍ DỤ GỞI EMAIL VỚI HÀM MAIL()</span></strong></p>
<p>Ta hãy tạo 1 chương trình PHP nhỏ đẻ gởi email như sau:</p>
<pre class="php"><span style="font-style: italic; color: #808080;">//nội dung file example1.php</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #0000ff;">$from</span> = <span style="color: #ff0000;">'from@domain.com'</span>;
<span style="color: #0000ff;">$to</span> = <span style="color: #ff0000;">'to@domain.com'</span>;
<span style="color: #0000ff;">$subject</span> = <span style="color: #ff0000;">'Example 1: Send simple text email'</span>;
<span style="color: #0000ff;">$message</span> = <span style="color: #ff0000;">'A plain text email.'</span>;
<span style="color: #0000ff;">$header</span> = <span style="color: #ff0000;">"From: $from<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>Reply-to: $from"</span>;
 
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">(</span> <span style="color: #000066;">mail</span><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$to</span>, <span style="color: #0000ff;">$subject</span>, <span style="color: #0000ff;">$message</span>, <span style="color: #0000ff;">$header</span><span style="color: #66cc66;">)</span> <span style="color: #66cc66;">)</span> <span style="color: #66cc66;">{</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">"Email sent to $to!"</span>;
<span style="color: #66cc66;">}</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">{</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">"Error occured while sending email to $to!"</span>;
<span style="color: #66cc66;">}</span> <span style="font-style: italic; color: #808080;">//end if</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre>
<p> </p>
<p>Lưu chương trình vào file <strong>example1.php</strong> và chạy thử. Nếu quá trình gởi email thành công, bạn sẽ nhận được câu thông báo <strong>&#8220;Email sent to to@domain.com!&#8221;</strong>, nếu có lỗi bạn sẽ nhận được câu thông báo <strong>&#8220;Error occured while sending email to to@domain.com!&#8221;</strong></p>
<p><span style="text-decoration: underline;">Lưu ý:</span></p>
<ul>
<li>Nhớ thay <strong>to@domain.com</strong> và <strong>from@domain.com</strong> thành địa chỉ email của bạn trước khi chạy thử chương trình!</li>
<li>Có thể phải mất tới 5-10 phút email mới tới nơi, và bạn nhớ kiểm tra thư mục <strong>Bulk</strong> email vì nhiều khi email gởi tới bị để trong mục Bulk.</li>
</ul>
<p> </p>
<p>Trong cú pháp của hàm <code>mail()</code>, tham số <strong>additional_headers</strong> là tuỳ chọn, tức là bỏ qua cũng được. Tuy nhiên, trên thực tế bạn nên cung cấp tham số <strong>additional_headers</strong> cho hàm <code>mail()</code> với ít nhất 2 header <strong>From</strong> và <strong>Reply-to</strong>. Lý do thì có nhiều, một trong số các lý do phải cung cấp header <strong>From</strong> và <strong>Reply-to</strong> là vì nếu phần địa chỉ người gởi (From) là rỗng, các chương trình lọc email có thể cho rằng đây là emai spam và thế là email được tự động chuyển sang &#8220;Thùng rác&#8221;!.</p>
<p><strong><span style="color: #009010;">GỞI HTML EMAIL VỚI HÀM MAIL()</span></strong></p>
<p>Chúng ta đã gởi được email text với hàm <code>mail()</code>, nhưng nhiều lúc ta cần &#8220;trang điểm&#8221; màu mè cho nội dung email được bắt mắt hơn. Thử viết 1 chương trình nhỏ gởi email HTML:</p>
<pre class="php"><span style="font-style: italic; color: #808080;">//nội dung file example2.php</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #0000ff;">$from</span> = <span style="color: #ff0000;">'from@domain.com'</span>;
<span style="color: #0000ff;">$to</span> = <span style="color: #ff0000;">'to@domain.com'</span>;
<span style="color: #0000ff;">$subject</span> = <span style="color: #ff0000;">'Example 2: Try a simple HTML email'</span>;
<span style="color: #0000ff;">$message</span> = <span style="color: #ff0000;">'A HTML email: &lt;b&gt;bold&lt;/b&gt;, &lt;i&gt;italic&lt;/i&gt;, &lt;u&gt;underline&lt;/u&gt;.'</span>;
<span style="color: #0000ff;">$header</span> = <span style="color: #ff0000;">"From: $from<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>Reply-to: $from"</span>;
 
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">(</span> <span style="color: #000066;">mail</span><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$to</span>, <span style="color: #0000ff;">$subject</span>, <span style="color: #0000ff;">$message</span>, <span style="color: #0000ff;">$header</span><span style="color: #66cc66;">)</span> <span style="color: #66cc66;">)</span> <span style="color: #66cc66;">{</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">"Email sent to $to!"</span>;
<span style="color: #66cc66;">}</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">{</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">"Error occured while sending email to $to!"</span>;
<span style="color: #66cc66;">}</span> <span style="font-style: italic; color: #808080;">//end if</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre>
<p> </p>
<p>Lưu chương trình vào file <strong>example2.php</strong> và chạy thử. Email gởi thành công, tới nơi an toàn, nhưng khi mở ra xem thì nội dung email lại như vầy:<br />
<code>A HTML email: &lt;b&gt;bold&lt;/b&gt;, &lt;i&gt;italic&lt;/i&gt;, &lt;u&gt;underline&lt;/u&gt;.</code><br />
Thế có tức không?</p>
<p>Thực ra bạn chỉ cần sửa lại chương trình &#8220;1 chút xíu&#8221; là đâu vào đấy ngay:</p>
<pre class="php"><span style="font-style: italic; color: #808080;">//nội dung file example3.php</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #0000ff;">$from</span> = <span style="color: #ff0000;">'from@domain.com'</span>;
<span style="color: #0000ff;">$to</span> = <span style="color: #ff0000;">'to@domain.com'</span>;
<span style="color: #0000ff;">$subject</span> = <span style="color: #ff0000;">'Example 3: Send HTML email'</span>;
<span style="color: #0000ff;">$message</span> = <span style="color: #ff0000;">'A HTML email: &lt;b&gt;bold&lt;/b&gt;, &lt;i&gt;italic&lt;/i&gt;, &lt;u&gt;underline&lt;/u&gt;.'</span>;
<span style="color: #0000ff;">$header</span> = <span style="color: #ff0000;">"Content-type: text/html<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>From: $from<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>Reply-to: $from"</span>;
 
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">(</span> <span style="color: #000066;">mail</span><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$to</span>, <span style="color: #0000ff;">$subject</span>, <span style="color: #0000ff;">$message</span>, <span style="color: #0000ff;">$header</span><span style="color: #66cc66;">)</span> <span style="color: #66cc66;">)</span> <span style="color: #66cc66;">{</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">"Email sent to $to!"</span>;
<span style="color: #66cc66;">}</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">{</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">"Error occured while sending email to $to!"</span>;
<span style="color: #66cc66;">}</span> <span style="font-style: italic; color: #808080;">//end if</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre>
<p> </p>
<p>Lưu chương trình vào file <strong>example3.php</strong> và chạy thử. Lần này thì nội dung email nhận được như mong muốn:<br />
<code>A HTML email: <strong>bold</strong>, <em>italic</em>, <span style="text-decoration: underline;">underline</span>.</code>.</p>
<p>Như vậy bạn sẽ nhận thấy rằng gởi HTML email cũng đơn giản không khác gì gởi text email thông thường. Chỉ cần thêm 1 header <strong>Content-type: text/html</strong> là nội dung email sẽ được hiểu là HTML ngay.</p>
<p><span style="text-decoration: underline;">Lưu ý:</span> Riêng phần tiêu đề (subject) của email vẫn phải là text thông thường! Bạn không thể sử dụng mã HTML trong phần tiêu đề (subject) của email được. Vì thực chất phần tiêu đề của email cũng là 1 header đặt biệc chứ không nằm trong phần nội dung chính của email.</p>
<p><strong><span style="color: #009010;">GỞI EMAIL VỚI TIẾNG VIỆT UNICODE</span></strong></p>
<p>Gởi email tiếng Việt Unicode cũng y chang như gởi email HTML vì bản thân HTML đã hỗ trợ Unicode rồi, ta chỉ cần chú ý đặt charset của email cho đúng là được:</p>
<pre class="php"><span style="font-style: italic; color: #808080;">//nội dung file example3.php</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #0000ff;">$from</span> = <span style="color: #ff0000;">'from@domain.com'</span>;
<span style="color: #0000ff;">$to</span> = <span style="color: #ff0000;">'to@domain.com'</span>;
<span style="color: #0000ff;">$subject</span> = <span style="color: #ff0000;">'Example 4: Send Unicode email'</span>;
<span style="color: #0000ff;">$message</span> = <span style="color: #ff0000;">'Email tiếng Việt Unicode: &lt;b&gt;in đậm&lt;/b&gt;, &lt;i&gt;in nghiêng&lt;/i&gt;, &lt;u&gt;gạch chân&lt;/u&gt;.'</span>;
<span style="color: #0000ff;">$header</span> = <span style="color: #ff0000;">"Content-type: text/html; charset=utf-8<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>From: $from<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>Reply-to: $from"</span>;
 
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">(</span> <span style="color: #000066;">mail</span><span style="color: #66cc66;">(</span><span style="color: #0000ff;">$to</span>, <span style="color: #0000ff;">$subject</span>, <span style="color: #0000ff;">$message</span>, <span style="color: #0000ff;">$header</span><span style="color: #66cc66;">)</span> <span style="color: #66cc66;">)</span> <span style="color: #66cc66;">{</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">"Email sent to $to!"</span>;
<span style="color: #66cc66;">}</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">{</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">"Error occured while sending email to $to!"</span>;
<span style="color: #66cc66;">}</span> <span style="font-style: italic; color: #808080;">//end if</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre>
<p> </p>
<p>Lưu chương trình vào file <strong>example4.php</strong> và chạy thử: email gởi thành công, tới nơi an toàn và khi đọc thì hiển thị&#8230;tiếng Ả-rập!!! Có gì sai ở đây chăng?</p>
<p>Thực ra không có gì phải lo lắng cả. Khi gởi email tiếng Việt Unicode bạn cần chú ý một số điểm sau:</p>
<ul>
<li>Đặt <strong>charset</strong> cho email. Charset này phải nên trùng với charset của file mã nguồn PHP và website của bạn. Trong ví dụ ở trên, ta đặt charset cho email là <strong>utf-8</strong> thì bạn cũng phải lưu file <strong>example4.php</strong> lên đĩa với charset là utf-8. Bạn xem mục &#8220;LƯU FILE VỚI TIẾNG VIỆT UNICODE&#8221; ở bài viết <a href="http://www.diendantinhoc.net/tute/webdev/php/php_by_examples/start.php">Giới thiệu &#8211; Các bước chuẩn bị cần thiết</a> để tìm hiểu thêm về lưu file mã nguồn PHP lên đĩa với charset utf-8.</li>
<li>Cho dù bạn đã đặt charset đúng rồi, vẫn có thể email không hiển thị đúng tiếng Việt khi đọc! Vì quyền hiển thị email như thế nào là do chương trình email client quyết định. Nếu bạn đọc email bằng Outlook chẳng hạn, thì Outlook sẽ tự động nhận biết charset của email và hiển thị đúng tiếng Việt. Nếu bạn đọc email trên web (như Yahoo, Hotmail&#8230;) thì có thể bạn phải tự tay chọn lại Encoding là utf-8 trên trình duyệt vì các web email như Yahoo, Hotmail sẽ dùng charset mặc định của mình và bỏ qua charset được thiết lập trong email.</li>
</ul>
<p>Và tương tự như khi gởi HTML email, bạn đừng nên ghi tiếng Việt vào phần tiêu đề (subject) của email! Vì như đã nói ở phần trước, tiêu đề (subject) của email cũng là 1 header đặt biệc chứ không nằm trong phần nội dung chính của email.</p>
<p> </p>
<p><strong><span style="color: #009010;">MỘT SỐ LỖI HAY GẶP VỚI HÀM MAIL()</span></strong></p>
<p><strong>Email gởi không tới nơi</strong><br />
Hàm <code>mail()</code> trả về giá trị TRUE, địa chỉ đúng, nội dung đúng, nói chung mọi thứ đều đúng nhưng email chờ hoài không thấy tới! Kiểm tra Bulk email cũng không thấy luôn! Lỗi ở đâu hè? Nguyên nhân có thể xảy ra ở 3 chỗ:</p>
<ul>
<li><strong>mail server</strong> &#8211; server của bạn không cho phép account của bạn gởi email, hoặc giới hạn chỉ cho phép gởi số lượng giới hạn email trong 1 khoảng thời gian nào đó. Bạn cần hỏi người quản lý server của bạn về quyền gởi email với PHP trên server.<br />
Nếu vấn đề không phải nằm ở chỗ server không cho phép bạn gởi email, hoặc chính bạn là người quản lý server thì bạn kiểm tra tiếp 1 trong 2 nguyên nhân sau:</li>
<li><strong>*NIX server</strong> (server chạy các hệ điều hành UNIX hoặc Linux) &#8211; PHP mặc định sẽ sử dụng lệnh <strong>sendmail</strong> có sẵn trên hệ thống để gởi email (với tham số -t -i). Mặc định lệnh sendmail sẽ nằm trong <strong>/usr/sbin/sendmail</strong> hoặc trong 1 thư mục nào đó trong PATH của hệ thống. Nếu trên server của bạn lệnh sendmail nằm ở chỗ khác với thư mục mặc định (ví dụ trên server của bạn sendmail nằm ở /usr/local/secretbin/sendmail) thì bạn có thể làm như sau:<br />
- Tìm và mở file <strong>php.ini</strong> ra.<br />
- Tìm chuỗi &#8220;sendmail&#8221;, bạn sẽ thấy 2 dòng tương tự như sau:<br />
<code><span style="color: #0000ff;">; For Unix only. You may supply arguments as well (default: "sendmail -t -i").<br />
;sendmail_path =</span></code><br />
- Bạn sửa lại 2 dòng đó như sau:<br />
<code><span style="color: #0000ff;">; For Unix only. You may supply arguments as well (default: "sendmail -t -i").</span><br />
<span style="color: #ff0000;">sendmail_path = /usr/local/secretbin/sendmail -t -i</span></code><br />
Nhớ bỏ ký tự chấm phảy (;) ở đầu dòng sendmail_path =!<br />
<span style="text-decoration: underline;">Lưu ý:</span> Cấu hình của PHP tới đây đã đúng và đủ để gởi email trên server *NIX. Tuy nhiên vẫn có thể server không gởi email được! Lỗi lúc này là do bản thân cấu hình của server hoặc quá trình cài đặt và cấu hình chương trình sendmail bị lỗi. Cách kiểm tra nguyên nhân và sửa lỗi nằm ngoài phạm vi của PHP, bạn có thể đặt câu hỏi lên <a href="http://www.vninformatics.com/forum/?action=forum&amp;forum=9" target="_blank">diễn đàn CLB người sử dụng Linux</a> để được giúp đỡ!</li>
<li><strong>Windows server</strong> &#8211; Trên Windows, PHP cần phải dùng 1 SMTP server để gởi email. Bạn tìm và mở file <strong>php.ini</strong> ra, tìm chuỗi sendmail, gần đó bạn sẽ thấy vài dòng như sau:<br />
<code><span style="color: #0000ff;">[mail function]<br />
; For Win32 only.<br />
SMTP = localhost<br />
smtp_port = 25;</span></code><br />
Các dòng trên cho ta biết PHP sẽ dùng SMTP server localhost trên port 25 để gởi email. Rất có thể bạn chưa cài đặt và cấu hình đúng 1 SMTP trên localhost để PHP có thể sử dụng và gởi email. Bạn hãy tham khảo <a href="http://www.diendantinhoc.net/?article=42aeba419d&amp;cat=mail_servers" target="_blank">bài viết này</a> để cài đặt 1 SMTP server trên localhost và dùng nó để gởi email với PHP.</li>
</ul>
<p> </p>
<p><strong>Nội dung email bị đứt đoạn</strong><br />
Nếu bạn nhận được email nhưng nội dung bị đứt đoạn không đầy đủ thì có thể do 2 nguyên nhân sau:</p>
<ul>
<li><strong>Mã HTML trong email bị sai</strong> &#8211; Nếu bạn gởi email HTML thì bạn nên chú ý kiểm tra cú pháp HTML của nội dung email. Giả sử bạn định gởi email với nội dung:<br />
<code>&lt;b&gt;in đậm&lt;/b&gt;</code><br />
Nhưng chẳng may bạn ghi sai thành <code>&lt;b in đậm&lt;/b&gt;</code><br />
thì khi đọc, email sẽ hiển thị bị sai (có thể là mất chữ, đứt đoạn, v.v&#8230;).</li>
<li><strong>Có 1 dòng chứa 1 dấu chấm (.) ở đầu</strong> &#8211; Khi bạn gởi email trên Windows dùng SMTP server, nếu nội dung email có 1 dòng nào đó chứa 1 dấu chấm (ký tự .) ở đầu dòng thì ký tự đó sẽ bị bỏ qua, dòng đó sẽ bị bỏ qua, hoặc toàn bộ nội dung email từ dòng đó trở đi sẽ bị bỏ qua. Lý do là vì dòng chứa 1 dấu chấm ở đầu chính là dấu hiệu báo cho SMTP server biết đã kết thúc nội dung của email. Để khắc phục, trước khi gởi email, ta thay thế dấu chấm ở đầu dòng bằng 2 dấu chấm:<br />
<code>$message = str_replace("\n.", "\n..", $message);</code></li>
</ul>
<p> </p>
<p><strong><span style="color: #009010;">CÁC HÀM PHP ĐƯỢC DÙNG TRONG VÍ DỤ</span></strong></p>
<ul>
<li><strong><a href="http://www.php.net/manual/en/function.mail.php" target="_blank">mail</a></strong>: gởi email.</li>
</ul>
<p><strong><span style="color: #009010;">TÀI LIỆU THAM KHẢO</span></strong></p>
<ul>
<li><strong>PHP Manual</strong>: <a href="http://www.php.net/manual/en/index.php" target="_blank">http://www.php.net/manual/en/index.php</a>
<ul>
<li><strong>Cấu hình và gởi email với PHP</strong>: <a href="http://www.php.net/manual/en/ref.mail.php" target="_blank">http://www.php.net/manual/en/ref.mail.php</a></li>
</ul>
</li>
</ul>
<p>( Trích tại diendantinhoc.net. Tham khảo bài gốc  <a href="http://www.diendantinhoc.net/tute/webdev/php/php_by_examples/basic/tute_send_email.php"><span style="color: #ff0000;">Gởi email text, HTML và tiếng Việt Unicode</span></a> )</p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/11/g%e1%bb%9fi-email-text-html-va-ti%e1%ba%bfng-vi%e1%bb%87t-unicode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kinh nghiệm Rewrite URL ( PHP + Apache + Unix &#8211; linux host)</title>
		<link>http://i-php.net/2009/11/kinh-nghi%e1%bb%87m-rewrite-url-php-apache-unix-linus-host/</link>
		<comments>http://i-php.net/2009/11/kinh-nghi%e1%bb%87m-rewrite-url-php-apache-unix-linus-host/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 06:43:11 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[rewrite url]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=558</guid>
		<description><![CDATA[Rewrite URL như thế nào ?
Có bạn hỏi làm sao tạo được các đường dẫn đẹp (URL Rewrite) như các trang trên mạng. Mình cũng tìm hiểu qua và xung phong viết 1 bài về nó vậy. Trước tiên chúng ta tìm hiểu cơ chế rewite:Rewrite Engine là một phần dịch vụ của Webserver được [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Rewrite URL như thế nào ?</strong></p>
<p>Có bạn hỏi làm sao tạo được các đường dẫn đẹp (URL Rewrite) như các trang trên mạng. Mình cũng tìm hiểu qua và xung phong viết 1 bài về nó vậy. Trước tiên chúng ta tìm hiểu cơ chế rewite:Rewrite Engine là một phần dịch vụ của Webserver được dùng để thay đổi URL(đường dẫn trên trình duyệt) sang một dạng khác với nhiều mục đích khác nhau.</p>
<p>Kỹ thuật được nói đến là URL rewriting và nó đem lại những tiện lợi sau:- Làm cho URL trở nên thân thiện với người dùng cũng như dễ dàng với các Search Engine (bộ máy tìm kiếm)- Tránh lộ các đường link quan trọng- Tránh lộ các công việc bên trong trước người dùng</p>
<p>Bản chất của việc rewrite này các bạn có thể hình dung như sau: khi bạn gõ 1 đường link lên trình duyệt như sau: <a href="http://diachitrangweb.com/news/2007/13/01" target="_blank">http://diachitrangweb.com/news/2007/13/01</a> thì đây là đường dẫn ảo, và khi request đến Webserver nó sẽ đổi lại thành đường dẫn thật như sau: <a href="http://diachitrangweb.com/index.php?mod=news&amp;year=2007&amp;day=13&amp;month=01" target="_blank">http://diachitrangweb.com/index.php?&#8230;ay=13&amp;month=01</a> &lt;&lt; có thể là như thế này vì có nhiều cách rewrite.</p>
<p>Đối với Server Apache: để thực hiện được URL Rewriting bạn làm các bước sau:</p>
<p>1. Kích hoạt mod mod_rewrite có sẵn trong Apache bẳng cách sửa trong file httpd.conf, bạn Find đến dòng chưa rewrite_module rồi bỏ dấu # (nếu có) ở đầu đi. Sau đó restart Apache. Nếu bạn dùng các host trên internet thì có thể đã có sẵn rồi.</p>
<p>2. Tạo 1 file .htacces có nội dung như sau:<br />
Đầu tiên bật Rewrite Engine:<br />
RewriteEngine on<br />
Options +FollowSymlinks<br />
RewriteBase /</p>
<p>Tiếp đến là viết cú pháp RewriteRule:<br />
RewriteRule ^Virtual_Path Real_Path</p>
<p>Ví dụ:<br />
RewriteRule ^topic_([0-9]*).html index.php?topic=$1<br />
ví dụ: topic_1.html thành index.php?topic=1</p>
<p>RewriteRule ^article/([0-9]*)/page/([0-9]*) index.php?article=$1&amp;page=$2<br />
ví dụ: article/1/page/2 thành index.php?article=1&amp;page=2</p>
<p>Cú pháp để viết các Rule này giống như cách viết của biểu thức chính quy Regular Expression. ví dụ như sau:</p>
<p>(.*) nhận tất cả các giá trị.<br />
([0-9]*) chỉ nhận các giá trị là số, từ 0-9.<br />
([a-zA-Z]*) chỉ nhận các giá trị là chữ cái, từ a-z và A-Z.</p>
<p>3. Sau khi tạo được file htaccess bạn copy nó vào thư mục gốc của web của bạn là có thể chạy được.</p>
<p>Đối với Server IIS: các bạn download gói cần thiết về để có thể thực hiện được việc rewrite, các bạn có thể download từ 1 số trang sau:</p>
<p><a href="http://www.micronovae.com/ModRewrite/ModRewrite.html" target="_blank">http://www.micronovae.com/ModRewrite/ModRewrite.html</a><br />
<a href="http://www.qwerksoft.com/products/iisrewrite/" target="_blank">http://www.qwerksoft.com/products/iisrewrite/</a><br />
<a href="http://www.isapirewrite.com/" target="_blank">http://www.isapirewrite.com/</a><br />
<a href="http://www.motobit.com/help/url-replacer-rewriter/iis-mod-rewrite.asp" target="_blank">http://www.motobit.com/help/url-repl&#8230;od-rewrite.asp</a></p>
<p>Ngoài việc sử dụng mod url_rewrite như trên thì nếu host của bạn ko có kích hoạt mod này hoặc bạn ko có quyền để cấu hình nó như trên. Để đơn giản các bạn có thể tạo ra những cách khác nhau để làm cho URL trở nên đẹp và thân thiện hơn. Dưới đây là 1 số cách khác nhau.<br />
c1 dạng như sau: <a href="http://vidu.com/index.php/news/2007/13/01" target="_blank">http://vidu.com/index.php/news/2007/13/01</a> &lt;&lt; Trông rất giống với kiểu rewrite ở trên nhưng nó khác ở chỗ nó là đường dẫn thật còn url rewrite là đường dẫn ảo. Đường dân này hiểu như là 1 request đến file index.php với Query String (Xâu truy vấn) là /news/2007/13/01, các bạn tách xâu này ra rồi sử dụng theo mục đích của mình. Cách này đang được trang web 24h.com.vn sử dụng.<br />
c2 dạng như sau: <a href="http://vidu.com/index.php/news_2007_13_01.html" target="_blank">http://vidu.com/index.php/news_2007_13_01.html</a> &lt;&lt; Gần giống cách 1 ở trên nhưng đường dẫn khác thân thiện với đuôi html, dễ dàng cho các search engine (máy tìm kiếm như Google, Yahoo) tìm kiếm nội dung.<br />
c3 có thể viết như sau: <a href="http://vidu.com/index.php?q=news/2007/13/01" target="_blank">http://vidu.com/index.php?q=news/2007/13/01</a> &lt;&lt; cũng gần giống cách 1 nhưng nó rõ ràng hơn, nó được dùng trong FrameWork Drupal của PHP.<br />
Và có thể có nhiều cách khác nhau các bạn có thể tự nghĩ ra. Hoặc có thể dùng cách mã hoá xâu truy vấn chẳng hạn.</p>
<p>Xem bài gốc tại<span style="text-decoration: underline;"><span style="color: #0066cc;"> <a href="http://diendan.thegioiwebsite.net/showthread.php?t=41">http://diendan.thegioiwebsite.net/showthread.php?t=41</a></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/11/kinh-nghi%e1%bb%87m-rewrite-url-php-apache-unix-linus-host/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>7 khả năng phát sinh lỗi bảo mật khi code PHP</title>
		<link>http://i-php.net/2009/10/7-kh%e1%ba%a3-nang-phat-sinh-l%e1%bb%97i-b%e1%ba%a3o-m%e1%ba%adt-khi-code-php/</link>
		<comments>http://i-php.net/2009/10/7-kh%e1%ba%a3-nang-phat-sinh-l%e1%bb%97i-b%e1%ba%a3o-m%e1%ba%adt-khi-code-php/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 01:26:26 +0000</pubDate>
		<dc:creator>hoangnd</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[php security access data handling database]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=550</guid>
		<description><![CDATA[PHP đem đến sự linh động, tiện dụng và đôi khi là tùy tiện. Điều đó dẫn đến một số các quy tắc bảo mật căn bản sau có thể bị bỏ qua
Kiểm tra dữ liệu đầu vào
Đây là vấn đề cơ bản của căn bản, tránh việc chèn mã độc và giảm tải kha [...]]]></description>
			<content:encoded><![CDATA[<p>PHP đem đến sự linh động, tiện dụng và đôi khi là tùy tiện. Điều đó dẫn đến một số các quy tắc bảo mật căn bản sau có thể bị bỏ qua</p>
<p><strong>Kiểm tra dữ liệu đầu vào</strong></p>
<p>Đây là vấn đề cơ bản của căn bản, tránh việc chèn mã độc và giảm tải kha khá cho server khi không phải xử lý dữ liệu không mong muốn.</p>
<p><strong>Hạn chế truy cập</strong></p>
<p>Đối với các trang cho phép những thao tác can thiệp vào website ở các khía cạnh giao diện, hệ thống, db hay bất cứ cấu hình nào thì luôn phải được đảm bảo mức độ an toàn cao nhất. Cơ bản của căn bản nữa là phải kiểm tra bất cứ request nào của người dùng, thay vì chỉ phân quyền đơn giản.</p>
<p><strong>Hạn chế sử dụng session ID đối với các dữ liệu nhạy cảm</strong></p>
<p>Ví dụ như số thẻ tín dụng hay các thông tin cá nhân, đổi mật khẩu &#8230; việc chỉ kiểm tra sessionID mới là xác thực vòng ngoài thôi. Không nên đặt niềm tin quá vào nó.</p>
<p><strong>SQL injections</strong></p>
<p>Sự tiện lợi của PHP đem đến cho người phát triển khả năng tương tác database nhanh chóng, dễ dàng. Do đó, sự cẩu thả của người viết code khi để lạc các ký tự &#8216;không sạch&#8217; vào câu query sẽ dẫn đến hậu quả khôn lường. Các framework hầu hết loại bỏ khả năng này, và nó cũng không còn phổ biến, nhưng vẫn xuất hiện nhiều nếu không cẩn thận.</p>
<p><strong>Thông báo lỗi hệ thống</strong></p>
<p>Nếu vì lý do gì đó mà website của bạn dừng hoạt động, hãy đảm bảo là các thông báo cho người dùng sẽ không thể hiện những thông tin nhạy cảm như connection error, db, webserver hay nặng nhất là câu query db. Hãy chắc chắn có một câu thông báo chuẩn cho toàn bộ website khi đi vào vận hành.</p>
<p><strong>Xử lý dữ liệu nhận từ phía người dùng</strong></p>
<p>Hãy đảm bảo đó là những dữ liệu &#8217;sạch&#8217; và có ý nghĩa, nếu không sẽ dẫn đến nhiều vấn đề ở trên.</p>
<p><strong>Cấu hình</strong></p>
<p>Nếu có quyền truy cập, hãy xác lập các thông số của PHP &amp; webserver đảm bảo an toàn, hiệu quả &amp; tối ưu.</p>
<p>nguồn: http://articles.sitepoint.com/article/php-security-blunders/2    (nhớ vào đọc cho có cả vd rõ ràng)</p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/10/7-kh%e1%ba%a3-nang-phat-sinh-l%e1%bb%97i-b%e1%ba%a3o-m%e1%ba%adt-khi-code-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sử dụng plugin chat trong cakephp 1.2</title>
		<link>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-chat-trong-cakephp-12/</link>
		<comments>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-chat-trong-cakephp-12/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 14:07:35 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=545</guid>
		<description><![CDATA[Xin chào các bạn!
Đây là môt plugin do tôi tự viết dựa trên các tính năng chat của livechat. Chương trình livechat tôi tham khảo được viết bằng php, để có thể quản trị được các chức năng tôi thấy có nhiều cái thừa  không cần thiết trong trường hợp của tôi. Tôi đã dựa [...]]]></description>
			<content:encoded><![CDATA[<p>Xin chào các bạn!</p>
<p>Đây là môt plugin do tôi tự viết dựa trên các tính năng chat của livechat. Chương trình livechat tôi tham khảo được viết bằng php, để có thể quản trị được các chức năng tôi thấy có nhiều cái thừa  không cần thiết trong trường hợp của tôi. Tôi đã dựa vào livechat để viết plugin với tính năng tương tự. Plugin này có sử dụng jquery.</p>
<p><strong>Các chức năng chính:</strong></p>
<p>1)  Hiển thị danh sách người chat và danh sách người quản trị đang chat. Tôi tạm gọi là guests và operators.</p>
<p>2) Guest chỉ việc nhập tên và email, sau đó sẽ hiển thị màn hình chat. Operators sẽ thấy trạng thái chát của guest và bắt đầu chat. Một guest có thể do nhiều operators chat.</p>
<p>3) Operators sử dụng luôn bảng users.</p>
<p>3) Các chức năng hoặc động trong cửa sổ window riêng biệt (popup window).</p>
<p>Để sử dụng các bạn <a href="http://i-php.net/chat.zip">download plugin tại đây</a>. (Để hểu rõ hơn về plugin bạn có thể tham khảo tại <a href="http://i-php.net/2009/08/s%E1%BB%AD-d%E1%BB%A5ng-plugin-trong-cakephp-12/">đây</a>)</p>
<p><strong>Cài đặt:</strong></p>
<p>1) Đưa toàn bộ nội dung của plugin chat vào trong app/plugin</p>
<p>2) Bạn chạy file sqlChat trong thu mục app/plugins/chat/config/sql .</p>
<p>3) Copy file chat.ctp trong thu muc app/plugins/chat/views/layout vào trong thu mục app/views/layout.</p>
<p><strong>Sử dụng:</strong></p>
<p>Do các chức năng chat đểu hiển thị ra các cửa sổ riêng biệt. Do vậy ta chỉ việc tạo ra link gọi đến là ok.</p>
<p>Ví dụ:</p>
<pre class="php">&lt;?php
//Hiển thị link để guest mở cửa sổ chat với admin
echo $html-&gt;link('Chat with Amdmin', '/chat/chats/form_guest', array('onclick' =&gt; "window.open('{$html-&gt;url('/chat/chats/form_guest')}','mywin','left=20,top=20,width=460,height=440,toolbar=0,resizable=0'); return false;"));
echo '&lt;br /&gt;';
//Hiển thị link quản trị chat
echo $html-&gt;link('Manager chatting', '/chat/chats/chat_users', array('onclick' =&gt; "window.open('{$html-&gt;url('/chat/chats/chat_users')}','mywin','left=20,top=20,width=460,height=440,toolbar=0,resizable=0'); return false;"));
?&gt;</pre>
<p>Vậy là xong, chúc các bạn vui vẻ <img src='http://i-php.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-chat-trong-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Upload ảnh có đóng dấu bản quyền &#8211; cakephp 1.2</title>
		<link>http://i-php.net/2009/10/upload-%e1%ba%a3nh-co-dong-d%e1%ba%a5u-b%e1%ba%a3n-quy%e1%bb%81n-cakephp-12/</link>
		<comments>http://i-php.net/2009/10/upload-%e1%ba%a3nh-co-dong-d%e1%ba%a5u-b%e1%ba%a3n-quy%e1%bb%81n-cakephp-12/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 05:14:59 +0000</pubDate>
		<dc:creator>tuannh</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=529</guid>
		<description><![CDATA[Đóng dấu cho ảnh thật sự cần thiết khi chúng ta muốn giữ bản quyền cho ảnh đó. Bài viết này sẽ hướng dẫn mọi người làm việc đó một cách dễ dàng. Bắt dầu nào :
Đầu tiên là tạo cơ sở dữ liệu :

CREATE TABLE `images` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY [...]]]></description>
			<content:encoded><![CDATA[<p>Đóng dấu cho ảnh thật sự cần thiết khi chúng ta muốn giữ bản quyền cho ảnh đó. Bài viết này sẽ hướng dẫn mọi người làm việc đó một cách dễ dàng. Bắt dầu nào :<br />
Đầu tiên là tạo cơ sở dữ liệu :</p>
<pre name="code" class="mysql">
CREATE TABLE `images` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`images` VARCHAR( 255 ) NOT NULL
)
</pre>
<p>Vậy là xong bước đầu tiên. Tiếp đến chúng ta sẽ tạo controller / model / views</p>
<p>Đầu tiên là controller : app/controllers/images_controller.php:</p>
<pre name="code" class="php">
&lt;?php
class ImagesController extends AppController
{
var $name = 'Images';
var $components = array('Upload');

function add()
{
if(! empty ($this-&gt;data))
{
$this-&gt;Image-&gt;create ();
if($this-&gt;Upload-&gt;upload ($this-&gt;data['Image']['image'], WWW_ROOT . 'img' . DS))
{
$this-&gt;data['Image']['images'] = $this-&gt;data['Image']['image']['name'];
}
if($this-&gt;Image-&gt;save ($this-&gt;data))
{
$this-&gt;Session-&gt;setFlash (__ ('The Image has been saved', true));
$this-&gt;redirect ($this-&gt;referer());
}else
{
$this-&gt;Session-&gt;setFlash (__ ('The Image could not be saved. Please, try again.', true));
}
}
}
}
?&gt;</pre>
<p>Tiếp đến là model : app/models/image.php</p>
<pre name="code" class="php">
&lt;?php
class Image extends AppModel {
var $name = 'Image';
}
?&gt;</pre>
<p>Cuối cùng là views : app/views/images/add.ctp</p>
<pre name="code" class="php">
&lt;div class="images form"&gt;
&lt;?php $session-&gt;flash();?&gt;
&lt;?php echo $form-&gt;create('Image', array('type' =&gt; 'file')); ?&gt;
&lt;fieldset&gt;
&lt;legend&gt;&lt;?php __('Add image');?&gt;&lt;/legend&gt;
&lt;div class="group"&gt;
&lt;div&gt;&lt;?php __('Image');?&gt;&lt;/div&gt;
&lt;div&gt;&lt;?php echo $form-&gt;file('image',array('label'=&gt;'',)); ?&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/fieldset&gt;
&lt;?php echo $form-&gt;end('add');?&gt;
&lt;/div&gt;</pre>
<p>Để có thể upload được ảnh ta sẽ sử dụng  components. Ở đây ta sẽ tạo 1 file có tên là upload.php trong components</p>
<p>app/controllers/components/upload.php</p>
<pre name="code" class="php">
&lt;?php
class UploadComponent extends Object {
function upload(&amp;$file, $dir) {
$return = false;
// current time in miliseconds
$time = microtime ( 1 ) * 1000;
$file['name']=md5($time).$file['name'];

if(@move_uploaded_file($file['tmp_name'],$dir.$file['name']))
{
//Dòng này là ảnh sẽ được upload
$main_img         = $dir.$file['name']; // main big photo / picture

//Dòng này là ảnh sẽ đóng dấu lên ảnh được upload
$watermark_img    = "watermark.gif"; // use GIF or PNG, JPEG has no tranparency support
$padding         = 3; // distance to border in pixels for watermark image
$opacity        = 100;    // image opacity for transparent watermark

$watermark     = imagecreatefromgif($dir.$watermark_img); // create watermark
$image         = imagecreatefromjpeg($main_img); // create main graphic

if(!$image || !$watermark) die("Error: main image or watermark could not be loaded!");

$watermark_size     = getimagesize($dir.$watermark_img);
$watermark_width     = $watermark_size[0];
$watermark_height     = $watermark_size[1];

$image_size     = getimagesize($main_img);
$dest_x         = $image_size[0] - $watermark_width - $padding;
$dest_y         = $image_size[1] - $watermark_height - $padding;

// copy watermark on main image
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $opacity);

// print image to screen
header("content-type: image/jpeg");
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
$return = true;
}
return $return;
}
}
?&gt;</pre>
<p>file ảnh watemark.gif được đặt trong thư mục : app/webroot/img/watermark.gif.</p>
<p>Muốn cho ảnh watermark.gif mờ đi thì ta chỉ việc chỉnh độ opacity là được.</p>
<p>Bạn có thể download file ảnh watermark.gif tại <a href="http://www.cafewebmaster.com/demo/image-watermark/watermark.gif">đây</a></p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/10/upload-%e1%ba%a3nh-co-dong-d%e1%ba%a5u-b%e1%ba%a3n-quy%e1%bb%81n-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sử dụng plugin Paypal IPN trong CakePHP</title>
		<link>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-paypal-ipn-trong-cakephp/</link>
		<comments>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-paypal-ipn-trong-cakephp/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 13:18:39 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=516</guid>
		<description><![CDATA[Xin chào mọi người!
Plugin paypal IPN này thật sự cần thiết cho những ai muốn sử dụng Paypal IPN trong cakephp. Tôi đã tìm kiếm trên mạng và sử dụng plugin này, thấy thật sự mang lại tiện ích rất lớn. Helper trong plugin sẽ giúp ta dẽ dàng tạo ra các nút Checkout, Add [...]]]></description>
			<content:encoded><![CDATA[<p>Xin chào mọi người!</p>
<p>Plugin paypal IPN này thật sự cần thiết cho những ai muốn sử dụng Paypal IPN trong cakephp. Tôi đã tìm kiếm trên mạng và sử dụng plugin này, thấy thật sự mang lại tiện ích rất lớn. Helper trong plugin sẽ giúp ta dẽ dàng tạo ra các nút <em>Checkout, Add to Cart, Subscribe, và Donate </em> một cách dễ dàng. Chức năng chính của plugin này là tạo ra các nút add to cart, subscribe &#8230; trong paypal để gửi thông tin lên paypal, thực hiện giao dịch và lưu trữ dữ liệu giao dịch trả về vào trong log và CSDL. (Cách sử dụng plugin bạn tham khảo tại <a href="http://i-php.net/2009/08/s%E1%BB%AD-d%E1%BB%A5ng-plugin-trong-cakephp-12/">đây</a>).</p>
<p><strong>Paypal IPN plugin.  (Paypal Instant Payment Notification)</strong><br />
<strong>Version 1.4</strong><br />
<strong>Tác giả:</strong> Nick Baker (nick@webtechnick.com)</p>
<p><strong>Website:</strong> <a href="http://www.webtechnick.com/">http://www.webtechnick.com</a></p>
<p>Browse, Download, hoặc  Checkout Plugin.<br />
<strong>Browse:</strong> <a href="http://projects.webtechnick.com/paypal_ipn">http://projects.webtechnick.com/paypal_ipn</a><br />
<strong>Download:</strong> <a href="http://projects.webtechnick.com/paypal_ipn.tar.gz">http://projects.webtechnick.com/paypal_ipn.tar.gz</a><br />
<strong>SVN:</strong> <a href="https://svn2.xp-dev.com/svn/nurvzy-paypal-ipn">https://svn2.xp-dev.com/svn/nurvzy-paypal-ipn</a></p>
<p>Các bước cài đặt như sau:</p>
<p>1) Copy plugin vào trong project /app/plugins/paypal_ipn.</p>
<p>2) Import file  /plugins/paypal_ipn/paypal_ipn.sql vào trong cơ sở dữ liệu.</p>
<p>3) Thêm những dòng dưới đây vào router: /app/config/routes.php fil</p>
<pre class="php" name="code">&lt;?php
  /* Paypal IPN plugin */
  Router::connect('/paypal_ipn/process', array('plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'process'));

  /* Optional Routes, but nice for administration */
  Router::connect('/paypal_ipn/edit/:id', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'edit'), array('id' =&gt; '[a-zA-Z0-9\-]+', 'pass' =&gt; array('id')));
  Router::connect('/paypal_ipn/view/:id', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'view'), array('id' =&gt; '[a-zA-Z0-9\-]+', 'pass' =&gt; array('id')));
  Router::connect('/paypal_ipn/delete/:id', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'delete'), array('id' =&gt; '[a-zA-Z0-9\-]+', 'pass' =&gt; array('id')));
  Router::connect('/paypal_ipn/add', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'edit'));
  Router::connect('/paypal_ipn', array('admin' =&gt; true, 'plugin' =&gt; 'paypal_ipn', 'controller' =&gt; 'instant_payment_notifications', 'action' =&gt; 'index'));/*
  /* End Paypal IPN plugin */
?&gt;</pre>
<p>Router này sẽ chuyển cách gọi các controller và action trong plugin này về cách gọi thông thường. (nhìn code bạn sẽ hiểu ngay !^_^! )</p>
<p>Tạo tài khoản paypal:</p>
<p>Để sự dụng được plugin này bạn phải có một tài khoản paypal (tham khảo cách tạo tài khoản paypal tại <a href="http://www.epayvn.info/2007/10/paypal-cho-ngi-vit-nam.html">đây</a>). Với các lập trình viên, paypal có hỗ trợ cho việc tạo tài khoản ảo để test, địa chỉ <a href="https://developer.paypal.com/">https://developer.paypal.com</a>. Khi tạo xong tài khoản, bật (enable) IPN trong tài khoản của bạn.</p>
<p>Sử dụng trong administator (tùy chọn): đây là trường hợp bạn thêm và lưu thông tin thông qua giao diện admin</p>
<p>1) Bạn phải đăng nhập vào trong phần quản trị với tài khoản administrator thông qua component Auth.</p>
<p>2) Sử dụng plugin tại <a href="http://www.yoursite.com/paypal_ipn">http://www.yoursite.com/paypal_ipn</a></p>
<p>Sự dụng helper paypal (tùy chọn): Trong trường hợp bạn muốn sử dụng helper hoặc các button trong helper.</p>
<p>1) Cấu hình lại với thông tin của bạn tại  /paypal_ipn/config/paypal_ipn_config.php</p>
<p>2) Thêm &#8216;PaypalIpn.Paypal&#8217; vào trong danh sách helper của app_controller.php:</p>
<pre class="php" name="code">&lt;?php
       var $helpers = array('Html','Form','PaypalIpn.Paypal');
?&gt;</pre>
<p>3) cách sử dụng (tham khảo thêm tại /paypal_ipn/views/helpers/paypal.php)</p>
<p>$paypal-&gt;button(String tittle, Options array);</p>
<p>ví dụ:</p>
<pre class="php" name="code">&lt;?php
//Pay Now Button
echo $paypal-&gt;button('Pay Now', array('amount' =&gt; '12.00', 'item_name' =&gt; 'test item'));
//Pay Now Button with Image
echo $paypal-&gt;button('pay_now.jpg', array('amount' =&gt; '12.00', 'item_name' =&gt; 'test item'));

//Subscribe Button
echo $paypal-&gt;button('Subscribe', array('type' =&gt; 'subscribe', 'amount' =&gt; '60.00', 'term' =&gt; 'month', 'period' =&gt; '2'));

//Donate Button
echo $paypal-&gt;button('Donate', array('type' =&gt; 'donate', 'amount' =&gt; '60.00'));

//Add To Cart
echo $paypal-&gt;button('Add To Cart', array('type' =&gt; 'addtocart', 'amount' =&gt; '15.00'));
?&gt;</pre>
<p>Ta cũng có thể thêm một số thuộc tính Paypal hợp lệ vào trong options của button.</p>
<p>Ví dụ :</p>
<pre class="php" name="code">&lt;?php echo $paypal-&gt;button('Pay Now', array('amount' =&gt; '12.00', 'item_name' =&gt; 'Stuff', 'return' =&gt; 'http://www.yoursite.com/thankyou')); ?&gt;</pre>
<p>Ngoài việc sử dụng các helper button đẻ tạo ra các button paypal ta còn có thể tạo ra thông các các thẻ html. Khi sử dụng thẻ form html ta phải sử dụng notify_url để gán tới <span style="color: #000000;">http://www.yoursite.com/paypal_ipn/process</span><br />
ví dụ:</p>
<pre class="php" name="code">&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;
...
...
&lt;input type="hidden" name="notify_url" value="http://www.yoursite.com/paypal_ipn/process" /&gt;
...
&lt;/form&gt;</pre>
<p>Khi thông tin giao dịch được trả về từ paypal, dữ liệu sẽ được lưu vào trong cơ sở dữ liệu và hàm afterPaypalNotification sẽ được gọi (nếu nó tồn tại). Đây sẽ là nơi bạn xử lý các thao tác login khác liên quan đến giao dịch sau khi giao dịch thành công.</p>
<p>Tạo ra function trong /app/app_controller.php như sau:</p>
<pre class="php" name="code">&lt;?php
  function afterPaypalNotification($txnId){
    //Here is where you can implement code to apply the transaction to your app.
    //for example, you could now mark an order as paid, a subscription, or give the user premium access.
    //retrieve the transaction using the txnId passed and apply whatever logic your site needs.

    $transaction = ClassRegistry::init('PaypalIpn.InstantPaymentNotification')-&gt;findById($txnId);
    $this-&gt;log($transaction['InstantPaymentNotification']['id'], 'paypal');

    //Tip: be sure to check the payment_status is complete because failure transactions
    //     are also saved to your database for review.

    if($transaction['InstantPaymentNotification']['payment_status'] == 'Completed'){
      //Yay!  We have monies!
    }
    else {
      //Oh no, better look at this transaction to determine what to do; like email a decline letter.
    }
  }
?&gt;</pre>
<p>Chú ý:</p>
<p>1) Với các bạn chưa lần nào làm về paypal, các bạn có thể tìm hiểu qua về cách tạo một trang web trực tuyển qua paypal một cách đơn giản tại <a href="http://cdth6lt.com/forum/showthread.php?t=1130">đây</a>. Sau khi làm xong ví dụ này, tôi nghĩ các bạn sẽ hiểu rõ hơn nguyên tắc hoặt động của plugin này.</p>
<p>2) Plugin này hiện tại (version 2.1) theo tôi được biết thì chỉ có hỗ trợ 2 button chính là Paynow và Subscribe. Còn các nút AddToCart&#8230; thì chưa hỗ trợ việc lưu dữ liệu. Hi vọng khi các bạn sử dụng thì đã hỗ trợ đủ.</p>
<p>Chúc các bạn thành công  !^_^!</p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/10/s%e1%bb%ad-d%e1%bb%a5ng-plugin-paypal-ipn-trong-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Note Config Apache</title>
		<link>http://i-php.net/2009/08/note-config-apache/</link>
		<comments>http://i-php.net/2009/08/note-config-apache/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 03:43:36 +0000</pubDate>
		<dc:creator>chaubl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[web server]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=498</guid>
		<description><![CDATA[Cấu hình cho Apache hiển thị file Gzip .
- Cài module mod_defalte.so vào thư mục &#8230;/apache2.2/modules
- Sửa file &#8230;/apache2/conf/httpd.conf enable mod_deflate.so
LoadModule deflate_module modules/mod_deflate.so
- Add MultiViews to Options:
Options Indexes FollowSymLinks MultiViews
- Uncomment AddEncoding:
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
- Comment AddType:
#AddType application/x-compress .Z
#AddType application/x-gzip .gz .tgz
- Để hiển thị file Gzip dưới dạng xml thêm dòng :
AddType [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Cấu hình cho Apache hiển thị file Gzip .</strong></p>
<p>- Cài module mod_defalte.so vào thư mục &#8230;/apache2.2/modules</p>
<p>- Sửa file &#8230;/apache2/conf/httpd.conf enable mod_deflate.so<br />
LoadModule deflate_module modules/mod_deflate.so</p>
<p>- Add MultiViews to Options:<br />
Options Indexes FollowSymLinks MultiViews</p>
<p>- Uncomment AddEncoding:<br />
AddEncoding x-compress .Z<br />
AddEncoding x-gzip .gz .tgz<br />
- Comment AddType:<br />
#AddType application/x-compress .Z<br />
#AddType application/x-gzip .gz .tgz</p>
<p>- Để hiển thị file Gzip dưới dạng xml thêm dòng :<br />
AddType text/xml .gz .tgz</p>
<p>- Khởi động lại Apache:<br />
&#8230;/httpd restart</p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/08/note-config-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
