[PHP] Hỏi về hàm addslashes [Archive] – Diễn Đàn Tin Học

View Full Version : [PHP] Hỏi về hàm addslashes

ductinh2405

Chào mọi người, hiện mình đang có vấn đề với hàm addslashes, mình post lên đây hy vọng mọi người hỗ trợ và cùng mình nghiên cứu giải quyết vấn đề này.

Vấn đề đặt ra như sau:

Mọi người đều biết hàm addslashes có tác dụng thêm dấu \ ở trước dấu ‘. VD:

<?php
$a = “It’s John’s car!”;
echo addslashes($a); // Kết quả in ra là: It\’s John\’s car!
?>

Trước khi insert chuỗi vào CSDL thì mình đều dùng hàm addslashes này (Tất cả chuỗi trong bài viết của mình đều có dấu ‘ bên trong). Nếu không dùng hàm này thì insert không được và cho dù được thì khi show ra web sẽ bị lỗi.

Câu hỏi đầu tiên của mình là: Mọi người có dùng hàm addslashes trước khi insert chuỗi vào CSDL giống như mình không? Ngoài cách này thì còn cách lưu trữ chuỗi nào tốt hơn không?

Tiếp theo nữa là vấn đề về “cách đối xử” của host đối với hàm addslashes này. Mình dùng qua nhiều host của nhiều nhà cung cấp khác nhau thì phát hiện ra có sự khác biệt khi dùng hàm này. Một số host khi insert không addslashes thì dữ liệu vẫn vào được, một số lại không (Cùng code, cùng chuỗi insert). Đối với các host bắt buộc addslashes khi insert chuỗi có dấu ‘ thì addslashes($a) theo VD ở trên khi vào CSDL vẫn sẽ là “It’s John’s car!” chứ không phải là “It\’s John\’s car!”. Đối với các host không bắt buộc nhập addslashes thì ngược lại.

Như vậy cùng 1 mã nguồn và up lên 2 host khác nhau thì CSDL sẽ được insert vào khác nhau. 1 có dấu \ và 1 không có dấu \.

Với bản thân mình, khi code web muốn chạy & hiển thị đúng trên mọi host, mình luôn dùng thêm hàm stripslashes mỗi khi select chuỗi từ CSDL ra. Hàm stripslashes sẽ giúp loại bỏ những dấu \ và kết quả hiển thị đúng.

Tuy đã có cách giải quyết nhưng mình nghĩ vẫn chưa tối ưu lắm. Cho nên câu hỏi thứ 2 của mình là: Có cách nào giải quyết để hàm addslashes luôn chạy đúng trên mọi host không? Có hàm nào check xem host đang sử dụng có bắt buộc phải addslashes khi insert chuỗi có dấu ‘ không?

Ok! Hy vọng mọi người tham gia thảo luận cùng mình để code ngày càng tối ưu hơn!

Thanks!

honnhienh

thử nghiên cuu phần mysql_real_escape_string…. gì đó thử bác

dokhacluan

@chu thớt : đọc 1 hồi , suy nghĩ chút , nghĩ ra 1 cách ko bít giúp dc cho chủ thớt không

<?php
$a = “It’s John’s car!”;
$a=str_replace(“‘”,”&apos;”,$a);
echo $a.”<hr>”;
?>

trước khi insert thì replace ký tự ‘ thành “&apos;” ( dạng ký tự đặc biệt trong html )

hoangcn02

Chào mọi người, hiện mình đang có vấn đề với hàm addslashes, mình post lên đây hy vọng mọi người hỗ trợ và cùng mình nghiên cứu giải quyết vấn đề này.

Vấn đề đặt ra như sau:

Mọi người đều biết hàm addslashes có tác dụng thêm dấu \ ở trước dấu ‘. VD:

<?php
$a = “It’s John’s car!”;
echo addslashes($a); // Kết quả in ra là: It\’s John\’s car!
?>

Trước khi insert chuỗi vào CSDL thì mình đều dùng hàm addslashes này (Tất cả chuỗi trong bài viết của mình đều có dấu ‘ bên trong). Nếu không dùng hàm này thì insert không được và cho dù được thì khi show ra web sẽ bị lỗi.

Câu hỏi đầu tiên của mình là: Mọi người có dùng hàm addslashes trước khi insert chuỗi vào CSDL giống như mình không? Ngoài cách này thì còn cách lưu trữ chuỗi nào tốt hơn không?

Tiếp theo nữa là vấn đề về “cách đối xử” của host đối với hàm addslashes này. Mình dùng qua nhiều host của nhiều nhà cung cấp khác nhau thì phát hiện ra có sự khác biệt khi dùng hàm này. Một số host khi insert không addslashes thì dữ liệu vẫn vào được, một số lại không (Cùng code, cùng chuỗi insert). Đối với các host bắt buộc addslashes khi insert chuỗi có dấu ‘ thì addslashes($a) theo VD ở trên khi vào CSDL vẫn sẽ là “It’s John’s car!” chứ không phải là “It\’s John\’s car!”. Đối với các host không bắt buộc nhập addslashes thì ngược lại.

Như vậy cùng 1 mã nguồn và up lên 2 host khác nhau thì CSDL sẽ được insert vào khác nhau. 1 có dấu \ và 1 không có dấu \.

Với bản thân mình, khi code web muốn chạy & hiển thị đúng trên mọi host, mình luôn dùng thêm hàm stripslashes mỗi khi select chuỗi từ CSDL ra. Hàm stripslashes sẽ giúp loại bỏ những dấu \ và kết quả hiển thị đúng.

Tuy đã có cách giải quyết nhưng mình nghĩ vẫn chưa tối ưu lắm. Cho nên câu hỏi thứ 2 của mình là: Có cách nào giải quyết để hàm addslashes luôn chạy đúng trên mọi host không? Có hàm nào check xem host đang sử dụng có bắt buộc phải addslashes khi insert chuỗi có dấu ‘ không?

Ok! Hy vọng mọi người tham gia thảo luận cùng mình để code ngày càng tối ưu hơn!

Thanks!
Bạn có thể tham khảo hàm này get_magic_quotes_gpc để kết hợp với addslashes

ductinh2405

thử nghiên cuu phần mysql_real_escape_string…. gì đó thử bác
@honnhienh: Hi, theo mình biết thì mysql_real_escape_string cũng không khác mấy so với addslashes. Khác nhau cơ bản nhất của 2 hàm này là addslashes chạy trên apache còn mysql_real_escape_string thì đẩy câu lệnh xuống cho mysql xử lý. Dùng mysql_real_escape_string có thể tốc độ câu truy vấn sẽ nhanh hơn, nhưng lại không chống được sql injections bằng addslashes.

