PHP


28
Apr 08

Export to CSV file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$row[] = 'Column 1';
$row[] = 'Column 2';
$row[] = 'Column 3';
$data .= implode(',', $row)."n"; // Join all values without any trailing commas and add a new line 
 
$row = ''; // We must clear the previous values
$row[] = 'Value of column 1';
$row[] = 'Value of column 2';
$row[] = 'Value of column 3';
$data .= implode(',', $row)."n"; 
 
// Output the headers to download the file
header("Content-type: application/x-msdownload");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $data;

Đại khái cú pháp để có thể export ra file csv là:
- Dòng đầu tiên là tên các cột, đặt trong dấu “…” và phân cách nhau bởi dấu phẩy.
- Các dòng còn lại là các giá trị của cột tương ứng, khi gặp ký tự kết thúc hàng thì sẽ tự động (?) tạo hàng mới.
- Cuối cùng gọi header tương ứng.

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

26
Apr 08

Working with checkbox

Tôi thường hay dùng checkbox trong trường hợp list các record ra & cho phép chọn record tương ứng để xóa. Ngày trước, khi muốn lấy giá trị của các checkbox được chọn, tôi làm như sau:

1
2
3
4
5
6
7
8
9
if(is_array($_POST['checkbox_name'])) {
    $list_selected_id = '';
    foreach($_POST['checkbox_name'] as $key => $val) {
        $list_selected_id .= ','.$val;
    }
 
    $list_selected_id = substr($list_selected_id,1);
    //output will be: 1,2,3,...,n
}

Còn ngày nay, chỉ với 1 dòng đơn giản như sau:

1
$list_selected_id = implode(',', $_POST['checkbox_name']);

Hix, quá ngắn gọn, quá sáng sủa :(

Và thêm 1 điều nữa, tôi thấy Drupal (và các framework khác) thường dùng cách implode mảng để build các câu SQL. Quả thực khi áp dụng đúng lúc đúng chỗ thì phát huy tác dụng khỏi phải bàn cãi :D

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

8
Apr 08

Refer URL

Một kinh nghiệm khá hay khi khần view có liên quan đến permission (login required).

Bình thường tôi code phần này khá ẩu, nếu user truy cập vào 1 page đòi hỏi xác thực (authorized) thì tôi chỉ làm đơn giản là redirect nó sang login form. Nếu nhập đúng user & pass thì lại redirect nó về trang home. Vấn đề là ở đây. Khách hàng yêu cầu là khi login xong, phải trở lại đúng trang trước đó.

Dùng session để giải quyết. Okie, nhưng một số chỗ session chết sặc tiết. Vậy tại sao không đẩy nó lên URL nhỉ? Và nữa, viết thêm 1 cái hàm chuyên kiểm tra đã login hay chưa như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function check_login($uid)
 
{
    global $user,$base_url;
    if(!$user->uid) {
        $preURL = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header('Location: '.$base_url.'/member/login?target='.$preURL);
    }
}
 
function loginProcess() {
   //if login successful
      header('Location: '.$_GET['target']);
   //else set error message or redirect to login
   // code here...
}
[Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

4
Apr 08

Rename script

Đôi khi cần phải đổi tên file hàng loạt trên server. Ngoài cách “đơn giản” nhất, nhanh nhất (túm lại cái gì cũng nhất :D ) là dùng shell script, thì còn cách nữa đó là dùng PHP script để đổi. Không yêu cầu nhiều về permission. Tất nhiên, cái giá phải trả ở đây là tốc độ thực thi ;) Với những thư mục có cỡ vài trăm nghìn file thì….thôi, đừng nên dùng cách này :) )

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
/*
 * Created on Mar 28, 2008
 * Author: Do Nam Khanh
 * Email: donamkhanh@gmail.com
 * File name: rename.php
 *
 */
 
    error_reporting(E_ALL);
    @set_time_limit(0); // No time limit
 
    $f="data.txt";
    $ft=fopen($f,"r");
    if(!$ft) {
        echo "File is empty now.";
        exit;
    }
    else {
       $directory = dir('p');
        while (!feof($ft)) {
            $list=fgets($ft,1000);
            if($list!='') {
                $filename = trim(substr($list,11));
                while (false !== ($temp = $directory->read())) {
                    if ($temp{0}!='.' && $temp{0}!='..') {
                       $temp = trim($temp);
                        if($temp == $filename) {
                            if(!rename("p/$temp", "p/new/$list")) {
                                echo 'Error';
                            }
                        }
                    }
                }
            }
        }
    }
[Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

20
Jan 08

Whois domain version 3.0

Nâng cấp bản 1.0 lên thành 3.0, cho phép quick check theo phần mở rộng của domain.

Một số tính năng mới:

  1. Phần mở rộng có thể tùy biến bằng cách thêm vào trong file list_ext.txt (phân cách nhau bằng ký tự Enter: \n).
  2. Lưu lại các domain đã được check vào file checked_domain.txt.
  3. Tốc độ quick check nhanh (chỉ sử dụng nslookup).

Hàm chính của version lần này chính là hàm quick_checklist_extension

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
98
99
function quick_check($domain,$ext) {if(empty($domain))
 
echo 'You must enter domain name to check.';
 
else
 
{
 
if(!eregi("^([[:alnum:]-])+$",$domain))
 
echo 'Domain name contain alphabet, number & dash character only.';
 
else
 
{
 
$data = popen("(nslookup -timeout=5 -query=ANY -nodef $domain$ext)2>&1","r");
 
$result = '';
 
while (!feof($data))
 
{
 
$result.= fgets($data, 1000);
 
}
 
$find = stripos($result, "can't find");
 
if($find=== false) {
 
echo "<span class="\">$domain$ext</span>  This domain has taken. (<a href="\">whois</a>)";
 
}
 
else
 
echo "<span class="\">$domain$ext</span>  This domain has available."; 		}
 
$fp=fopen("checked_domain.txt","a");
 
fwrite($fp, $domain.$ext."t".date("H:i:s - d/m/Y")."n");
 
fclose($fp);
 
}
 
}
 
function list_extension()
 
{
 
$filename = 'list_ext.txt';
 
$handle = fopen($filename,"r");
 
$data = fread($handle,filesize($filename));
 
$ext = explode("n",$data);
 
$list_ext = '';
 
if(count($ext)!=0) {
 
for($i=0;$i &lt; count($ext);$i++)  {
 
if($i%3==0)
 
      $list_ext.='
 
<input name="ext" type="checkbox" value="'.$ext[$i].'" />'.$ext[$i].'';
 
else
 
       $list_ext.='
 
<input name="ext" type="checkbox" value="'.$ext[$i].'" />'.$ext[$i].'';
 
}
 
return $list_ext.'
 
 
 
Check all ';
 
}
 
else {
 
return '
 
List extension not available. ';
 
}
 
}

Demo: http://donamkhanh.info/lab/ajax/whoisv3

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

31
Dec 07

Get Alexa Rank

Sau mấy hôm làm mấy cái Get Yahoo Avatar, Get Domain, giờ đến thằng Alexa rank.

Thật ra mình muốn làm cái get rank này lâu lắm rồi, từ cái hồi xem cái kết quả này. Nhưng khi bắt tay vào thì gặp khó khăn 1 chút. Alexa “chơi khó” bằng cách sinh ra mấy cái thẻ . Cách này của Alexa hay phết, khi mình copy kết quả rank, paste nó lại ra số linh ta linh tinh. Giờ thì biết tại sao. Nhưng biết là 1 chuyện, làm được lại là 1 chuyện. Googled, thấy quá trời giải pháp. Trong đó có 1 chú cũng giải quyết theo cách của mình (bóc tách, dùng cURL). Nhưng (lại nhưng), Alexa nó có cho tra theo dạng xml thì tại sao lại không dùng nhỉ, bóc tách làm gì cho mệt cơ chứ. Vậy là theo hướng dùng XML

Okie, done!

Demo http://donamkhanh.com/lab/ajax/get_alexa_rank (Alexa chỉ tính rank cho domain chính thôi chứ ko tính cho từng subdomain đâu nha, bác nào nhập blog Yahoo hay Opera thấy rank cao đừng sướng nhá)

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

31
Dec 07

Kiểm tra tên miền .vn (whois domain .vn code)

Việc kiếm 1 PHP whois class quả là rất dễ dàng nhưng để có thể check được các domain của Việt Nam (.vn) thì không phải dễ tìm cho lắm. Có 2 giải pháp để giải quyết bài toán này:

  1. Kiếm cho bằng được 1 whois server có chứa các info về domain .vn
  2. Thông qua 1 trang web khác

Giải pháp 1, các bạn cứ google tiếp.

Giải pháp 2 sẽ là cái mình sẽ trình bày trong entry này.

Để cho dễ hiểu, các bạn hãy nghĩ như thế này: trước tiên ta sẽ chọn website cần “làm thịt” (pavietnam.net, fpt.vn, matbao.net…). Tại sao lại chọn những site trong nước như vậy? Bởi đơn giản, chắc chắn nó whois được domain .vn

Tiếp theo, ta tạo 1 form để gửi dữ liệu về domain cần check ~~> gửi kết quả cho trang web kia ~~> nhận kết quả trả về ~~> bóc tách lại dữ liệu để chỉ lấy những thông tin ta cần hiển thị.

Okie, nói vậy chắc các bạn đã hiểu. Giờ thì chúng ta sẽ cụ thể hóa bằng code (mình sẽ trình bày ngắn gọn, các bạn muốn pro hơn thì có thể nâng cấp thêm: bắt lỗi, hiển thị…)

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
//mã hóa base64 - lừa gà lừa vịt tý cho bọn nó sợ :p
$server = "aHR0cDovL21hdGJhby5uZXQvd2hvaXMuYXNw";  
 
$find1    = 'PHAgY2xhc3M9d2hvaXM+';       //tương tự
$find2 = 'LS0gV2hvaXMgZnJvbQ==';          //như trên
 
//lấy nội dung website (kết quả trả về)
$source = file_get_contents(base64_decode($server)."?domain=".$_POST['txtDomain']);
 
$pos1 = stripos($source, base64_decode($find1));  //tìm chuỗi đánh dấu 1
$pos2 = stripos($source, base64_decode($find2));  //tìm chuỗi đánh dấu 2
 
if ($pos1 !== false &amp;&amp; $pos2 !== false)
{
     echo '
<table border="0" cellspacing="0" cellpadding="0" width="500" align="center">
<tbody>
<tr>
<td>'.$strip1 = substr($source, $pos1, ($pos2-$pos1)).'</td>
</tr>
</tbody></table>
';
}
 
else
      echo 'Có lỗi xảy ra, xem lại thông tin nhập vào!';

Đoạn mã trên sẽ lấy toàn bộ nội dung website mà ta đă “tăm tia” trước đó. Sau bước này bạn phải xác định được chuỗi ký tự mà bạn định lấy làm điểm đánh dấu (tức là chỉ lấy nội dung hiển thị từ đoạn đấy tới đoạn thú 2 mà bạn chỉ định, tránh bê cả website của người ta về) và chuỗi ký tự đánh dấu kết thúc.

Cụ thể hơn, xét ví dụ sau: kết qủa trả về là anh Khánh hiền lắm các bé gái yêu anh ấy đi
giờ ta muốn chỉ muốn lấy “các bé gái“, ta sẽ có chuỗi tìm kiếm 1 là “anh Khánh hiền lắm” và chuỗi kết thúc là “yêu anh ấy đi

Thực hiện hàm stripos ta sẽ có đc vị trí xuất hiện của chuỗi ký tự nhận diện => cắt chuỗi từ vị trí đó đến vị trí thứ (vị trí 2 – vị trí 1) => kết quả.

Vậy có bạn sẽ hỏi, sao ko substr với 1 vị trí cố định đi. Làm vậy không được bởi đơn giản là vì với mỗi domain sẽ có kết quả whois khác nhau, tùy xem chủ sở hữu domain cho hiển thị cái gì ra.

Giờ các bạn có thể bắt tay vào làm rồi đấy. Chúc các bạn thành công ^^

Quên, link demo: http://donamkhanh.com/lab/ajax/whois.html

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

30
Dec 07

Currency converter

If you want to convert from your currency to other currency or else, you can use this utility. It get result from Yahoo Finance (Ask value) so you can trust return value

Technology:

This code is free (GNU license) but if you make money by it, you can share to me, I don’t refuse money :p

For demo: http://donamkhanh.com/lab/ajax/currency_converter

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

29
Dec 07

Get Yahoo avatar – “Lừa đảo”

Trước tiên vào link này: http://donamkhanh.com/lab/ajax/get_ym_avatar

Thử lấy avatar của 1 vài nick xem sao. Chính xác phải không nào? (nick nào không có avatar sẽ hiển thị ảnh mặc định – xấu mù)

Okie!

Giờ bạn vào link này: http://img.msg.yahoo.com/avatar.php?yids=karate_hn1984&format=gif

Thay yids=karate_hn1984 thành nick của bạn, điều gì xảy ra nhỉ :)

Okie!

Lại quay lại trang trước: http://donamkhanh.com/lab/ajax/get_ym_avatar

View source (Ctrl + U trong FF, Ctrl + F3 trong Opr) & xem mấy dòng comment :) )

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