<?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(); &#187; php</title>
	<atom:link href="http://i-php.net/category/php/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, 26 Feb 2010 07:29:32 +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>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>Phân trang tìm kiếm đầy đủ với cakephp 1.2</title>
		<link>http://i-php.net/2009/07/phan-trang-tim-ki%e1%ba%bfm-d%e1%ba%a7y-d%e1%bb%a7-v%e1%bb%9bi-cakephp-12/</link>
		<comments>http://i-php.net/2009/07/phan-trang-tim-ki%e1%ba%bfm-d%e1%ba%a7y-d%e1%bb%a7-v%e1%bb%9bi-cakephp-12/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 01:12:12 +0000</pubDate>
		<dc:creator>hoanbn</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web server]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[paginator]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=465</guid>
		<description><![CDATA[Chào cả nhà!
Thật không nhớ nổi đây là lần thứ mấy tôi viết bài với tiêu đề phân trang tìm kiếm cho cakephp nữa. Vậy tại sao lại còn có bài viết này nữa. Việc phân trang tìm kiếm với cakephp đã không biết bao nhiêu lần làm tôi đâu đầu rồi. Sau nhiều lần [...]]]></description>
			<content:encoded><![CDATA[<p>Chào cả nhà!</p>
<p>Thật không nhớ nổi đây là lần thứ mấy tôi viết bài với tiêu đề phân trang tìm kiếm cho cakephp nữa. Vậy tại sao lại còn có bài viết này nữa. Việc phân trang tìm kiếm với cakephp đã không biết bao nhiêu lần làm tôi đâu đầu rồi. Sau nhiều lần tìm kiếm các giải pháp, nay tôi cũng đa tìm ra một giải pháp ứng ý trong việc tìm kiếm phân trang với cakephp. Sau đây tôi sẽ chia sẽ với mọi người giải pháp ấy, được minh họa thông qua ví dụ tìm kiếm sản phẩm dưới đây.</p>
<p>Việc đâu tiên là tôi phải tạo csdl. Trong ví dụ này tôi tạo csdl có tên là phantrang:</p>
<p>CREATE DATABASE phantrang;</p>
<p>CREATE TABLE IF NOT EXISTS `products` (<br />
`id` int(4) NOT NULL AUTO_INCREMENT,<br />
`name` varchar(255) DEFAULT NULL,<br />
`model` varchar(255) NOT NULL,<br />
`price` int(16) DEFAULT NULL,<br />
`created` datetime DEFAULT NULL,<br />
`type` enum(&#8216;Loai 1&#8242;,&#8217;Loai 2&#8242;,&#8217;Loai 3&#8242;) DEFAULT NULL,<br />
`description` text NOT NULL,<br />
PRIMARY KEY (`id`)<br />
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;</p>
<p>Vậy là tôi đã tạo xong CSDL, còn việc config để kết nối vào CSDL vừa tạo thì mọi người tự làm nhé. Dữ liệu trong đây thì mọi người tự thêm vào nhé.(^_^).</p>
<p>Công việc tiếp theo là tôi sẽ tạo ra một /app/controllers/products_controllers.php như sau:</p>
<blockquote><p>/*  app/controllers/products_controller.php */</p>
<p>&lt;?php<br />
class ProductsController extends AppController {</p>
<p>var $name = &#8216;Products&#8217;;<br />
var $scaffold;</p>
<p>}<br />
?&gt;</p></blockquote>
<p>Với các chức năng như add, edit, delete trong ví dụ này tôi sẽ dùng chức năng scaffold của cakephp, và quả thật những trường hợp như thế này thì scaffold quá tuyệt vời. Trong bài viết này tôi sẽ chỉ chú trọng vào chức năng tìm kiếm mà thôi. Tiếp đến tôi sẽ tạo một function search trong products_controller như sau:</p>
<blockquote><p>/*  app/controllers/products_controller.php */</p>
<p>&lt;?php<br />
class ProductsController extends AppController {</p>
<p>var $name = &#8216;Products&#8217;;<br />
var $scaffold;</p>
<p><strong> function search() {</strong></p>
<p><strong> }</strong></p>
<p>}<br />
?&gt;</p></blockquote>
<p>Cả nhà chú ý nhé, khi tôi thêm dữ liệu vào thì tôi sẽ copy lại nguyên nội dung của cả trang để mọi người dễ hiểu hơn, chỉ phần nào thêm mới tôi sẽ in đậm lên thôi. Bây giờ tôi sẽ tạo một trang view search như sau app/views/products/search.ctp</p>
<blockquote><p>//  app/view/products/search.ctp</p>
<p>&lt;?php<br />
echo $form-&gt;create(&#8216;Search&#8217;, array(&#8216;url&#8217; =&gt; &#8216;/products/dataSearch&#8217;));<br />
echo $form-&gt;input(&#8216;name&#8217;);<br />
echo $form-&gt;input(&#8216;price&#8217;);<br />
echo $form-&gt;input(&#8216;model&#8217;);<br />
echo $form-&gt;input(&#8216;type&#8217;, array(&#8216;options&#8217; =&gt; array(&#8221; =&gt; &#8221;,&#8217;Loai 1&#8242; =&gt; &#8216;Loại 1&#8242;, &#8216;Loai 2&#8242; =&gt; &#8216;Loại 2&#8242;, &#8216;Loai 3&#8242; =&gt; &#8216;Loai 3&#8242;)));<br />
echo $form-&gt;input(&#8216;description&#8217;);<br />
echo $form-&gt;end(&#8216;Search&#8217;);</p>
<p>?&gt;</p></blockquote>
<p>Phần form search vừa rồi tôi đã đề &#8216;url&#8217; trỏ đến action &#8216;dataSearch&#8217;. Action &#8216;dataSearch&#8217; này trong đây sẽ thực hiện công việc xử lý dữ liệu trong form tìm kiếm và chuyển lên url. Tôi thêm function <strong>dataSearch</strong> trong <strong>products_controller</strong> như sau:</p>
<blockquote><p>/*  app/controllers/products_controller.php */</p>
<p>&lt;?php<br />
class ProductsController extends AppController {</p>
<p>var $name = &#8216;Products&#8217;;<br />
var $scaffold;</p>
<p>function search()<br />
{<br />
}</p>
<p><strong> function dataSearch()<br />
{<br />
// the page we will redirect to<br />
$url['controller'] = &#8216;products&#8217;;<br />
$url['action'] = &#8217;search&#8217;;</strong></p>
<p><strong>// build a URL will all the search elements in it<br />
// the resulting URL will be<br />
// example.com/cake/posts/index/Search.keywords:mykeyword/Search.tag_id:3<br />
foreach ($this-&gt;data as $k=&gt;$v){<br />
foreach ($v as $kk=&gt;$vv){<br />
$url[$k.'.'.$kk]=$vv;<br />
}<br />
}</strong></p>
<p><strong>// redirect the user to the url<br />
$this-&gt;redirect($url, null, true);<br />
}</strong><br />
}<br />
?&gt;</p></blockquote>
<p>Hàm dataSearch sẽ thực hiện chức năng chuyển tòan bộ dữ liệu vừa được gửi (submit) vào trong một mảng và sau đó thông qua hàm &#8216;redirect&#8217; chuyến sang một trang mới. Việc chuyển đến trang nào sẽ được quyết định thông qua 2 biến &#8220;<strong>$url['controller']&#8221; </strong>và &#8220;<strong>$url['action']&#8221; </strong>. Nếu bạn nào chưa hiểu hàm này thực hiện những công việc gì thì các bạn cũng không cần tìm hiểu đâu, vì hàm này sẽ không bào giờ thay đổi cả, chỉ cần thay đổi giá trị 2 biến đó thôi. Cả nhà có thể tạm hiểu là hàm này thực hiện việc chuyển tất cả dữ liệu được submit lên trên url.</p>
<p>Vậy là sau khi hàm dataSearch xử lý xong, sẽ chuyển dữ liệu về action &#8220;search&#8221; trong products_controller. Lúc này sẽ tồn tại một biến mảng &#8220;$this-&gt;passedArgs&#8221; chứa dữ liệu của trang search khi submit. Hay nói đúng hơn biến &#8220;$this-&gt;passedArgs&#8221; chứa các dữ liệu được truyền ở phía trên url và đưa vào thành các mảng tương ứng. Ta sẽ xử lý dữ liệu truyền vào để tạo điều kiện lọc như sau:</p>
<blockquote><p>/*  app/controllers/products_controller.php */</p>
<p>&lt;?php<br />
class ProductsController extends AppController {</p>
<p>var $name = &#8216;Products&#8217;;<br />
var $scaffold;</p>
<p>function search()<br />
{<br />
<strong> $conditions = array();<br />
if (!empty($this-&gt;passedArgs))<br />
{<br />
if (isset($this-&gt;passedArgs['Search.name']))<br />
{<br />
$conditions[]["Product.name LIKE"] = &#8220;%{$this-&gt;passedArgs['Search.name']}%&#8221;;<br />
$this-&gt;data['Search']['name'] = $this-&gt;passedArgs['Search.name'];<br />
}</strong></p>
<p><strong>if (isset($this-&gt;passedArgs['Search.price']))<br />
{<br />
$conditions[]["Product.price "] = $this-&gt;passedArgs['Search.price'];<br />
$this-&gt;data['Search']['price'] = $this-&gt;passedArgs['Search.price'];<br />
}</strong></p>
<p><strong>if (isset($this-&gt;passedArgs['Search.model']))<br />
{<br />
$conditions[]["Product.model"] = $this-&gt;passedArgs['Search.model'];<br />
$this-&gt;data['Search']['model'] = $this-&gt;passedArgs['Search.model'];<br />
}</strong></p>
<p><strong>if (isset($this-&gt;passedArgs['Search.type']))<br />
{<br />
$conditions[]["Product.type"] = $this-&gt;passedArgs['Search.type'];<br />
$this-&gt;data['Search']['type'] = $this-&gt;passedArgs['Search.type'];<br />
}<br />
}</strong></p>
<p><strong>$this-&gt;paginate = array(&#8216;limit&#8217; =&gt; &#8216;1&#8242;, &#8216;order&#8217; =&gt; &#8216;Product.created DESC&#8217;);<br />
$this-&gt;set(&#8216;products&#8217;, $this-&gt;paginate(&#8216;Product&#8217;, $conditions));</strong><br />
}</p>
<p>function dataSearch()<br />
{<br />
// the page we will redirect to<br />
$url['controller'] = &#8216;products&#8217;;<br />
$url['action'] = &#8217;search&#8217;;</p>
<p>// build a URL will all the search elements in it<br />
// the resulting URL will be<br />
// example.com/cake/posts/index/Search.keywords:mykeyword/Search.tag_id:3<br />
foreach ($this-&gt;data as $k=&gt;$v){<br />
foreach ($v as $kk=&gt;$vv){<br />
$url[$k.'.'.$kk]=$vv;<br />
}<br />
}</p>
<p>// redirect the user to the url<br />
$this-&gt;redirect($url, null, true);<br />
}<br />
}<br />
?&gt;</p></blockquote>
<p>Trong phần controller này ta sẽ thưc hiện phân trang như bình thường trong cakephp, chỉ khác là sẽ có thêm điều kiện tìm kiếm như ở phía trên thôi.</p>
<p>Việc tiếp theo sẽ là hiển thị kết quả tìm kiếm ra trang search. Ta sẽ thêm vào view search như sau:</p>
<blockquote><p>/*  app/views/products/search.ctp */</p>
<p>&lt;?php<br />
echo $form-&gt;create(&#8216;Search&#8217;, array(&#8216;url&#8217; =&gt; &#8216;/products/dataSearch&#8217;));<br />
echo $form-&gt;input(&#8216;name&#8217;);<br />
echo $form-&gt;input(&#8216;price&#8217;);<br />
echo $form-&gt;input(&#8216;model&#8217;);<br />
echo $form-&gt;input(&#8216;type&#8217;, array(&#8216;options&#8217; =&gt; array(&#8221; =&gt; &#8221;,&#8217;Loai 1&#8242; =&gt; &#8216;Loại 1&#8242;, &#8216;Loai 2&#8242; =&gt; &#8216;Loại 2&#8242;, &#8216;Loai 3&#8242; =&gt; &#8216;Loai 3&#8242;)));<br />
echo $form-&gt;input(&#8216;description&#8217;);<br />
echo $form-&gt;end(&#8216;Search&#8217;);</p>
<p>?&gt;</p>
<p><strong>&lt;?php<br />
echo $paginator-&gt;counter(array(<br />
&#8216;format&#8217; =&gt; &#8216;Page %page% of %pages%, showing %current% records out of<br />
%count% total, starting on record %start%, ending on %end%&#8217;<br />
));<br />
?&gt;<br />
&lt;table cellpadding=&#8221;1&#8243; cellspacing=&#8221;0&#8243;&gt;<br />
&lt;tr&gt;<br />
&lt;th&gt;ID&lt;/th&gt;<br />
&lt;th&gt;Name&lt;/th&gt;<br />
&lt;th&gt;Model&lt;/th&gt;<br />
&lt;th&gt;Price&lt;/th&gt;<br />
&lt;th&gt;Created&lt;/th&gt;<br />
&lt;th&gt;Type&lt;/th&gt;<br />
&lt;th&gt;Description&lt;/th&gt;<br />
&lt;/tr&gt;<br />
&lt;?php<br />
foreach ($products as $product)<br />
{<br />
?&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['id']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['name']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['model']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['price']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['created']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['type']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$product['Product']['description']?&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;?php<br />
}<br />
?&gt;<br />
&lt;/table&gt;</strong></p>
<p><strong>&lt;!&#8211; Shows the next and previous links &#8211;&gt;</strong></p>
<p><strong>&lt;?php<br />
$paginator-&gt;options(array(&#8216;url&#8217; =&gt; $this-&gt;passedArgs));<br />
echo $paginator-&gt;prev(&#8216;« Previous &#8216;);<br />
echo $paginator-&gt;numbers();<br />
echo $paginator-&gt;next(&#8216; Next »&#8217;);<br />
?&gt; </strong></p></blockquote>
<p>Trong phần view trên thì dòng quan trọng nhất chính là &#8220;$paginator-&gt;options(array(&#8216;url&#8217; =&gt; $this-&gt;passedArgs));&#8221;. Dòng này có tác dụng là sẽ truyền toàn bộ các tham số trong mảng &#8220;$this-&gt;passedArgs&#8221; lên trên url của các link phân trang trong cake. Như vậy có nghĩa là các điều kiện tìm kiếm sẽ vẫn còn khi mọi người chuyển trang. Vậy là tôi đã thực hiện xong việc phân trang tìm kiếm trong cakephp1.2 rồi. Mọi người vào đọc thấy có gì thấy khó hiểu thì comment vào nhé. Tôi sẽ sửa lại cho dễ hiểu hơn.</p>
<p>Chúc cả nhà vui vẻ với cakephp nhé.</p>
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--></p>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden" />
<p><!--Session data--><br />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
<input id="gwProxy" type="hidden"><!--Session data--></input>
<input id="jsProxy" onclick="jsCall();" type="hidden" />
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/07/phan-trang-tim-ki%e1%ba%bfm-d%e1%ba%a7y-d%e1%bb%a7-v%e1%bb%9bi-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Triển khai Latex</title>
		<link>http://i-php.net/2009/07/deploy-latex/</link>
		<comments>http://i-php.net/2009/07/deploy-latex/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 04:09:14 +0000</pubDate>
		<dc:creator>hoangnd</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Khái niệm]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web server]]></category>
		<category><![CDATA[equotion]]></category>
		<category><![CDATA[latex]]></category>
		<category><![CDATA[math]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=454</guid>
		<description><![CDATA[Sử dụng Latex sẽ đá bay những vấn đề khó khăn gặp phải khi cần hiển thị những công thức toán học như căn bậc n, hàm số, tích phân&#8230; trên website.

Với những yêu cầu hiển thị thông thường trên website, blog, wiki thì định dạng text đã thỏa mãn được gần hết, khó khăn [...]]]></description>
			<content:encoded><![CDATA[<p>Sử dụng Latex sẽ đá bay những vấn đề khó khăn gặp phải khi cần hiển thị những công thức toán học như căn bậc n, hàm số, tích phân&#8230; trên website.</p>
<p><img class="aligncenter" title="math" src="http://ts1.images.live.com/images/thumbnail.aspx?q=863022493012&amp;id=6a02e85a84ce8b5062c72db0024388d5&amp;url=http%3a%2f%2fwww.kaitaia.com%2ffunny%2fg2%2fd%2f8172-2%2fbizarre_math.jpg" alt="" width="145" height="160" /></p>
<p>Với những yêu cầu hiển thị thông thường trên website, blog, wiki thì định dạng text đã thỏa mãn được gần hết, khó khăn ở chỗ những bài viết chuyên ngành toán, lý&#8230; cần thể hiện những công thức tính toán phức tạp thì text hay thậm chí là ảnh cũng pó tay, hhuh? Vậy phải lèm seo?</p>
<p>Đồng thanh hô nèo</p>
<h1 style="text-align: center;"><strong>LaTeX</strong></h1>
<p><span style="text-decoration: underline;"><strong>là gì?</strong></span> không phải word processor, mà là &#8221; <a class="mw-redirect" title="Document markup language" href="http://en.wikipedia.org/wiki/Document_markup_language">document markup language</a> and <a title="Word processor" href="http://en.wikipedia.org/wiki/Word_processor">document preparation system</a> for the <a title="TeX" href="http://en.wikipedia.org/wiki/TeX">TeX</a> <a title="Typesetting" href="http://en.wikipedia.org/wiki/Typesetting">typesetting</a> program. Within the typesetting system, its name is styled as <span class="image"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/LaTeX_logo.svg/48px-LaTeX_logo.svg.png" alt="\LaTeX" width="48" height="20" /></span>&#8221; (-wikipedia).</p>
<p>chào hàng thế thôi, thông tin đầy đủ có ở <a href="http://www.latex-project.org/intro.html" target="_blank">đây</a> và ở <a title="http://en.wikipedia.org/wiki/LaTeX" href="http://en.wikipedia.org/wiki/LaTeX" target="_blank">đây</a> <img src='http://i-php.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><span style="text-decoration: underline;"><strong>để làm gì?</strong></span> tất nhiên là để hỗ trợ gõ &#8211; chuyển đổi &#8211; hiển thị công thức toán học trên website.</p>
<ul>
<li>gõ tức là phải &#8230; tự gõ, cũng có nghĩa là có cú pháp &amp; định dạng riêng, cũng có nghĩa là miễn gõ tùm lum, như vậy là phải học gõ ke ke.</li>
<li>chuyển đổi nôm na như là dịch, dịch đống ký tự mình gõ sang đống gì đó mà máy nó hiểu, mà phải làm cho máy nó hiểu thì nó mới chạy được.</li>
<li>hiển thị đơn giản là show hàng, hàng là cái cục (thường là ảnh) mà máy nó trả về sau khi nó &#8216;chạy&#8217;, nhớ là nó &#8216;chạy&#8217; được thì nó phải hiểu, để nó hiểu thì mình phải ra lệnh, ra lệnh xong phải có thằng nó dịch lệnh mình cho máy <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</li>
</ul>
<p>ví dụ cái,</p>
<ol>
<li>gõ như này đây [code][tex]a^2 + b^2[/tex][/code]</li>
<li>dịch dịch dịch dịch dịch &#8230;. bịch bịch bịch &#8230;</li>
<li>hiển thị cái này <img class="alignnone" title="can bac 2" src="http://www.khuvuc.com/pictures/91dcd1eb2fc092f982e5e87b8685d280_1247109898.png" alt="" width="50" height="15" /></li>
</ol>
<p>eh, ai thèm xài cái này? thì thầy cô giáo, chuyên gia, guru viết bài giảng, blog kỹ thuật hay sinh viên thảo luận trên diễn đàn &#8230; nghe pro^` vãi <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
<p><span style="text-decoration: underline;"><strong>xài ra làm sao?</strong></span> có mới xài được chứ =)). Hiển nhiên là muốn có thì phải lao động <img src='http://i-php.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>bỏ qua các dịch vụ sẵn có, mình đi mua đồ về tự nấu cho nó chủ động &amp; ngon lành. bếp = server, đồ ăn = các gói cài đặt và đầu bếp = ai đang đọc <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
<p><strong>thực hiện nấu nướng</strong></p>
<p>đi chợ nhớ mua các gói sau</p>
<p><strong>ubuntu server</strong></p>
<blockquote><p>[code]sudo apt-get install texlive texmaker[code]</p></blockquote>
<p><strong>centOS 5.x</strong></p>
<blockquote><p>[code]yum install tetex tetex-fonts tetex-dvips tetex-latex ghostscript</p>
<p>yum install ImageMagick[code]<br />
(cài imageMagick nếu chưa có)</p></blockquote>
<p>dung lượng kiếm về khoảng 60 - 200M, chế biến cài đặt xong khoảng 200M <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) <img src='http://i-php.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) vãi hàng, nấu cho cả xóm ăn.</p>
<p>xong rùi thì chiến thôi, kiếm thêm gia vị &amp; bày bàn. giả sử tại VPS này có thư mục tên latex trong /var/www/html. trong đó có 2 thư mục pictures &amp; tmp, quan trọng nữa là 2 file php class.latexrender.php và latex.php. Như vậy là ngon rồi, viết them file demo.php nữa để test thôi, nhớ là phải refer đến 2 file trên.</p>
<p>[bonus]</p>
<p>trên đây là bộ latex render viết bằng code php, tác giả là Benzamin Mayer (http://www.mayer.dial.pipex.com/tex.htm), xài ngon, được làng xóm đánh giá cao. khi sử dụng chỉ cần để ý đến các tham số cơ bản sau trong file latex.php</p>
<ul>
<li>$latexrender_path = "đường dẫn chứa bộ latex render (gồm file class.latexrender.php)";</li>
<li>$latexrender_path_http = "đường dẫn hiển thị website" - phải chính xác để có thể show ảnh công thức được render.</li>
<li>$imageformat = "định dạng ảnh - png hoặc gif" - có nghĩa là phải có thư viện render ảnh trên server, đang xài ImageMagick.</li>
</ul>
<p>[/bonus]</p>
<p><strong>tóm tắt hoạt động </strong></p>
<p>để hình thành công thức, người dùng phải gõ nội dung theo quy tắc định trước của latex. khi dữ liệu gửi đi, regular expression sẽ được gọi để bóc tách các phần chính trong nội dung nhận được để render ra dưới dạng ảnh, lưu vào một vị trí trên server &amp; đặt đường dẫn hiển thị trên website.</p>
<p><strong>tham khảo thêm</strong></p>
<ul>
<li>trang chủ dự án latex: http://www.latex-project.org/guides/</li>
<li>trên wiki: http://en.wikipedia.org/wiki/LaTeX</li>
<li>thư viện của mayer: http://www.mayer.dial.pipex.com/tex.htm</li>
<li>một bài hướng dẫn hay: http://www.linuxjournal.com/article/7870</li>
<li>demo: http://khuvuc.com/demo.php (/var/www/html/latex)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/07/deploy-latex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Liên kết dữ liệu trong CakePHP</title>
		<link>http://i-php.net/2009/07/lien-k%e1%ba%bft-d%e1%bb%af-li%e1%bb%87u-trong-cakephp/</link>
		<comments>http://i-php.net/2009/07/lien-k%e1%ba%bft-d%e1%bb%af-li%e1%bb%87u-trong-cakephp/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 20:31:50 +0000</pubDate>
		<dc:creator>tungnd</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Khái niệm]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=446</guid>
		<description><![CDATA[hello ngày mới&#8230;
hôm nay tôi xin giới thiếu cho những bạn đang và sắp học CakePHP về chức năng liên kết dữ liệu của Cake.
Chắc hẳn các bạn cũng đã biết việc liên kết dữ liệu gồm có 3 loại liên kết : Một &#8211; Một, Một &#8211; Nhiều,  Nhiều &#8211; Nhiều.
Công việc liên kết [...]]]></description>
			<content:encoded><![CDATA[<p>hello ngày mới&#8230;</p>
<p>hôm nay tôi xin giới thiếu cho những bạn đang và sắp học CakePHP về chức năng liên kết dữ liệu của Cake.</p>
<p>Chắc hẳn các bạn cũng đã biết việc liên kết dữ liệu gồm có 3 loại liên kết :<span style="color: #ff0000;"> Một &#8211; Một, Một &#8211; Nhiều,  Nhiều &#8211; Nhiều</span>.</p>
<p>Công việc liên kết này khá phức tạp, làm theo cách thủ công thì ta phải liên kết các bảng dữ liệu với nhau trong cơ sở dữ liệu,điều này thì không khó lắm. Nhưng đâu đầu là ở chỗ sau đó ta phải viết hàng loạt các câu query để join các dữ liệu với nhau, nào là<span style="color: #ff0000;"> Join, Inner Join, Left Join, Right Join</span>&#8230;. Riêng việc nhớ mấy câu lệnh này đã đủ tung thủ rồi chứ đừng nói đến việc nghĩ sao join cho dúng.</p>
<p>Nhưng giờ đây, bạn dùng Cake thì sẽ không phải ghi nhớ những câu lệnh chết tiết ấy, Cake đã làm thay cho bạn công việc đó.</p>
<p>Công việc của bạn bây giờ chỉ là khai báo cho Cake biết bạn định liên kết dữ liệu của bảng nào với bảng nào thôi.</p>
<p>Điều đó được thực hiện trong Models,cụ thể như sau :</p>
<h2><span style="color: #ff0000;"><strong>Liên kết Một &#8211; Một (1-1) :</strong></span></h2>
<p><span style="color: #ff0000;"><span style="color: #000000;">đầu tiên, ta tạo 2 bảng CSDL liên kết với nhau trong MySQL.</span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">sau đó bạn tạo Model User với nội dung như sau :</span></span></p>
<pre class="code" style="display: block;">&lt;?php
class User extends AppModel {
    var $name = 'User';
    var $hasOne = 'Profile';
}
?&gt;</pre>
<p>*Chú ý : tất cả thì chắc bạn đã rõ rồi, chỉ có <span style="color: #800000;"><strong>var $hasOne = &#8216;Profile&#8217;;</strong></span> dòng chắc vẫn mù mờ, tôi giải thích như sau :</p>
<p>-<span style="color: #800000;">$hasOne</span> : câu lệnh liên kết 1-1.</p>
<p>-<span style="color: #800000;">&#8216;Profile&#8217;</span> : tên models chứa bảng liên kết đến.</p>
<p>Tiếp đến, trong Users_controller ta sử dụng câu lệnh :</p>
<pre>&lt;?php
class UsersController extends AppController {
    var $name = 'Users';
    function index()
    {</pre>
<pre>        $this-&gt;set('user',$this-&gt;User-&gt;find());
    }
?&gt;</pre>
<p>Như vậy là khi<span style="color: #800000;"> <strong>debug($user)</strong></span> ta sẽ thấy cấu trúc dữ liệu được gọi như sau :</p>
<pre class="plain">Array
(
    [User] =&gt; Array
        (
            [id] =&gt; 121
            [name] =&gt; hello
            [created] =&gt; 2007-05-01 10:31:01
        )
    [Profile] =&gt; Array
        (
            [id] =&gt; 12
            [user_id] =&gt; 121
            [skill] =&gt; Baking Cakes
            [created] =&gt; 2007-05-01 10:31:01
        )
)</pre>
<h2><span style="color: #ff0000;">Liên kết Một &#8211; Nhiều (1-m) :</span></h2>
<p>Việc đầu tiên cũng vẫn là tạo bảng cơ sở dữ liệu trong MySQL.</p>
<p>Liên kết 1-m có vẻ đặc biệt hơn 2 liên kết còn lại. Ví dụ bạn có 2 bảng CSDL là News và Categories.</p>
<p>Theo logic liên kết thì, 1 category sẽ có nhiều bản ghi new, và 1 bản ghi new chỉ thuộc 1 category. Do đó liên kết sẽ là categories là 1 và news là nhiều.</p>
<p>Trong trường hợp bạn chọn bảng Categories để liên kết thì ta sẽ sử dụng câu lệnh 1-m : <span style="color: #800000;">hasMany.</span></p>
<p><span style="color: #800000;"><span style="color: #000000;">trong Model Category thêm câu lệnh : <strong><span style="color: #800000;">var $hasMany = &#8216;New&#8217;;</span></strong></span></span></p>
<p><span style="color: #800000;"><br />
</span></p>
<pre><span style="color: #800000;"><span style="color: #000000;">&lt;?php
 class Category extends AppModel
 {
 	var $name="Category";
        var $hasMany = 'New';</span></span><span style="color: #800000;">
 <span style="color: #000000;">}
?&gt;
</span></span></pre>
<p><span style="color: #800000;"><span style="color: #000000;">Ngược lại, bạn chon bảng News để liên kết thì sẽ là m-1 : </span></span><span style="color: #800000;">belongsTo.</span></p>
<p><span style="color: #800000;"><span style="color: #000000;">trong Model New thêm câu lệnh : <strong><span style="color: #800000;">var $hasMany = &#8216;Category&#8217;;</span></strong></span></span></p>
<pre><span style="color: #800000;"><span style="color: #000000;">
&lt;?php
 class News extends AppModel
 {
 	var $name="New";
        var $hasMany = 'Category';
 }
?&gt;</span></span></pre>
<p><span style="color: #800000;"><span style="color: #000000;">giải thích về câu lệnh thì cũng như trên, tôi không cần phải nói lại nhé.</span></span></p>
<p><span style="color: #800000;"><span style="color: #000000;">Như vậy, thì bạn sử dụng câu lệnh<br />
</span></span></p>
<pre>$this-&gt;set('category',$this-&gt;Category-&gt;find());</pre>
<p>trong Categories_controller, khi<span style="color: #800000;"> debug($category)</span> bạn sẽ thấy mảng dữ liệu như sau :</p>
<pre class="cake-debug">Array
(
    [Category] =&gt; Array
        (
            [id] =&gt; 11
            [name] =&gt; gia dinh &amp; be
        )

    [News] =&gt; Array
        (
            [0] =&gt; Array
                (
                    [id] =&gt; 54
                    [category_id] =&gt; 11
                    [title] =&gt; bi hai chuyen o vien nhi
                    [pic] =&gt;
                    [content] =&gt; bi hai chuyen o vien nhi
                )

            [1] =&gt; Array
                (
                    [id] =&gt; 53
                    [category_id] =&gt; 11
                    [title] =&gt; khi nao ko nen cho be bu
                    [pic] =&gt;
                    [content] =&gt; khi nao ko nen cho be bu
                )

        )</pre>
<p>)</p>
<p>còn khi bạn sử dụng câu lệnh tương tự trong News_controller thì sẽ có kết quả như sau :</p>
<pre class="cake-debug">Array
(
    [News] =&gt; Array
        (
            [id] =&gt; 61
            [category_id] =&gt; 15
            [title] =&gt; nam hoc moi
            [pic] =&gt; 7b0b5e66db4e6e4e17162cb8eb7248cdimg_hello.jpg
            [content] =&gt;

    * bcbcb
    * truong mam non ban cong huong duong ung dung tin hoc trong giang day

            [lang] =&gt; 0
        )

    [Category] =&gt; Array
        (
            [id] =&gt; 15
            [name] =&gt; thong tin tuyen sinh
            [lang] =&gt; 0
        )

)</pre>
<p>bạn có thể để ý câu lẹnh của Cake hiện ra ở dưới cùng, qua đó bạn có thể thấy, để có được kết quả này Cake đã phải thực hiện bao nhiêu câu query. Thử xem không sử dụng Cake thì bạn sẽ phải vật lộn với 1 mớ <span style="color: #800000;">Select </span>như thế nào ??</p>
<h2><span style="color: #ff0000;">Liên kết Nhiều &#8211; Nhiều (n-m) :</span></h2>
<p><span style="color: #ff0000;"><span style="color: #000000;">Liên kết n-m nếu không có Cake thì ôi thôi, quá phức tạp. Bạn chỉ có thể liên kết n-m với nhau thông qua 1 bảng trung gian. Lấy ví dụ : tôi muốn liên kết bảng Users và bảng Groups với nhau thông qua bảng Groups_Users.</span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Trong bản Group_Users sẽ có Group_id và User_id.</span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Khi này, trong Model ta sẽ phải khai báo thêm câu lệnh để liên kết :<span style="color: #800000;"> <strong>hasAndBelongsToMany.</strong></span></span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #800000;"><span style="color: #000000;">ở models Group :</span></span></span></span></p>
<pre class="cake-debug">&lt;?php
	class Group extends AppModel {
	    var $name = 'Group';
	    var $useTable = 'groups';
	    );
	    var $hasAndBelongsToMany = array(
	            'User' =&gt; array('className' =&gt; 'User',
	                        'joinTable' =&gt; 'groups_users',
	                        'foreignKey' =&gt; 'group_id',
	                        'associationForeignKey' =&gt; 'user_id',
	                        'unique' =&gt; true
	            )
	    );
	}</pre>
<p>?&gt;</p>
<p>tại models User :</p>
<pre>&lt;?php
    class User extends AppModel {
        var $name = 'User';</pre>
<pre>        var $hasAndBelongsToMany = array(
                'Group' =&gt; array('className' =&gt; 'Group',
                            'joinTable' =&gt; 'groups_users',
                            'foreignKey' =&gt; 'user_id',
                            'associationForeignKey' =&gt; 'group_id',
                            'unique' =&gt; true
                )
        );
?&gt;</pre>
<p class="cake-debug">không hề phải quá loằng ngoằng phức tạp tý nào, chỉ với vài dòng code trên 2 bảng Groups và Users đã liên kết n-m với nhau thông qua bảng Groups_users. Việc tiếp theo thì quá đơn giản, bạn lại find() và debug để xem kết quả liên kết thôi :</p>
<p class="cake-debug">-Tại Groups_controller :  <em>$this-&gt;set(&#8216;group&#8217;,$this-&gt;Group-&gt;find());</em></p>
<p class="cake-debug">-&gt; kết quả :</p>
<pre class="cake-debug">Array
(
    [Group] =&gt; Array
        (
            [id] =&gt; 1
            [name] =&gt; Toàn Quyền
        )

    [User] =&gt; Array
        (
            [0] =&gt; Array
                (
                    [id] =&gt; 12
                    [acc] =&gt; tungnd
                    [psword] =&gt; 81379f1d1e62c9a1291708e526f3b062591de0a4
                    [name] =&gt; fdsf
                    [email] =&gt; fds
                    [address] =&gt; ds
                    [active] =&gt; 1
                )

        )</pre>
<p>)</p>
<p>-tại Users_controller :<em> $this-&gt;set (&#8216;user&#8217;, $this-&gt;User-&gt;find());</em></p>
<pre class="cake-debug">Array
(
    [User] =&gt; Array
        (
            [id] =&gt; 12
            [acc] =&gt; tungnd
            [psword] =&gt; 81379f1d1e62c9a1291708e526f3b062591de0a4
            [name] =&gt; fdsf
            [email] =&gt; fds
            [address] =&gt; ds
            [active] =&gt; 1
        )

    [Group] =&gt; Array
        (
            [0] =&gt; Array
                (
                    [id] =&gt; 1
                    [name] =&gt; Toàn Quyền
                )
        )
)</pre>
<p class="cake-debug">Như vậy là tôi đã giới thiệu xong cho bạn 3 loại liên kết dữ liệu trong Cake, việc của bạn bầy giờ là hãy đọc lại, viết lại giống như tôi và biến đổi các câu lệnh find(), vận dụng linh hoạt theo ý mình.</p>
<p class="cake-debug"><span style="color: #ff0000;">Chúc bạn thành công</span><span style="color: #ff0000;">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</span></p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/07/lien-k%e1%ba%bft-d%e1%bb%af-li%e1%bb%87u-trong-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sự tàn lụi của PHP</title>
		<link>http://i-php.net/2009/04/php-down/</link>
		<comments>http://i-php.net/2009/04/php-down/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 09:41:47 +0000</pubDate>
		<dc:creator>hoangnd</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Khái niệm]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ria]]></category>
		<category><![CDATA[web server]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[down]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=404</guid>
		<description><![CDATA[Mặc định rằng các bạn đang đọc bài này là những người làm trong ngành nên tôi sẽ không giải thích hay ghi chú những khái niệm phổ thông. Mặt khác, lý lẽ trong bài viết này chỉ phản ánh quan điểm của cá nhân tôi, không đại diện cho ai hay tổ chức nào [...]]]></description>
			<content:encoded><![CDATA[<p>Mặc định rằng các bạn đang đọc bài này là những người làm trong ngành nên tôi sẽ không giải thích hay ghi chú những khái niệm phổ thông. Mặt khác, lý lẽ trong bài viết này chỉ phản ánh quan điểm của cá nhân tôi, không đại diện cho ai hay tổ chức nào khác.</p>
<p>&#8212;</p>
<p>Lịch sử ngành công nghiệp máy tính &amp; mạng đã chứng minh PHP là một trong số những ngôn ngữ mạnh &amp; linh động nhất trên nền Web và cũng không quá khó để thành thục ở mức phổ thông. Được phát triển và biết đến từ những năm cuối của thập kỷ trước, PHP đã đạt được sự tăng trưởng đáng kinh ngạc so với các ngôn ngữ lập trình khác.</p>
<p> </p>
<div class="wp-caption aligncenter" style="width: 443px"><a href="http://hoang188.net/"><img class=" " title="PHP timeline" src="http://hoang188.net/files/php-timeline.png" alt="PHP Timeline" width="433" height="231" /></a><p class="wp-caption-text">PHP Timeline</p></div>
<p> </p>
<p> </p>
<p>Nhìn biểu đồ trên, ta thấy con đường đi lên của PHP là theo hướng phát triển truyền thống, tức là <strong>Thiết kế -&gt; sử dụng -&gt; chỉnh sửa -&gt; lớn mạnh -&gt; phát triển</strong>. Điều thú vị là cho đến nay, rất nhiều các sản phẩm được phổ biến rộng rãi cũng đi theo con đường trên như các nền tảng .NET, Java hay Linux.</p>
<p>Ta lần lượt điểm qua một số điểm mẫu chốt sau</p>
<p><strong>Vòng đời</strong></p>
<p>Một lần nữa, nhắc lại thế mạnh của PHP trên nền web chính là tốc độ (phát triển &amp; thực thi), nhẹ &amp; dễ học. Bên cạnh đó, do đặc tính mã nguồn mở (theo <a href="http://en.wikipedia.org/wiki/PHP_License">giấy phép PHP</a>) cũng như sự đổi mới về phong cách khi ra đời, PHP sở hữu rất nhiều thứ quý giá</p>
<p> </p>
<ul>
<li>Cộng đồng lớn. Khoản này vô đối. Luôn có những guru sẵn sàng chia sẻ kinh nghiệm &amp; kiến thức, hướng dẫn những người mới và giải đáp thắc mắc.</li>
<li>Thư viện, cả nội tại và mở rộng của PHP, có chứa số lượng function cực lớn được đóng góp bởi những người tình nguyện. Con số vào khoảng 700 buit-in functions và uncountable external functions (hoangnd tính toán).</li>
<li>Framework đa dạng về số lượng cũng như chất lượng, thậm chí đa dạng cả về <span style="text-decoration: underline;">mô hình</span> và <span style="text-decoration: underline;">mục đích sử dụng.</span></li>
</ul>
<p> </p>
<p><strong>Sự mở rộng và phát triển</strong></p>
<p> </p>
<ul>
<li>Khái niệm về namespace. .NET đã có từ lâu, Java cũng có khái niệm package gần tương đương, và bây giờ chúng ta chứng kiến PHP. Đành rằng namespace ra đời với mục đích cơ bản là giúp lập trình viên dễ tổ chức và quản lý code hơn, nhưng với PHP thì tôi cho rằng là một sự ôm đồm. Mặc dù có rất nhiều những giải thích về cách gõ namespace trong PHP, nhưng thực sự là rất khó chấp nhận ký tự &#8220;\&#8221; để phân cách.  <span style="text-decoration: underline;">Thứ nhất</span>  là hơi va chạm với tư tưởng chạy đa nền của PHP vì ký tự &#8220;\&#8221; được dùng phổ biến trong windows để phân tách đường dẫn. <span style="text-decoration: underline;">Thứ hai</span> là có vẻ như PHP đã sử dụng cạn kiệt tài nguyên bàn phím. </li>
<li>PHP cho đến nay đã quá rộng lớn và các lập trình viên dễ dàng tìm được nhiều giải pháp khác nhau cho cùng một bài toán. Điều này thể hiện rất rõ ràng tư tưởng &#8220;open and share&#8221; mà nhờ nó, nhân loại mới có được kho tri thức khổng lồ (không chỉ trong ngành khoa học máy tính mà còn ở tất cả các lĩnh vực khác). Tuy nhiên, hãy nhìn Python làm, bạn có rất ít những cách để xử lý một vấn đề và thường thì những cách đó luôn là cách tốt nhất và dễ dàng nhất cho bạn, đến nỗi bạn chả buồn nghĩ tới hướng khác <img src='http://i-php.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> . Ở phía đối diện, .NET độc quyền gắn chặt với hệ điều hành Window$ của Micro$oft nhưng có sự thống nhất, rõ ràng và ổn định cực tốt (nếu bạn chọn phát triển trên nền tảng này).</li>
</ul>
<p> </p>
<p><strong>Yahoo và facebook xài PHP</strong></p>
<p>Quá đúng, bỏ qua phần backend thì chính những đoạn mã  PHP đã dựng lên bộ mặt yahoo &amp; facebook như bây giờ. Và nó đã chứng minh giá trị của mình khi cả Yahoo &amp; facebook đều đã hoặc đang trở thành những đế chế internet với danh tiếng, lợi nhuận &amp; lượng người dùng cực lớn, chưa kể đến số lượng các dịch vụ kèm theo.</p>
<p>Thế nhưng, trong các đăng báo tuyển dụng, họ luôn muốn <span style="text-decoration: underline;">ưu tiên những ứng viên biết thêm Perl hoặc Python</span> bên cạnh thành thạo PHP (bỏ qua các yêu cầu khác). Câu hỏi đặt ra là, họ (yahoo &amp; facebook) định cho những ứng viên này làm cả ở nền tảng trên &amp; dưới của hệ thống web application? hay họ muốn những ứng viên đó có được <span style="text-decoration: underline;">tư duy ngôn ngữ </span>của perl, python? hay nữa là họ muốn dự phòng và sẵn sàng chuyển đổi sang perl, python? (lol)</p>
<p><strong>Đặc điểm</strong></p>
<p>Một chút hình dung</p>
<p><a href="http://hoang188.net"></a><a href="http://hoang188.net"><img class="alignleft" title="PHP-Python-Flex" src="http://hoang188.net/files/open.png" alt="" width="273" height="296" /></a><br />
<img class="aligncenter" title=".NET" src="http://hoang188.net/files/net-bo.png" alt="" width="292" height="308" /></p>
<p>Có nghĩa lý gì? Ai cũng biết .NET là một nền tảng còn PHP là một ngôn ngữ lập trình, tất nhiên sẽ là không hợp lý nếu so sánh chúng với nhau. Cái tôi muốn đề cập là, với .NET chúng ta có thể sử dụng để lập trình web, windows application, mobile, embedded, cloud &#8230; với sự tách biệt không quá lớn dành cho lập trình viên (tất nhiên môi trường triển khai thì không nói). Còn PHP không thể đứng một mình, nó sẽ kết hợp với các công nghệ khác tạo thành những nền tảng thực thi bài toán, mà chất lượng kết quả bài toán đó phụ thuộc rất nhiều vào kinh nghiệm &amp; kiến thức của kiến trúc sư trưởng dự án. Sợi dây liên kết này tôi cho rằng là kém vững trãi hơn so với .NET</p>
<p>Ngoài ra, mô hình trên còn thể hiện một nội dung khác. Nếu coi mỗi ngôn ngữ là một tập thông tin thì chúng liên kết với nhau qua giao của những tập đó. Có nghĩa là PHP sẽ đứng chung với python, perl, ruby &#8230; Và cũng có nghĩa là tôi sẽ chọn python thay vì PHP để kết hợp với flex. Tức là PHP đã mất đi một người dùng là tôi, ít nhất là trong dự án nào đó.</p>
<p><span style="text-decoration: line-through;">Buồn ngủ quá nên đoạn này viết hơi sơ sài và lung tung, sẽ cập nhật lại sớm thôi</span></p>
<p><span style="font-weight: bold;">Tuy nhiên</span></p>
<p>Các lập trình viên PHP đừng quá buồn và suy nghĩ nhiều làm gì, PHP đã, đang và sẽ luôn làm rất tốt trong phân khúc thị trường của nó. Và trong 1, 2, 3 năm nữa có thể ta có PHP phiên bản 6.0, 6.1, 6.2 &#8230; nhưng rồi nó sẽ phát triển tiếp thành cái gì? Cộng đồng không có nhiều người biết, tôi cá là bạn không biết, còn <span style="color: #800000;">tất nhiên là tôi không biết</span> roài. <img src='http://i-php.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>(just my cent at 3 a.m)</p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2009/04/php-down/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>method chaining php</title>
		<link>http://i-php.net/2008/12/method-chaining-php/</link>
		<comments>http://i-php.net/2008/12/method-chaining-php/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 02:35:45 +0000</pubDate>
		<dc:creator>habogay</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://i-php.net/?p=232</guid>
		<description><![CDATA[Trong một số thư viện của PHP người ta thường dùng method chaining để viết code ngắn gọn và đẹp hơn .
Doctrine là một ORM framework tận dụng triệt để cách viết này , một số khác có thể thấy trong các thư viện của Zend Framework .
Doctrine :




Zend Framework :


$mail = new Zend_Mail();
$mail-&#62;setBodyText('This is [...]]]></description>
			<content:encoded><![CDATA[<p>Trong một số thư viện của PHP người ta thường dùng method chaining để viết code ngắn gọn và đẹp hơn .</p>
<p>Doctrine là một ORM framework tận dụng triệt để cách viết này , một số khác có thể thấy trong các thư viện của Zend Framework .</p>
<p>Doctrine :</p>
<pre class="php" name="code">

<?php
$users = Doctrine_Query::create()
          ->from('User u')
          ->leftJoin('u.Phonenumber p')
          ->execute();
?>
</pre>
<p>Zend Framework :</p>
<pre class="php" name="code">

$mail = new Zend_Mail();
$mail-&gt;setBodyText('This is the text of the mail.')
  -&gt;setFrom('somebody@example.com', 'Some Sender')
  -&gt;addTo('somebody_else@example.com', 'Some Recipient')
  -&gt;setSubject('TestSubject')
  -&gt;send();
</code></pre>
<p>Trong khi cách viết thông thường là :</p>
<pre class="php" name="code">

$mail = new Zend_Mail();
$mail->setBodyText('This is the text of the mail.');
$mail->setFrom('somebody@example.com', 'Some Sender');
$mail->addTo('somebody_else@example.com', 'Some Recipient');
$mail->setSubject('TestSubject');
$mail->send();
</pre>
<p>Rõ ràng sử dụng method chaining đẹp và ngắn gọn hơn nhiều .</p>
<p>để làm được điều này , rất đơn giản . Ở các phương thức cho phép tiếp tục gọi tiếp sẽ return về đối tượng $this .</p>
<pre class="php" name="code">

public function foo() {
  ... do something ...
  return $this;
}
</pre>
<p>lúc này có thể gọi như sau $myobject->foo()->bar()->baz()->bat();</p>
]]></content:encoded>
			<wfw:commentRss>http://i-php.net/2008/12/method-chaining-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