trước khi insert thì replace ký tự ‘ thành “&apos;” ( dạng ký tự đặc biệt trong html )
@dokhacluan: Cách của bạn mình cũng từng dùng thử rồi, khá ổn nhưng hơi thủ công và khác lạ thì phải.

<?php
$a = “It’s John’s car!”;
echo str_replace(“‘”, “&apos;”,$a);
?>

@All: Mọi người có ai từng dùng cách như bạn dokhacluan không ạ?

Bạn có thể tham khảo hàm này get_magic_quotes_gpc để kết hợp với addslashes
@hoangcn02: Tuyện lắm! Hàm này mình nghĩ khá tuyệt để giải quyết vấn đề này.

* get_magic_quotes_gpc() sẽ trả về 1 nếu source code nằm trên host không bắt buộc phải addslashes khi insert chuỗi có ‘, ngược lại trả về 0.

Cảm ơn mọi người đã tham gia cùng mình giải quyết các vấn đề. Thống kê lại kết quả của chủ đề này, ta có 2 phương pháp tốt nhất để giải quyết dấu ‘ trong chuỗi trước khi insert vào CSDL:

Cách của bạn dokhacluan: Không dùng hàm addslashes mà đơn giản chỉ dùng hàm str_replace để đổi ‘ thành \’. Cách này có vẻ hơi thủ công nhưng thực tế kết quả tốt và tốc độ xử lý là nhanh nhất.
Cách của bạn hoangcn02: Đây là cách thường dùng của hầu hết các PHP coder. Cách này giải quyết được vấn đề nhưng phải mắc công xét if và code cũng nhiều ký tự hơn nên thời gian thực thi sẽ lâu hơn so với cách của bạn dokhacluan.

Tóm lại:

addslash($a) = str_replace(“‘”, “&apos;”, $a)

str_replace là cách thủ công đơn giản nhất nhưng lại là tối ưu nhất!

thuyduongcd

str_replace là cách thủ công đơn giản nhất nhưng lại là tối ưu nhất!
Đơn giản nhất thì đúng nhưng tối ưu nhất thì chưa chắc vì trong chuỗi không chắc chỉ có ký tự ‘ thôi. Muốn encode như vậy thi dùng htmlspecialchars() vẫn tốt hơn.
Và nếu bạn muốn trở thành coder chuyên nghiệp thì cũng phải tuân thủ quy tắc của coder, vì một mình không thể ôm hết project được mà phải cần cả tập thể. Nếu ai cũng làm theo cách riêng thì làm thế nào nó vận hành được đây.

ductinh2405

Đơn giản nhất thì đúng nhưng tối ưu nhất thì chưa chắc vì trong chuỗi không chắc chỉ có ký tự ‘ thôi. Muốn encode như vậy thi dùng htmlspecialchars() vẫn tốt hơn.
Và nếu bạn muốn trở thành coder chuyên nghiệp thì cũng phải tuân thủ quy tắc của coder, vì một mình không thể ôm hết project được mà phải cần cả tập thể. Nếu ai cũng làm theo cách riêng thì làm thế nào nó vận hành được đây.
@thuyduongcd: Trong bài viết này mình chỉ đề cập đến việc giải quyết dấu ‘ thôi. Hàm htmlspecialchars(Có thêm tham số ENT_QUOTES) và cũng là một trong những cách để giải quyết vấn đề đã đặt ra.

Bản thân mình cũng đang code PHP để mưu sinh, nhưng mình thì luôn đề cao kết quả cho dù để đạt được kết quả đó có thể phải rời xa cách làm truyền thống. Ý kiến của bạn rất phù hợp để coder làm việc nhóm hiệu quả. Tuy nhiên, có lẽ mình sẽ tiếp tục đi theo hướng khác biệt này và hy vọng nó sẽ thành công. Nhóm của mình luôn họp mặt và công bố những gì cần thay đổi trong cách code để project đạt được kết quả như ý nhất mà! ^^

datgs

Câu trả lời nằm ở đây http://i-php.net/2011/02/php-addslashes-co-du-tot-de-chong-sql-injection/. mysql_real_escapse_string là tốt nhất cho các truy vấn với MySQL và tương tự mỗi một database PHP hỗ trợ các kiểu escapse riêng.

Thông điệp của mình là không có cái gì được tạo ra là không có mục đích, đặc biệt là để đối xử với các giải pháp chung. Sử dụng những cái có sẵn bao giờ cũng tốt hơn cái mà bạn tạo ra (nhiều cái đầu đã lao tâm khổ tứ cho vấn đề đó rồi).

ductinh2405

Dùng giải pháp chung thì sẽ rất đỡ đau đầu và tiết kiệm được nhiều thời gian. Tuy nhiên, với những project đặc biệt thì đôi khi phải chịu khó suy nghĩ và làm những điều “khác thường” chút xíu.

datgs

Dùng giải pháp chung thì sẽ rất đỡ đau đầu và tiết kiệm được nhiều thời gian. Tuy nhiên, với những project đặc biệt thì đôi khi phải chịu khó suy nghĩ và làm những điều “khác thường” chút xíu.

Chuẩn, As our cases are new we have to think and act anew :). Tuy nhiên với các sản phẩm dành cho người dùng cuối. Việc đi vòng tiềm ẩn rất nhiều lỗi. Giả sử bạn có 10.000 dòng code đều không sử dụng các giải pháp chung. Trong 10000 dòng đó có khoảng 100 điểm cần giải pháp chung. Bạn sẽ có thể bị khách hàng phàn nàn khoảng 100 lần đấy 😀

Lập trình viên làm việc sáng tạo, chỉ một phần nhỏ thôi. Phần quan trọng là … sử dụng đúng giải pháp.

Còn sáng tạo nên để dành cho việc phát triển các tính năng.

ngoc_viet08

http://php.net/manual/es/function.get-magic-quotes-gpc.php

function conditional_escape ($str)
{
/* Automatic escaping is highly deprecated, but many sites do it
anyway to protect themselves from stupid customers. */
if (get_magic_quotes_gpc())
{
/* Apache automatically escaped the string already. */
return $str;
}
/* Replace the following line with whatever function you prefer
to call to escape a string. */
return mysql_real_escape_string ($str);
}

dùng thử function này đi. khỏi lo nghĩ ngợi j nhiều. nó cũng chính quy luôn. cứ call nó trước khi insert dữ liệu vào db. đã test trên 2 server với magic_quote bật hay ko bật,chạy đều ok.:boxing:

