Author Archive for Đỗ Nam Khánh

Stupid IE???

Today, a colleague asked me: “how to download file with docx extension (MS Word 2007) in IE6?” because IE automatic changes the .docx to .zip. I thought to solve this problem very easy by directly link download but I’m wrong :( It seems a IE bug??? So I recommend him that he should use PHP header to output binary content of file.

IE handle stupid or smart in this case?

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Bypass new rapidshare download countdown

Simply drag this link
to your bookmark, when rapidshare counter start, click it once. It will
reset the download counter so you can start downloading without having
to wait for the countdown to finish.

Before download start (for free)

[-]?View Code JAVASCRIPT
1
javascript:document.ff.action = window.location + '#dlt';void(0);

Then on next page when the counting start

[-]?View Code JAVASCRIPT
1
javascript:c=0;void(0);

Source: kaizeku.com

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Create short IDs with PHP - Like Youtube or TinyURL

IDs are often numbers. Unfortunately there are only 10 digits to work with, so if you have a lot of records, IDs tend to get very lengthy. For computers that’s OK. ButOther title options where

  • How to create unique short string IDs with PHP & MySQL
  • Or how to create IDs similar to YouTube e.g. yzNjIBEdyww

I created this function a long time ago. Time to be nice and share. human beings like their IDs as short as possible. So how can we make IDs shorter? Well, we could borrow characters from the alphabet as have them pose as additional numbers…. Alphabet to the rescue!

More is Less - the ‘math’
The alphabet has 26 characters. That’s a lot more than 10 digits. If we also distinguish upper- and lowercase, and add digits to the bunch or the heck of it, we already have (26 x 2 + 10) 62 options we can use per position in the ID.

Now of course we can also add additional funny characters to ‘the bunch’ like - / * & # but those may cause problems in URLs and that’s our target audience for now.

OK so because there are roughly 6x more characters we will use per position, IDs will get much shorter. We can just fit a lot more data in each position.

This is basically what url shortening services do like tinyurl, is.gd, or bit.ly. But similar IDs can also be found at youtube: http://www.youtube.com/watch?v=yzNjIBEdyww

Convert your IDs
Now unlike Database servers: webservers are easy to scale so you can let them do a bit of converting to ease the life of your users, while keeping your database fast with numbers (MySQL really likes them plain numbers ;).

To do the conversion I’ve written a PHP function that can translate big numbers to short strings and vice versa. I call it: alphaID.

The resulting string is not hard to decipher, but it can be a very nice feature to make URLs or directorie structures more compact and significant.

So basically:

  • when someone requests rLHWfKd
  • alphaID() converts it to 999999999999
  • you lookup the record for id 999999999999 in your database

Source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**
 * Translates a number to a short alhanumeric version
 *
 * Translated any number up to 9007199254740992
 * to a shorter version in letters e.g.:
 * 9007199254740989 --> PpQXn7COf
 *
 * specifiying the second argument true, it will
 * translate back e.g.:
 * PpQXn7COf --> 9007199254740989
 *
 * this function is based on any2dec && dec2any by
 * fragmer[at]mail[dot]ru
 * see: http://nl3.php.net/manual/en/function.base-convert.php#52450
 *
 * If you want the alphaID to be at least 3 letter long, use the
 * $pad_up = 3 argument
 *
 * In most cases this is better than totally random ID generators
 * because this can easily avoid duplicate ID's.
 * For example if you correlate the alpha ID to an auto incrementing ID
 * in your database, you're done.
 *
 * The reverse is done because it makes it slightly more cryptic,
 * but it also makes it easier to spread lots of IDs in different
 * directories on your filesystem. Example:
 * $part1 = substr($alpha_id,0,1);
 * $part2 = substr($alpha_id,1,1);
 * $part3 = substr($alpha_id,2,strlen($alpha_id));
 * $destindir = "/".$part1."/".$part2."/".$part3;
 * // by reversing, directories are more evenly spread out. The
 * // first 26 directories already occupy 26 main levels
 *
 * more info on limitation:
 * - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/165372
 *
 * if you really need this for bigger numbers you probably have to look
 * at things like: http://theserverpages.com/php/manual/en/ref.bc.php
 * or: http://theserverpages.com/php/manual/en/ref.gmp.php
 * but I haven't really dugg into this. If you have more info on those
 * matters feel free to leave a comment.
 * 
 * @author    Kevin van Zonneveld <kevin@vanzonneveld.net>
 * @copyright 2008 Kevin van Zonneveld (http://kevin.vanzonneveld.net)
 * @license   http://www.opensource.org/licenses/bsd-license.php New BSD Licence
 * @version   SVN: Release: $Id: alphaID.inc.php 344 2009-06-10 17:43:59Z kevin $
 * @link      http://kevin.vanzonneveld.net/
 * 
 * @param mixed   $in     String or long input to translate     
 * @param boolean $to_num Reverses translation when true
 * @param mixed   $pad_up Number or boolean padds the result up to a specified length
 * 
 * @return mixed string or long
 */
function alphaID($in, $to_num = false, $pad_up = false)
{
    $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $base  = strlen($index);
 
    if ($to_num) {
        // Digital number  <<--  alphabet letter code
        $in  = strrev($in);
        $out = 0;
        $len = strlen($in) - 1;
        for ($t = 0; $t <= $len; $t++) {
            $bcpow = bcpow($base, $len - $t);
            $out   = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
        }
 
        if (is_numeric($pad_up)) {
            $pad_up--;
            if ($pad_up > 0) {
                $out -= pow($base, $pad_up);
            }
        }
    } else { 
        // Digital number  -->>  alphabet letter code
        if (is_numeric($pad_up)) {
            $pad_up--;
            if ($pad_up > 0) {
                $in += pow($base, $pad_up);
            }
        }
 
        $out = "";
        for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) {
            $a   = floor($in / bcpow($base, $t));
            $out = $out . substr($index, $a, 1);
            $in  = $in - ($a * bcpow($base, $t));
        }
        $out = strrev($out); // reverse
    }
 
    return $out;
}
echo alphaID(27101984); //M2IPb
echo alphaID('M2IPb', TRUE);

More features

  • There also is an optional third argument: $pad_up. This enables you to make the resulting alphaId at least X characters long.
  • You can support even more characters (making the resulting alphaID even smaller) by adding characters to the $index var at the top of the function body.

From Kevin van Zonneveld’s blog

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

PHP Fatal error

Trong 1 dự án gặp đến 2 lỗi có thể nói là nghiêm trọng :((

  1. Cannot use object of type __PHP_Incomplete_Class as array
  2. 406 Not Acceptable

Lỗi thứ nhất “thường” xảy ra ở khu vực tương tự như sau:

1
2
3
4
5
6
   $user = isset($_SESSION['user'])?$_SESSION['user']:'';
   if ($user['user_id']<0 || $user['user_id'] == '')
   {
       _redirect('user/login');
   }
   return true;

Phần này (backend) tưởng chừng chả có lỗi gì (tôi làm phần frontend, 1 anh nữa làm phần backend) nhưng thật ra lỗi be bét bởi:

  1. Khi session user chưa được khởi tạo, biến $user sẽ = chuỗi trống
  2. Khi $user là chuỗi rỗng thì $user làm gì có phần tử user_id

Thêm vào nữa, đó là tên biến với tên session bị trùng nhau :( Nếu chạy trên môi trường dev (XAMPP) thì không vấn đề gì xảy ra, nhưng chạy trên môi trường LAMPP (đặc biệt là trên server của Nhân Hòa) thì sẽ bị lỗi Cannot use object of type __PHP_Incomplete_Class as array

Thứ hai, lỗi 406 Not Acceptable. Không hiểu sao khi vào phần cấu hình của website, chỉ có 3 field dạng Wysiwyg editor (FCKeditor), cứ ấn save thì chết (hiện ra trang trắng xóa). Sau khi xem response code, thấy báo 406 mà chả hiểu tại sao lại bị. Toàn những ký tự có thể nói là hợp lệ vậy mà server nó vẫn từ chối là sao? Bí quá, debug bằng cách…test từng editor 1 :”> và nhận thấy rằng nó chết ở editor có chứa ảnh upload lên với đường dẫn dạng như sau: /home/xxx/public_html/uploads. Hình như SA của Nhân Hòa sợ local attack hay sao ấy mà cấm các truy cập kiểu này??? Không biết nữa, chỉ biết là khi tôi thay cái path đó bằng url path thì mọi thứ okie. Đến mệt

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

is_dir vs file_exists

Hôm nay ở cty anh Linh đã hỏi có ai biết hàm kiểm tra thư mục đã tồn tại hay chưa không? (anh ấy đang làm cái liên quan đến theme thì phải :-?). Theo phản xạ tôi bật ngay ra hàm is_dir, ngay lúc đấy chỉ biết hàm is_dir là kiểm tra xem tên truyền vào có phải là thư mục hay không, đúng như tên gọi của hàm: is_dir. Mà dù sao thì phải là thư mục thì mới tồn tại được chứ nhỉ? :D

Còn thằng ku Trường nó bảo dùng hàm file_exists. Lúc đó tôi cũng chẳng biết là file_exists có thể check exists cả file lẫn folder :”> Tuy nhiên cái cần nhấn mạnh ở đây là: tôi đã có lần từng dùng hàm file_exists để kiểm tra sự tồn tại của 1 fileluôn nhận được kết quả FALSE mặc dù file nó nằm chình ình ra đấy nên tôi khá e dè trong việc sử dụng hàm này. Khi phải check sự tồn tại của file hay thư mục thì tôi hay dùng is_fileis_dir.

Lúc đó cũng chí chóe 1 lúc nhưng lý do chính để bảo nên dùng is_dir thì tôi chẳng thế nhớ được. Đang bận làm nên không có thời gian search (nhớ không nhầm thì trong PHPVietnam cũng có nhắc đến => nó đây: http://groups.google.com/group/phpvietnam/browse_thread/thread/88631b0e7cec117/199d1957c9df6e73?lnk=gst&q=file_exists#199d1957c9df6e73)

Bây giờ test thử xem nào:

1
2
3
4
5
6
7
8
9
10
exec('chown mrkhanh test_dir');
 
if( file_exists('test_dir') )
{
    echo 'test_dir is existed.';
}
else 
{
    echo 'test_dir does not exist.';
}

Mới chạy thử trên host (bluehost) thì thấy nó chỉ hiện trang trắng, error 500 :”>
Để hôm nào test trên thằng Ubuntu vậy :-s

Nhưng mà PHP manual nói rồi, chẳng lẽ sai :-”

This function returns FALSE for files inaccessible due to safe mode restrictions. However these files still can be included if they are located in safe_mode_include_dir.

Còn đây là giải thích của anh pcdinh (Phạm Công Định):

file template được up lên với sở hữu của root trong khi apache lại chạy dưới 1 user khác.

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

“Một nghề cho chín còn hơn chín nghề”

Tự nhiên lại nhớ đến blog của Thái nên vào & đọc được 1 bài khá thú vị. Nó đã giúp “chỉnh đốn” lại phần nào tư tưởng của mình trong thời gian khó khăn này :(

người ta nói, cách tốt nhất để ăn một con voi, là ăn một miếng thịt của nó mỗi ngày. ngẫm lại chuyện học, chuyện làm, mình thấy đây là một lời khuyên có lý. tri thức thì bao la vô tận, không thể nào ngày một ngày hai nắm bắt hết được, mà phải có thời gian, kế hoạch và phương pháp.

có thời gian nghĩa là phải kiên nhẫn và tập trung, ví dụ như muốn ăn một con voi, phải dành ra 3 tháng liên tục. có kế hoạch nghĩa là phải biết mình đang ở đâu và phải làm gì tiếp theo, ví dụ như bây giờ là đang ăn cái đầu, tiếp theo sẽ ăn cái mình của con voi.

có phương pháp nghĩa là phải biết lên kế hoạch, làm thế nào để thực thi kế hoạch trong thời gian dự tính, ví dụ như ăn voi thì phải biết cách xẻ thịt nó ra, biết cách ăn, phải biết con voi thì cái gì ngon, cái gì dở, cái gì cần tập trung ăn kỹ, cái gì bỏ đi cũng được.

trong ba yêu cầu này, cái khó nhất là phương pháp. riêng cách (tự) học, thì trường đại học đã dạy, vấn đề ở đây là không biết nên tập trung học cái gì. lúc này thầy cô, bạn bè, những người đi trước…sẽ là những người chỉ đường tốt nhất.

một kinh nghiệm khác mình rút ra được là đối với lĩnh vực tự nhiên, muốn học xa, học sâu, thì phải bắt đầu từ những môn khoa học cơ bản, trong đó toán là bắt buộc.

những năm đầu đại học, mình đã không hiểu được yêu cầu quan trọng này, nên hết sức lơ là trong việc học toán, hậu quả là những ngày này, mình phải bắt đầu học lại các món lẽ ra phải vững rồi.

nhiều lúc mình tự hỏi, học những thứ này có phí thời gian không? trong khi các bạn xung quanh thì đổ xô đi học MBA, thì mình lại ngồi cặm cụi học đại số tuyến tính, học lý thuyết số, học lý thuyết xác suất & thống kê…mình cũng không biết nữa.

dẫu vậy, mình không hiểu được chuyện, chỉ mới làm trong ngành vài năm, mà có một số bạn đã cảm thấy chán, “muốn gác kiếm”, chuyển sang làm kinh doanh hay các vị trí quản lý trung gian, không còn làm kỹ thuật nữa.

mình cũng muốn học về kinh doanh và quản lý, nhưng cái cảm giác chưa nắm vững những kiến thức và kỹ năng nền tảng của cái nghề mình được đào tạo và làm việc bấy lâu nay làm cho mình rất khó chịu.

mỗi lần nghe một bạn lập trình viên kêu chán lập trình sau 3-4 năm làm việc, là mình lại cảm thấy có gì đó rất bứt rứt. kiểu như leo núi, chưa lên đến đỉnh, mà đã vội xuống. đối với mình thì đây mới chính là phí phạm thời gian.

vậy thế nào là lên đến đỉnh, cái gì là nền tảng? mình nghĩ đó là: hiểu hết ngọn ngành và có thể áp dụng tốt những mảng kiến thức của một chương trình đào tạo khoa học máy tính ở các trường đại học.

đây là một nhiệm vụ rất khó, nhưng làm được. làm thế nào thì mình sẽ từ từ trao đổi, dựa trên kinh nghiệm học tập của mình. điều mình muốn nhấn mạnh ở đây là: có cần thiết không?

tôi làm lập trình, thì chỉ cần biết C, Java, .NET hay Ruby, Python là đủ thôi, chứ cần gì phải học về database, operating system hay là networking? tôi làm mạng thì chỉ cần biết TCP/IP, có thêm cái bằng CCNA là tốt rồi, chứ cần gì phải biết lập trình?

kinh nghiệm làm việc của mình cho thấy đây là tư duy sai lầm. biết nhiều hơn bao giờ cũng có lợi, giúp cho công việc đơn giản và dễ dàng hơn rất nhiều

ví dụ một lĩnh vực mà mình biết chắc là nếu học nó, sẽ đem lại nhiều lợi ích, đó là machine learning, nói nôm na là dạy cho máy tính biết cách tự học những kiến thức mới hay nhận dạng được những pattern trong mớ dữ liệu hỗn độn khổng lồ.

cách đây vài năm, mình có mở một công ty, công ty mình có làm một phần mềm chống spam, và phần mềm này chỉ sử dụng một tí xíu kỹ thuật của machine learning thôi, nhưng đã tỏ ra cực kỳ hiệu quả so với các phần mềm không sử dụng kỹ thuật này.

machine learning cũng được đánh giá là kỹ năng số 1 mà bất kỳ nhà tuyển dụng nào cũng muốn ứng viên của họ phải có. cũng phải thôi, với lượng dữ liệu và thông tin khổng lồ được tạo ra mỗi ngày, kẻ nào hiểu được chúng nói gì thì kẻ đó sẽ là người chiến thắng.

quay lại việc các anh kỹ sư máy tính bỏ việc sau khi ra trường vài năm. mình nghĩ đôi khi, chính môi trường làm việc, phải leo cao thì lương nó mới cao, đẩy người ta vào tình thế phải từ bỏ chuyên môn khi chưa đủ độ chín.

mình nghĩ đây cũng là một điểm mà người làm quản lý cần phải chú ý: lương bổng và quyền lợi là một hàm của năng lực và hiệu quả công việc, chứ không phải của chức vụ hay vị trí.

nhìn xung quanh, mình thấy rất khó tìm được ai đó có hơn 10 năm kinh nghiệm làm việc liên tục trong một lĩnh vực kỹ thuật nào đó. cao nhất chỉ là 5 năm.

mình cũng đi làm hơn 5 năm rồi. và mình nghĩ bây nhiêu thời gian chỉ đủ để biết là mình đang thiếu kiến thức và kỹ năng nào, cần phải học thêm cái gì, để làm việc cho tốt hơn.

vả lại, bạn nào cũng học MBA, về làm sếp hết, thì các bạn quản lý ai? những bạn mới ra trường, làm được 3-4 năm khác? rốt cuộc toàn những bạn không có kinh nghiệm và không đủ kiến thức làm việc với nhau.

hậu quả là cái gọi là “nền CNTT VN” toàn phải đi mua đồ của nước ngoài về xài, bởi trong nước không tự sản xuất được, nguyên nhân chính là không có thợ lành nghề. bao nhiêu ngân hàng ở VN sử dụng phần mềm nước ngoài? ngay cả FPT, một công ty tự xem là đi đầu ở VN về công nghệ, nhưng khi thành lập ngân hàng, họ vẫn phải bỏ tiền ra mua phần mềm của Ấn Độ.

nhiều bạn cho rằng, và mình đồng ý, do chúng ta còn non trẻ, chưa có nhiều kinh nghiệm. vậy hà cớ gì khi mới làm việc có vài năm, chưa đâu vào đâu, lại chuyển chuyên môn?

Nguồn: Dương Ngọc Thái’s blog

Vậy nên bây giờ mình sẽ phải lên kế hoạch, đầu tư thời gian, tiền bạc để làm một cái gì đó mới được :((

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

SELECT BINARY trong MySQL

Hôm nay được chị tester thông báo 1 bug: Khi user login thì hệ thống không phân biệt username & password dạng chữ hoa, chữ thường :|

Câu query chỉ đơn giản là:

1
2
3
4
SELECT user_login	
FROM sys_user 
WHERE user_login = '$user_login' 
          AND user_passwd = '$password'

Hóa ra thằng MySQL nó không phân biệt chữ hoa, chữ thường nếu field type là varchar :-s

Cách fix: Có nhiều cách nhưng đơn giản nhất là “ép” về dạng binary để so sánh theo byte

1
2
3
4
SELECT user_login	
FROM sys_user 
WHERE BINARY user_login = '$user_login' 
          AND BINARY user_passwd = '$password'

Nguồn: http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#operator_binary

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Generate data

Trước đây từng hơi bí với việc test performance với lượng dữ liệu lớn vì phía khách hàng họ “gợi ý” là dữ liệu tuy là để test nhưng cũng phải “đẹp” nữa, và họ không thích kiểu tên nhân viên có dạng như: employee 1, employee 2…

Hôm qua chả hiểu lang thang thế nào lại lạc vào trang Generatedata.com :D Quả thật là chỉ riêng việc họ cho mình 5 tùy chọn result type (HTML , Excel, XML, CSV, SQL) mình đã hạnh phúc lắm rồi :X ấy thế mà họ còn cho mình free download, không kèm bất cứ quảng cáo gì hay trail gì cả /:D/

Quá tuyệt >:D<

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Accept only positive number using Jquery

Có thể sử dụng Event Handling hoặc Event Helper. Tất nhiên là sử dụng Event Helper thì ngắn hơn rồi :)

[-]?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
//when key is pressed in the textbox
$("#quantity").keypress(function (e)
{
  //if the letter is not digit then display error and don't type anything
  if( e.which!=8 && e.which!=0 && (e.which<48 || e.which>57))
  {
    //display error message
    $("#errmsg").html("Digits Only").show().fadeOut("slow");
    return false;
  }
});

Mình quen viết thế này hơn:

[-]?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
//when key is pressed in the textbox
$("#quantity").keypress
(
    function (e) {
        //if the letter is not digit then display error and don't type anything
        if( e.which!=8 && e.which!=0 && (e.which<48 || e.which>57)) {
            //display error message
            $("#errmsg").html("Digits Only").show().fadeOut("slow");
            return false;
        }
    }
);

Nguồn: http://roshanbh.com.np/2008/04/textbox-accept-only-numbers-digits.html

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

General Style and Syntax in CodeIgniter

http://codeigniter.com/user_guide/general/styleguide.html

Tạm đặt cái title đã, còn nhiều vấn đề với thằng này :D

PHP Closing Tag
Trong PHP có thể bỏ qua thẻ đóng ?>, điều này tránh được những lỗi vớ vẩn do bị output thừa :D Cái này chuẩn, không có gì phải bàn cả. Tuy nhiên 1 số IDE hơi man mát, phải có thẻ đóng nó mới hightlight code đc :|

Class and Method Naming
Class names should always have their first letter uppercase, and the constructor method should match identically. Multiple words should be separated with an underscore, and not CamelCased. All other class methods should be entirely lowercased and named to clearly indicate their function, preferably including a verb. Try to avoid overly long and verbose names.
Tên các lớp phải viết hoa chữ cái đầu tiên và phải giống với phương thức khởi tạo. Nếu tên lớp chứa nhiều từ thì sẽ được phân cách bởi dấu gạch dưới (underscore: _) và không được viết theo kiểu camelCase (làKiểuNhưThếNày). Các phương thức trong lớp phải viết thường, đặt tên có tính gợi nhớ, rõ ràng, nên có động từ đi kèm. Tránh việc đặt tên quá dài.

Okie, dịch phiên phiến là thế. Đồng ý là viết class xu hướng bây giờ người ta thường viết tên class dạng:

1
2
3
abstract class Zend_Pdf_Element {
   //...
}

Nhưng đấy là viết cho PHP5, dùng __autoload(), khi đó sẽ include từ thằng thư mục Zend, rồi Pdf, xong đến Element. Trong CodeIgniter (CI), khi viết class cần gì phải loằng ngoằng như vậy nhỉ? Cái ví dụ của nó còn chuối nữa :down:

1
2
3
4
5
6
INCORRECT:
class superclass
class SuperClass
 
CORRECT:
class Super_class

Variable Names
Phần này khá hợp lý rồi, không có gì để nói. Nhưng tôi khoái dùng camelCase chỗ này hơn.

Commenting
Chuẩn này quá chuẩn rồi :)>-

Constants
Tương tự trên

TRUE, FALSE, and NULL
Sẽ nói tới ở phần bên dưới.

Logical Operators
Các bác này đề nghị dùng OR thay cho || vì dùng || dễ nhầm với số 11 :lol: Uh nhỉ, cũng giống thật, mấy cái này tôi cũng không để ý nữa, căn bản có thằng IDE lo cho rồi, số và toán tử nó…khác màu nhau :-p
Tôi vẫn quen viết:

1
2
3
if(!$abc) {
    //...
}

giờ bảo viết

1
if ( ! $abc)

chắc tôi không nghe đâu, tự nhiên mất mấy lần gõ phím Space, tốn bao nhiêu Kalo chứ ít à :D

Comparing Return Values and Typecasting
Có lẽ đây là phần hay nhất & thuyết phục nhất bởi cái này không làm nhiều, không va vấp chắc không biết được :)

1
2
3
4
5
INCORRECT:
if (strpos($str, 'foo') == FALSE)
 
CORRECT:
if (strpos($str, 'foo') === FALSE)

Thoáng nhìn hẳn sẽ bảo tự nhiên cho thêm dấu = làm gì? Mất công gõ thêm 1 ký tự nữa :confused: Okie, theo như PHP manual, hàm strpos trong PHP sẽ trả về vị trí của chuỗi cần tìm kiếm trong chuỗi cho trước. Ví dụ nếu chuỗi ban đầu là: Đỗ Nam Khánh, tôi cần tìm từ Đỗ thì sẽ như sau:

1
2
$str = 'Đỗ Nam Khánh';
$pos = strpos($str, 'Đỗ');

Từ Đỗ nằm ở vị trí đầu tiên trong chuỗi (vị trí thứ 0) nên hàm này trả về giá trị 0, $pos = 0;
Vấn đề ở chỗ này đây:

1
2
3
if (strpos($str, 'foo') == FALSE)
sẽ tương đương
if (0 == FALSE)

Và dĩ nhiên, trong lập trình thì 0 là FALSE, khác 0 là TRUE. Vậy là, bác nào xui xẻo thì dính ngay trường hợp chết người này :)

Code Indenting
Chỗ này CI lại bắt ta quay về với kiểu cổ điển (Pascal chẳng hạn), ngày trước tôi cũng viết như vậy nhưng giờ hầu như là viết giống C:

1
2
3
foreach ($arr as $key => $val) {
   // ...
}

Đơn giản là lại bớt được 1 cái enter :”>

Những cái còn lại thì okie, thuyết phục :D

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]