Dùng giải pháp chung thì sẽ rất đỡ đau đầu và tiết kiệm được nhiều thời gian. Tuy nhiên, với những project đặc biệt thì đôi khi phải chịu khó suy nghĩ và làm những điều “khác thường” chút xíu.
vậy bạn làm ngược với lời bản thân nói rồi , vì nhu cầu này cơ bản và ai cũng cần cả 😀

honnhienh

@honnhienh: Hi, theo mình biết thì mysql_real_escape_string cũng không khác mấy so với addslashes. Khác nhau cơ bản nhất của 2 hàm này là addslashes chạy trên apache còn mysql_real_escape_string thì đẩy câu lệnh xuống cho mysql xử lý. Dùng mysql_real_escape_string có thể tốc độ câu truy vấn sẽ nhanh hơn, nhưng lại không chống được sql injections bằng addslashes.

bác đã đọc kỹ mấy cái ví dụ chưa ? người ta chống sql injections bằng gì mà bác giám phán là nó không chống được.

ductinh2405

@ngoc_viet08: Hàm đó mình có sử dụng rồi nhưng có cải tiến theo ý mình chút xíu theo hướng thủ công.
Theo cách dùng hàm thông thường thì:

mysql_query(“insert into prefix_table(col1, col2, col3) values(‘”.conditional_escape($_POST[‘col1’]).”‘, ‘”.conditional_escape($_POST[‘col2’].”‘, ‘”.conditional_escape($_POST[‘col3’].”‘)”);

Ở đây mình có 3 cột và 3 lần gọi đến hàn conditional_escape và như vậy trong code của mình có 3 hàm if được thực thi. Hiện tại ứng dụng của mình đang làm thì bảng có số lượng cột ít nhất cũng đã hơn 200 rồi, thế nên >200 lần xét if thì tốc độ không được như mong muốn nữa rồi (Mình đang code PHP thành ứng dụng đặc biệt cho 1 thiết bị di động, thiết bị này hiện tại chưa được công bố & xuất bản).
Từ rất lâu rồi mình truy cập ddth với tư cách đơn thuần chỉ là guest và mình thấy có rất nhiều bài đóng góp tuyệt vời của ngoc_viet08. Một trong số đó đôi lúc cũng hỗ trợ mình ít nhiều trên con đường sự nghiệp. Mình thật sự cảm ơn bạn nhiều lắm!

bác đã đọc kỹ mấy cái ví dụ chưa ? người ta chống sql injections bằng gì mà bác giám phán là nó không chống được.
@honnhienh: Không phải tất cả những gì mọi người thường nói, thường bàn và cho là đúng thì đều chính xác 100% là đúng bác ạ. Hầu hết tất cả các hàm có sẵn trong các ngôn ngữ lập trình đều có những chỗ nguy hiểm mà chỉ những tổ chức chính phủ mới nắm được. Bác cũng đừng quên là tất cả mọi ngôn ngữ lập trình mà bác viết rồi thì đều sẽ chạy trên 1 phần cứng nào đó. Điều quan trọng cuối cùng là tất cả phần cứng mình chắc rằng đều bị kiểm soát.

Mình hy vọng là ở chủ đề này chúng ta chỉ bàn đến dấu ‘. Thói quen code, phong cách code nên để lại ở 1 chủ đề khác ở tương lai (Nếu có).

Một lần nữa rất cảm ơn mọi người đã tham gia cùng mình giải quyết vấn đề. Mình hy vọng trong tương lai các bạn sẽ đạt được đẳng cấp coder như các bạn mong muốn.

diepnghitinh

Chào mọi người, hiện mình đang có vấn đề với hàm addslashes, mình post lên đây hy vọng mọi người hỗ trợ và cùng mình nghiên cứu giải quyết vấn đề này.

Vấn đề đặt ra như sau:

Mọi người đều biết hàm addslashes có tác dụng thêm dấu \ ở trước dấu ‘. VD:

<?php
$a = “It’s John’s car!”;
echo addslashes($a); // Kết quả in ra là: It\’s John\’s car!
?>

viết 1 class database khai báo phương thức này rùi sử dụng cho các câu insert là tốt nhất

public function escape_string($string){
if (get_magic_quotes_gpc()) {
return $string;
}
return mysql_real_escape_string($string);
}

việc làm này khá tốt để insert 1 content html đã được định dạng bởi 1 editor wysiwyg nào đó

còn nếu anh sợ if nhiều quá gây nên sự chậm chạm cho ứng dụng thì viết 2 hàm riêng ra và chỉ xét if 1 lần theo thủ công như sau:

<?php

if (get_magic_quotes_gpc()) {

function escape_string($string){
return $string;
}

}
else
{

function escape_string($string){
return mysql_real_escape_string($string);
}

}

?>

đơn giản nhưng hiệu quả

Còn anh muốn 1 giải pháp chung như trên thì nên viết 1 cái class database và lúc query thì hơi đặc biệt chút.
1 vd của codeigniter

$data = array( ‘title’ => ‘My title’ , ‘name’ => ‘My Name’ , ‘date’ => ‘My date’ );
$this->db->insert(‘mytable’, $data);
// Tương ứng: INSERT INTO mytable (title, name, date) VALUES (‘My title’, ‘My name’, ‘My date’)

đương nhiên code sẽ tự động escape, giúp cho câu truy vấn an toàn hơn.

ductinh2405

còn nếu anh sợ if nhiều quá gây nên sự chậm chạm cho ứng dụng thì viết 2 hàm riêng ra và chỉ xét if 1 lần theo thủ công như sau:
@diepnghitinh: Chính xác thì anh đang sử dụng cách thủ công mà em nói đó. Mặc dù hơi phiền phức nhưng so sánh tốc độ thì tăng lên gấp 5~7 lần. Dự án anh đang tham gia hết sức hấp dẫn nhưng cũng hết sức… điên đầu.

Hiện anh cũng đang chuẩn bị cho 1 dự án cá nhân khác khá độc đáo. Nếu em muốn góp 1 chân trong đó thì hôm nào alô đặt hẹn rồi qua chỗ anh nói chuyện.

diepnghitinh

@diepnghitinh: Chính xác thì anh đang sử dụng cách thủ công mà em nói đó. Mặc dù hơi phiền phức nhưng so sánh tốc độ thì tăng lên gấp 5~7 lần. Dự án anh đang tham gia hết sức hấp dẫn nhưng cũng hết sức… điên đầu.

Hiện anh cũng đang chuẩn bị cho 1 dự án cá nhân khác khá độc đáo. Nếu em muốn góp 1 chân trong đó thì hôm nào alô đặt hẹn rồi qua chỗ anh nói chuyện.

vậy cho em 1 trang có template mẫu nha a :w00t:

ductinh2405

Framework của anh đã hoàn chỉnh 100% rồi. Anh vẫn sử dụng core cũ mà em chê là “đơn giản quá” và phát triển lên cho đến thời điểm này, chốt lại chắc cũng theo nó hơn nửa năm rồi.

http://hoasuaconic.edu.vn => Web này anh vừa hoàn thành. Tính tống thời gian design + code thì hoàn thành chưa tới 3h. Framework hỗ trợ đầy đủ MVC, Ajax, WYSIWYG Editor, Captcha, HTML DOM, SEO link, … và tổng dung lượng của framework là… 75.2 KB, a simple solution – mini but strong.

Anh đang viết docs cho framework, lúc trước có nói với em sẽ public cho cộng đồng nhưng giờ anh không dám chắc lắm. Công ty đã làm passport để đưa anh đi làm việc với các coder oversea phát triển tiếp framework, dùng riêng cho các dự án của công ty. Anh đang háo hức rất muốn đi nhưng mà phải… chờ trả nợ ở trường xong đã ^^’.

Lâu lắm rồi anh em mình không gặp nhau. Em phải tranh thủ sắp xếp qua chỗ anh trước khi anh đi đấy. Có nhiều việc anh muốn bàn với em nhưng ở nơi công cộng thế này thì không nói được.

huntkey

Bạn đã tìm hiểu những hệ thống mã nguồn mở nổi tiếng trên thế giới để xem người ta viết filter input chống SQL injection và XSS như thế nào chưa?

ductinh2405

@huntkey: Bạn đang muốn đề cập đến mã nguồn nào, Drupal, Joomla hay mã nguồn nào khác nữa? Mỗi mã nguồn có cách viết khác nhau nên cách bảo mật cũng sẽ khác nhau.

Mã nguồn mình đang viết là “mọi thứ đều đổ về 1 trang” và chỉ duy nhất 1 trang đó được phép truy cập (Các trang hoặc các thư mục khác có thể cấu hình cho server chặn, hoặc có thể dùng .htaccess kết hợp với chmod để cấm truy cập). Nói chung, framework của mình chỉ cần 1 lần kết nối CSDL và 1 lần trộn template (Theo mô hình MVC) thì tất cả mọi thứ đều chạy trơn tru và hoàn thành nhiệm vụ.

Các framework như Zend, CakePHP, CodeIgniter, … mà thông thường mọi người hay sử dụng đều tách giao diện và cuối cùng trộn lại theo kiểu “search & replace”. Mặc dù phân lớp và phân mục tốt, tiết kiệm thời gian nhưng ứng dụng sau khi hoàn thành luôn luôn sẽ có thời gian thực thi lâu hơn rất nhiều so với cách code tay thuần. Các framework luôn phải đọc file giao diện, sau đó đọc tiếp file code và tiếp tục tìm những block trong giao diện để trộn block code vào đó. Nếu là block A thì trộn code A, block B thì trộn code B, … Chính vì lẽ đó mà tốc độ không bao giờ nhanh hơn cách code tay thuần (Code trộn lẫn HTML & PHP, đọc đến đâu thực thi luôn đến đó và không cần phải xét gì cả).

Framework của mình cũng hỗ trợ MVC nhưng mình không đi theo lối mòn của các framework hiện có, mình chú trọng tốc độ & tính tối ưu nhiều hơn. “Mọi thứ đổ về 1 trang” và do đó việc bảo mật cũng chỉ cần lo cho đúng 1 trang đó, tất cả việc còn lại giao cho server.

Thật khó để nói rõ khi mình chưa thể public framework của mình.

Mặc dù mình có những cách làm việc hơi khác lạ nhưng khi làm việc thì mình vẫn thường làm theo cách chung mà mọi người thường làm thôi. Thói quen của con người rất đáng sợ. Dù thói quen đó đúng hay sai nhưng nếu mọi người xung quanh bạn dã chấp nhận nó thì bạn không thể thay đổi hay làm khác đi nếu bạn vẫn muốn làm việc hòa thuận với mọi người.

A lê hấp. Chắc mình lại phải sớm từ giã diễn đàn thôi. Lần nào lên diễn đàn mình cũng thấy… tốn thời gian quá.

huntkey

Tôi không đề cập đến framework của bạn được xây dựng như thế nào, chỉ gợi ý với bạn về vấn đề filter input mà bạn muốn trao đổi ở đầu topic.

Để xây dựng một Framework riêng không phải là quá sức của nhiều coder Việt Nam đâu, hoàn toàn làm được. Có thể là họ giấu để kiếm cơm hoặc nếu đem ra public thì sợ bị chê vì nó kém hơn những thứ có sẵn.

Framework thực thi nhanh là tốt, nhưng còn nhiều vấn đề xung quanh 1 hệ thống ngoài việc thực thi nhanh. Trong đó việc query DB và các vòng lặp xử lý mới chiếm nhiều thời gian. Nhưng hiện nay phần cứng ngày càng mạnh, hơn nhau vài micro giây không thành vấn đề.

Framework của bạn không dùng parse file rồi replace variables thì có lẽ bạn không dùng template engine. PHP và HTML trộn lẫn nhau. Nó sẽ tốt cho coder mà quên mất vai trò của HTML designer. Có thể bạn cho rằng ai đụng vào mấy file này cũng phải code thành thạo cho nên mới làm kiểu mix như vậy (đặc biệt phù hợp cho coder đa năng, có kinh nghiệm).

Còn trong việc sáng tạo, đó là tốt, rất tốt. Nhưng khi tìm hiểu kĩ thì sẽ thấy đa số vấn đề mình cho là sáng tạo thì thật ra nó không mới. Hy vọng framework của bạn mang tính sáng tạo, linh hoạt, dễ mở rộng và “mạnh”.

Chúc thành công với framework đang làm.

ductinh2405

Framework của bạn không dùng parse file rồi replace variables thì có lẽ bạn không dùng template engine. PHP và HTML trộn lẫn nhau. Nó sẽ tốt cho coder mà quên mất vai trò của HTML designer.
Framework của mình hỗ trợ tốt template engine, cho phép designer và coder làm việc hoàn toàn độc lập, không dùng parse file (Đây chính là một trong những điểm nổi bật).

Nếu so sánh về quy mô và mức độ tùy biến thì framework mơ ước của mình không thể sánh bằng bất kỳ framework thông dụng nào cả. Tuy nhiên, về tốc độ và tính dễ tiếp cận thì có lẽ sẽ có cơ hội đứng trong hàng ngũ top. Tốc độ ở đây bao gồm cả tốc độ code và tốc độ chạy của sản phẩm, dễ tiếp cận theo ý mình là đảm bảo bất kỳ coder PHP nghiệp dư nào đọc qua framework duy nhất 1 lần cũng đều sẽ hiểu cách thức hoạt động của nó.

Hơn nửa năm rồi mình chỉ lướt web thông qua Google để tìm tài liệu đắp dần từng mảnh của framework, ngừng tham gia tất cả mọi hoạt động trên các diễn đàn, mạng xã hội, ngừng luôn cả những phương tiện giả trí hàng ngày. Mình chỉ vừa hoàn thành framework mới đây thôi và thật sự rất sảng khoái, hưng phấn, có cảm giác muốn “khoe”, muốn chia sẻ thành quả cùng một ai đó.

Chủ đề này mình lập ra ban đầu là để tìm hiểu rõ hơn cách thức mọi người thường dùng để xử lý SQL injection. Tất cả các bài viết của mọi người tham gia vào chủ đề này đều đã ít nhiều giúp mình thay đổi một số chi tiết không kém phần quan trọng trong “tường lửa” của framework.

Mong rằng mình sẽ tiếp tục nhận được những bài viết thẳng thẳng & cùng xây dựng như thế này trong những chủ đề khác. Chân thành cảm ơn!

diepnghitinh

Framework của mình hỗ trợ tốt template engine, cho phép designer và coder làm việc hoàn toàn độc lập, không dùng parse file (Đây chính là một trong những điểm nổi bật).

Nếu so sánh về quy mô và mức độ tùy biến thì framework mơ ước của mình không thể sánh bằng bất kỳ framework thông dụng nào cả. Tuy nhiên, về tốc độ và tính dễ tiếp cận thì có lẽ sẽ có cơ hội đứng trong hàng ngũ top. Tốc độ ở đây bao gồm cả tốc độ code và tốc độ chạy của sản phẩm, dễ tiếp cận theo ý mình là đảm bảo bất kỳ coder PHP nghiệp dư nào đọc qua framework duy nhất 1 lần cũng đều sẽ hiểu cách thức hoạt động của nó.

Hơn nửa năm rồi mình chỉ lướt web thông qua Google để tìm tài liệu đắp dần từng mảnh của framework, ngừng tham gia tất cả mọi hoạt động trên các diễn đàn, mạng xã hội, ngừng luôn cả những phương tiện giả trí hàng ngày. Mình chỉ vừa hoàn thành framework mới đây thôi và thật sự rất sảng khoái, hưng phấn, có cảm giác muốn “khoe”, muốn chia sẻ thành quả cùng một ai đó.

Chủ đề này mình lập ra ban đầu là để tìm hiểu rõ hơn cách thức mọi người thường dùng để xử lý SQL injection. Tất cả các bài viết của mọi người tham gia vào chủ đề này đều đã ít nhiều giúp mình thay đổi một số chi tiết không kém phần quan trọng trong “tường lửa” của framework.

Mong rằng mình sẽ tiếp tục nhận được những bài viết thẳng thẳng & cùng xây dựng như thế này trong những chủ đề khác. Chân thành cảm ơn!
nghe ghê nhỉ ! tối nay e qua xem dc chứ 😀

ductinh2405

Ái chà! Anh phải suy nghĩ lại xem có nên để cho em khai thác lần nữa không đây. ;))

diepnghitinh

Ái chà! Anh phải suy nghĩ lại xem có nên để cho em khai thác lần nữa không đây. ;))

sao lại nói là khai thác? chỉ qua chơi rồi ngồi luận code thôi :w00t: chứ em có fw của riêng em rồi.

ductinh2405

Thôi đừng spam nữa. Tối alô anh.

FeS

@huntkey: Bạn đang muốn đề cập đến mã nguồn nào, Drupal, Joomla hay mã nguồn nào khác nữa? Mỗi mã nguồn có cách viết khác nhau nên cách bảo mật cũng sẽ khác nhau.

Mã nguồn mình đang viết là “mọi thứ đều đổ về 1 trang” và chỉ duy nhất 1 trang đó được phép truy cập (Các trang hoặc các thư mục khác có thể cấu hình cho server chặn, hoặc có thể dùng .htaccess kết hợp với chmod để cấm truy cập). Nói chung, framework của mình chỉ cần 1 lần kết nối CSDL và 1 lần trộn template (Theo mô hình MVC) thì tất cả mọi thứ đều chạy trơn tru và hoàn thành nhiệm vụ.

Các framework như Zend, CakePHP, CodeIgniter, … mà thông thường mọi người hay sử dụng đều tách giao diện và cuối cùng trộn lại theo kiểu “search & replace”. Mặc dù phân lớp và phân mục tốt, tiết kiệm thời gian nhưng ứng dụng sau khi hoàn thành luôn luôn sẽ có thời gian thực thi lâu hơn rất nhiều so với cách code tay thuần. Các framework luôn phải đọc file giao diện, sau đó đọc tiếp file code và tiếp tục tìm những block trong giao diện để trộn block code vào đó. Nếu là block A thì trộn code A, block B thì trộn code B, … Chính vì lẽ đó mà tốc độ không bao giờ nhanh hơn cách code tay thuần (Code trộn lẫn HTML & PHP, đọc đến đâu thực thi luôn đến đó và không cần phải xét gì cả).

Framework của mình cũng hỗ trợ MVC nhưng mình không đi theo lối mòn của các framework hiện có, mình chú trọng tốc độ & tính tối ưu nhiều hơn. “Mọi thứ đổ về 1 trang” và do đó việc bảo mật cũng chỉ cần lo cho đúng 1 trang đó, tất cả việc còn lại giao cho server.

Thật khó để nói rõ khi mình chưa thể public framework của mình.

Mặc dù mình có những cách làm việc hơi khác lạ nhưng khi làm việc thì mình vẫn thường làm theo cách chung mà mọi người thường làm thôi. Thói quen của con người rất đáng sợ. Dù thói quen đó đúng hay sai nhưng nếu mọi người xung quanh bạn dã chấp nhận nó thì bạn không thể thay đổi hay làm khác đi nếu bạn vẫn muốn làm việc hòa thuận với mọi người.

A lê hấp. Chắc mình lại phải sớm từ giã diễn đàn thôi. Lần nào lên diễn đàn mình cũng thấy… tốn thời gian quá.

Bạn làm mình tò mò quá ! :embarrass
1. Bạn dùng profiler cho mình xem tí benchmark với ! Mình cảm ơn !
2. “mọi thứ đều đổ về 1 trang” –> Cách tiếp cận của bạn vẫn là front controller hay là gì khác ?
3. Code tay thuần là sao bạn ? Giải thích kỹ cho mình với ! :emlaugh:
4. Mình chỉ mới làm việc với CakePHP, còn các framework khác mình chưa từng dùng. Kinh nghiệm làm việc của mình với CakePHP thì thấy rằng mặc định Cake không hề parse template ở View để “search n replace” mà thiên về áp dụng decoration. Muốn “search n replace” thì bạn phải override lại view mặc định của controller để nhét template engine vào. 🙂

Trả lời mình sớm nhé, mình cảm ơn lol

ductinh2405

“Mọi thứ đều đổ về 1 trang” của mình đơn giản chính là controller đó bạn. Controler sẽ phân tách URL trên trình duyệt và từ đó xác định và “đổ đúng trang” ra ngoài. Đây là một số site mình viết trong quá trình đang phát triển framework (Lúc đó framework chưa hoàn chỉnh):

http://viettogo.com
http://www.lachchach.com (Có www ở trước nhé, không www là trang khác viết bằng Drupal)
http://kimhungthinh.net
http://vaithun.vn

Bạn để ý cách SEO link của mình thì có lẽ sẽ đoán được phần nào. .html ở sau cùng chỉ là hình thức, mình có thể tự do thay đổi thành .php, .asp, .*** hay gì tùy ý.

Về “code tay thuần” theo ý mình là cách code hỗn tạp không dùng bất kỳ framework nào, không cần tách giao diện (No template engine), không cần SEO link, … nói chung là cách code chỉ dùng những gì cơ bản nhất mà PHP hỗ trợ.

Về CakePHP chắc bạn cũng có kinh nghiệm nhiều rồi. Bạn có thấy rằng cách làm việc của CakePHP rõ ràng là “đi vòng” không? Trên thực tế thì tất cả các framework mình từng biết mà có hỗ trợ template engine, mvc thì đều phải đi vòng cả. Sở dĩ framework của mình không đi vòng vì mình bắt nguồn cho việc xây dựng framework không phải từ việc làm web, cũng không phải từ việc thường làm của 1 lập trình viên. Nói chung, suy nghĩ về framework này bắt nguồn từ 1 lĩnh vực không có chút liên quan gì đến PHP cả :blink:. Một điều mà mình phải thú nhận là ý tưởng này không hoàn toàn là của mình. Mình chỉ suy nghĩ về nó sau câu hỏi của 1 đứa học trò nào đó thuộc lớp PHP cơ bản đã vô tình hỏi mình cách đây mấy năm. Mình kiên trì đi theo nó và mình nghĩ cả phần đời còn lại sẽ tiếp tục duy trì phát triển để framework hoàn thiện nhất.

Mình không biết bản thân có mơ mộng cao sang quá không nhưng mình luôn hy vọng sẽ có một ngày mình public framework này và được thế giới đón nhận. lol

ngoc_viet08

@ngoc_viet08: Hàm đó mình có sử dụng rồi nhưng có cải tiến theo ý mình chút xíu theo hướng thủ công.
Theo cách dùng hàm thông thường thì:

mysql_query(“insert into prefix_table(col1, col2, col3) values(‘”.conditional_escape($_POST[‘col1’]).”‘, ‘”.conditional_escape($_POST[‘col2’].”‘, ‘”.conditional_escape($_POST[‘col3’].”‘)”);

Ở đây mình có 3 cột và 3 lần gọi đến hàn conditional_escape và như vậy trong code của mình có 3 hàm if được thực thi. Hiện tại ứng dụng của mình đang làm thì bảng có số lượng cột ít nhất cũng đã hơn 200 rồi, thế nên >200 lần xét if thì tốc độ không được như mong muốn nữa rồi (Mình đang code PHP thành ứng dụng đặc biệt cho 1 thiết bị di động, thiết bị này hiện tại chưa được công bố & xuất bản).
Từ rất lâu rồi mình truy cập ddth với tư cách đơn thuần chỉ là guest và mình thấy có rất nhiều bài đóng góp tuyệt vời của ngoc_viet08. Một trong số đó đôi lúc cũng hỗ trợ mình ít nhiều trên con đường sự nghiệp. Mình thật sự cảm ơn bạn nhiều lắm!

ừm kaka. Thực sự thì chỉ cần 1 lần if thôi mà. nếu ko cứng nhắc xài nguyên xi function đó 😀

huntkey

@ductinh2504: Theo cách bạn nói thì view của bạn không biết có lo được việc khi đang code muốn nhét 1 đoạn, 1 file js hoặc css không? Hay cả file template cần phải bao gồm tất tần tật js, css file vào header tag?

Bạn không dùng parse patern thì bạn bạn dùng dạng replace patern trong file tpl. Đúng không?

Bạn dùng 1 file index.php là đầu vào, thế những file php khác câu lệnh đầu tiên bạn sẽ dùng là gì?

Hơn nữa, việc phân tích các vấn đề của framework để thiết kế, bạn nghiên cứu tới mức nào trước khi bắt tay vào xây dưng hay chỉ nghĩ tới đâu làm tới đó?

Trên đây chỉ là những câu hỏi để gợi mở cũng như dự đoán cách mà framework bạn hoạt động để thấy rằng framework của bạn nó dữ tới mức nào. Cứ thoải mái trao đổi để hoàn thiện hơn 🙂

ductinh2405

Mỗi tập tin view của mỗi trang là khác nhau hoàn toàn và có thể thoải mái thêm js, css tùy thích (js và css của mỗi trang không nhất thiết phải giống nhau).

Trong file tpl sẽ chỉ bao gồm HTML và các hook vị trí (tương tự như cách viết của diễn đàn vbulletin). Ở mỗi vị trí này sẽ được chèn model vào. File model có thể là 1 file PHP duy nhất hoặc cũng có thể là file XML (Trong trường hợp cần dùng nhiều file PHP rời bổ trợ cho nhau). Ý tưởng về tập tin XML điều khiển này gần giống như cách hoạt động của các module trong Joomla. Như vậy với mỗi trang view khác nhau mình có thể tự do gắn các module ở những vị trí mình muốn 1 cách thoải mái. Tất cả các module tổ hợp lại sẽ thành 1 trang web hoàn chỉnh.

Cách trộn template và code của mình chỉ dùng hàm replace bình thường. Tuy nhiên, không có sự tìm kiếm theo dạng dò hoặc if, switch như các framework khác mà tự mỗi tập tin model sẽ biết mình nên nằm ở hook nào trong view. Để làm được điều này thì quan trọng là cách tổ chức lưu trữ view và model như thế nào là hợp lý nhất. Dĩ nhiên, cách thức lưu trữ này mình không tự nghĩ ra. Nó đã có sẵn trong bộ môn Cấu trúc dữ liệu mà các trường ĐH giảng dạy. Mình chỉ ứng dụng và cải tiến chút xíu để kết quả hơn cả như mình mong đợi. Thực tế cách thức này rất đơn giản nhưng không ai để ý tới để dùng thôi.

index.php là file duy nhất mà web sẽ chạy. Đây là nội dung tập tin index.php của mình, show lên cho mọi người xem luôn nhé!

<?php
// Bật session
session_start();

// Sử dụng bộ đệm
ob_start();

// Lấy dữ liệu cấu hình
include(‘config.php’);

// Sử dụng framework
include(‘framework/framework.php’);
$framework = new framework();

// Cài đặt múi giờ
$framework->datetime->set_timezone($config[‘timezone’]);

// Kết nối CSDL
$framework->connect->do_connect($config[‘host’], $config[‘username’], $config[‘password’], $config[‘database’]);

// Lấy liên kết hiển thị trên thanh address của trình duyệt
$web_address = “http://” . $_SERVER[‘HTTP_HOST’] . $_SERVER[‘REQUEST_URI’];

// Mảng các phần tử trên address
$web_path = $_GET[‘path’];
$web_path = explode(‘/’, $web_path);

switch($web_path[0]){
case ‘thong-tin-cuu-tro’ : if($web_path[1]==’xem-tin’){
$framework->template->get_mix($config[‘template_dir’].’/news_detail.tpl’);
}elseif($web_path[1]==’in-tin’){
$framework->template->get_mix($config[‘template_dir’].’/news_print.tpl’);
}else{
$framework->template->get_mix($config[‘template_dir’].’/news.tpl’);
}
break;
case ‘quy-nhan-ai’ : $framework->template->get_mix($config[‘template_dir’].’/fund.tpl’); break;
case ‘danh-sach-ung-ho’ : $framework->template->get_mix($config[‘template_dir’].’/donate.tpl’); break;
case ‘lien-he’ : $framework->template->get_mix($config[‘template_dir’].’/contact.tpl’); break;
case ‘trang-chu’ :
case ‘index’ :
default : $framework->template->get_mix($config[‘template_dir’].’/home.tpl’); break;
}

// Xóa sạch & hủy bộ đệm
ob_end_flush();
?>

Như vậy mình chỉ tạo duy nhất 1 đối tượng framework, kết nối CSDL và cài đặt một số cấu hình server 1 lần duy nhất trong index.php. Toàn bộ các tập tin khác trong website xem như đã có đối tượng framework, đã kết nối CSDL, …

Còn đây là 1 file model. Trong file này chỉ việc code và code, không cần quan tâm đến tạo framework, include hay kết nối CSDL gì cả:

$rs = mysql_query(“select * from “.$config[‘table_prefix’].”news order by news_read desc, news_datetime desc limit 0, 10”);
if(mysql_num_rows($rs)){
while($r = mysql_fetch_assoc($rs)){
$news_url = $config[‘web_url’].’/thong-tin-cuu-tro/xem-tin/’.$r[‘news_id’].’.html’;
echo ‘<div class=”ct_content_rightweb font_11px”>’;
if($r[‘news_thumbnail’]){
echo ‘<a href=”‘.$news_url.'” class=”ct_img_rightweb”><img src=”‘.$config[‘web_url’].’/’.$config[‘template_dir’].’/images/graphics/blank.gif” width=”50″ height=”50″ style=”background:url(‘.$config[‘web_url’].’/upload/news/thumbnail/71_55/’.$r[‘news_thumbnail’].’) center no-repeat;” /></a>’;
}
echo ‘<p class=”font_11px black”><a href=”‘.$news_url.'”>’.$r[‘news_title’].'</a></p>’;
echo ‘</div>’;
}
mysql_free_result($rs);
}

Rõ ràng lúc này mình chỉ việc ngồi và code những gì cần thiết cho các file model và không cần quan tâm đến những thứ khác nữa. Điều quan trọng hơn hết là coder có thể code model theo cách thức của framework (Hướng đối tượng) hoặc code tự do 1 cách bình thường mà không cần học thêm bất kỳ cú pháp riêng nào của framework. Quan trọng hơn, các file model có thể được sử dụng lại nhiều lần ở nhiều vị trí khác nhau trong website nên sẽ rất tiện mỗi khi cần dùng lại.

Ngày trước nếu viết 1 trang như Viettogo.Com (http://viettogo.com), bao gồm cả lấy tin tự động (Tự trích tin từ các báo điện tử khác bao gồm chữ thì được insert vào CSDL, hình ảnh & video thì được tự động chuyển về host của mình và dẫn link) mình phải mất hơn nửa tháng mới hoàn thành. Nếu sử dụng framework (Bản complete) thì thời gian rút ngắn lại là chưa đến 2 ngày (Mỗi ngày 8h theo giờ làm việc của mình).

Trước khi bắt tay vào viết framework này thì mình chỉ code tay thuần hoặc dùng các mã nguồn mở như Joomla, Drupal, WordPress, vbulletin, PunBB, … Sau một thời gian mơ ước sẽ thi và lấy bằng Zend để có tên trong TOP 10 người đầu tiên ở Việt Nam sở hữu tấm bằng này (^^’) thì mình bắt đầu tìm hiểu cách thức hoạt động của các framework. Mình bỏ thời gian tìm hiểu chúng hoạt động theo cách nào hơn là học thuộc lòng cú pháp để sử dụng. Rồi thì mình đi dạy học ở 1 trường dạy nghề (http://key.com.vn), làm việc ở đó 3 năm với vai trò vừa là giáo viên vừa là PHP coder (Kiêm luôn cả design #_#). Đây mới là khoảng thời gian mình thật sự tiếp cận và đi sâu vào PHP. Từ đây mình cũng nghiệm ra được 1 chân lý là: Bạn muốn giỏi trong lĩnh vực nào, hãy đi dạy trong lĩnh vực đó. Hiện tại thì mình đang là PHP coder tại công ty Mua Hàng Mỹ (http://muahangmy.com).

Nói & mô tả thì rất nhiều nhưng bất kỳ ai tận mắt xem kết cấu framework của mình đều sẽ thấy… “sao mà đơn giản quá”. diepnghitinh là thành viên trong team code web của mình ở công ty cũ, đã xem qua ý tưởng framework của mình thuở sơ khai và luôn miệng chê “đơn giản quá”.

Mình mong rằng bài viết của mình sẽ tạo không khí giúp mọi người lên tinh thần & bắt tay vào xây dựng 1 framework cho riêng mình.

Giờ có lẽ mình phải tạm rời diễn đàn thôi. Lên diễn đàn viết bài cũng… tốn nhiều thời gian lắm.

Mình sẽ không tham gia vào chủ đề này nữa.

Thân!

huntkey

Nếu bạn vẫn còn đang lâng lâng sung sướng trong giấc mơ thì tôi cũng không đánh thức bạn nữa. Khi nào cảm xúc của bạn tạm lắng xuống hãy cho mọi người xem source code của 3 files sau:
– left_menu.php
– center_news_content.php
– news.tpl

Tôi nghĩ nhiều người trong này có thể góp ý gì gì đó cho nếu bạn thực sự cầu thị mong muốn hệ thống hoạt động ngon lành đúng nghĩa. Chúc may mắn!

ngoc_viet08

chừng nào public source của mình vài lần thì mới bik dc source của mình tới đâu 😀

longvnit

Nếu bạn vẫn còn đang lâng lâng sung sướng trong giấc mơ thì tôi cũng không đánh thức bạn nữa. Khi nào cảm xúc của bạn tạm lắng xuống hãy cho mọi người xem source code của 3 files sau:
– left_menu.php
– center_news_content.php
– news.tpl

Tôi nghĩ nhiều người trong này có thể góp ý gì gì đó cho nếu bạn thực sự cầu thị mong muốn hệ thống hoạt động ngon lành đúng nghĩa. Chúc may mắn!

Đó cũng có thể gọi là FW, nhưng một lúc nào đó bạn ấy sẽ nhận thức là rằng những điều bạn ấy đang làm chỉ tích lũy cho bạn ấy kiến thức, chứ không phải là xậy dựng 1 FW thực thụ có thể khiến cộng đồng & Project Manager sử dụng:D

Mình cũng đã tự xây dựng cho bản thân một FW, có thể nói là khá giống với Codeigniter hiện nay. Nhưng bây giờ mình đã không sự dụng nó nữa, mà là dùng nhưng FW như Zend, CI… bởi vì tính phổ biến và tận dụng sử hổ trợ mạnh mẽ từ cộng đồng.

Một FW được xây dựng ra ít nhất phải đảm bảo được tính cấu trúc & tiện dụng.
Bạn thử xem FW mình có cấu trúc thế nào ? Đã tiện dụng chưa ? Một vd: nếu muốn build một web service client trên FW của bạn thì phải làm thế nào ? Mình nghĩ hiện tại bạn phải code thuần mà thôi 🙂

Chúc bạn thành công !

diepnghitinh

chào các bạn! mình cũng có viết 1 FW riêng cho mình nhưng nhận thấy tính chuẩn mực vẫn chưa hoàn chỉnh, độ hoàn thành so với yêu cầu phát thảo còn quá ít, âu chỉ viết cho có kinh nghiệm mà thôi … sẵn đây giới thiệu cho ae cùng tham khảo ý tưởng 🙂

FW thao tác = admin control panel không cần mắc công tạo file làm chi cho mất công !
Menu left của FW:
http://cB3.upanh.com/19.0.25388612.eCt0/menuleft.png

nhiều người tự hỏi tại sao phải kết nối csdl mới có thể sử dụng dc fw. Vấn đề này xin trả lời đơn giản rằng: Fw của mình chỉ support web động thôi

1 vấn đề nữa là fw chỉ hoạt động trên những server có hỗ trợ rewrite url, còn link truyền thống mình có phác thảo trước khi nhưng vẫn chưa có thời gian bổ sung vào.

1 điểm nữa fw hỗ trợ uri như thế nào?
vd:
bạn muốn có 1 uri như thế này
http://cB5.upanh.com/19.0.25388904.9Ma0/brower.png
chỉ việc vào fw và viết:
http://cB8.upanh.com/19.0.25389007.Sao0/link.png

đặc biệt tại phần mã cài đặt dc hỗ trợ tất cả các library mà bạn muốn sử dụng vd như template engine, class upload và hầu hết các class ứng dụng cơ bản khác. Còn cách viết thì tại doc fw của mình có hướng dẫn

lưu ý là tại 1 view html bạn có thể sử dụng:

<!–@include:music_topics–>

điều này sẽ giúp bạn load 1 chức năng tương tự như việc tạo link cho play-album.html như trên. tức là viết như vầy

<!–@include:play-album.html–>

việc này sẽ lấy content và các xử lý trong play-album.html paster vào file đã định include.

vd:
index.html

<!–@include:test.html–>

test.html ( return về 1 giá trị )

ok

=> nội dung file index.html là

ok

Fw còn hỗ trợ thêm 1 chức năng hook, và addons, plugin tương tự như forum vbb
http://cB3.upanh.com/19.0.25389412.M8v0/hook.png

chức năng quản lý menu tại admin control panel:
http://cB9.upanh.com/19.0.25389448.C6Z0/categoryadd.png

hệ thống backup hoàn hảo, đã test với dữ liệu trên 500mb

và còn nhiều thứ khác nữa, chỉ tiếc do nó ko dc chuẩn theo ý mình nên mình vẫn chưa mạnh dạn áp dụng vào các project

hi vọng dc các bạn góp ý ^^

simplezt

– Về fw của bạn chủ topic, mình nghĩ cái bạn gọi là model thì nên đổi sang gọi là DAO vì model thường ko chứa câu truy vấn. Còn fw của bạn diepnghitinh thì không hẳn là 1 fw mà nên gọi là 1 web application.

– Mình cũng đang phát triển 1 web application có tên là simplezt. Nó là “a light, fast and flexible Web Publishing System”. Điều đặc biệt của simplezt là nó có 1 control panel là 1 website được tạo ra từ chính nó. Xem vài screenshot của 1 vài plugins chính để hiểu rõ hơn nhé:

+ Multiple View Plugin: http://img820.imageshack.us/img820/6835/simpleztcpconfigmultipl.jpg
+ Content Type Plugin: http://img11.imageshack.us/img11/8413/simpleztcpeditcontentty.jpg
+ Input Type Plugin: http://img40.imageshack.us/img40/567/simpleztcpsetupinputtyp.jpg
+ Menu Plugin: http://img39.imageshack.us/img39/4931/simpleztcpmenu129762142.jpg
+ File Manager Plugin: http://img132.imageshack.us/img132/1859/filemanager129762137748.jpg
+ Template Editor: http://img200.imageshack.us/img200/7206/tehomepagelayout1297619.jpg

– Vì đây là private project trong free time nên bạn nào quan tâm và muốn cùng phát triển thì pm mình YM!:zeroonea (Ai ở Cần Thơ thì càng tuyệt 🙂 )

diepnghitinh

nhìn sơ của simplezt thấy giao diện thật hoàn tráng :))