Ads

Ads
zzzz
Showing posts with label Huong Dan Lap Trinh. Show all posts
Showing posts with label Huong Dan Lap Trinh. Show all posts

Tuesday, April 7, 2015

Tạo form đăng ký, đăng nhập bằng php và mysql

20Me Reviews     11:17 AM    
Bạn đang làm một website? Site của bạn thuộc dạng chuyên nghiệp? hay nghiệp dư? ... thì cơ bản bạn cũng phải cần đến một trang đăng ký dùng để tạo tài khoản và trang đăng nhập dùng để truy nhập tài khoản đã đăng ký. Trong phạm vi bài viết này tôi sẽ trình bày cách viết 1 trang đăng ký, đăng nhập cơ bản mà bạn có thể ứng dụng ngay.
Tạo form đăng ký, đăng nhập bằng php và mysql


1/ Tạo kết nối database:

Tạo file "mysql.php" có code như sau:
PHP Code:
<?php
$db_host = "localhost"; // Giữ mặc định là localhost
$db_name    = 'demo';// Can thay doi
$db_username    = 'root'; //Can thay doi
$db_password    = 'laivt';//Can thay doi
@mysql_connect("{$db_host}", "{$db_username}", "{$db_password}") or die("Không thể kết nối database");
@mysql_select_db("{$db_name}") or die("Không thể chọn database");
?>
?>
Bạn cần phải thay đổi thông tin ở 3 biến $db_name, $db_username, $db_password cho phù hợp với thông tin database của bạn.

2. Tạo table "members" dùng dể chứa thông tin thành viên:

Sau đó bạn tạo file "khoitao.php" có code như sau:
PHP Code:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ebook-coding - Khoi tao CSDL (Huong Dan tao trang dang ki/Dang Nhap)</title>
<?php
require_once("mysql.php");
@$create=mysql_query("CREATE TABLE `members` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`username` VARCHAR( 128 ) NOT NULL ,
`password` VARCHAR( 32 ) NOT NULL ,
`email` VARCHAR( 255 ) NOT NULL ,
`URLS` VARCHAR( 255 ) NOT NULL ,
`Name` VARCHAR( 255 ) NOT NULL ,
`Birthday` VARCHAR( 255 ) NOT NULL ,
`admin` INT( 1 ) NOT NULL DEFAULT '0' ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;");
@$add_admin=mysql_query("
INSERT INTO `demo`.`members` (
`id` ,
`username` ,
`password` ,
`email` ,
`URLS` ,
`Name` ,
`Birthday` ,
`admin`
)
VALUES (
NULL , 'admin', MD5( 'admin' ) , 'admin@sinhvienit.net', 'http://sinhvienit.net', 'Vũ Thanh Lai', '29/09/1990', '1'
);
");
if ($create)
    print "Table \"members\" đã được tạo.<br>";
else
    print "Table \"members\" chưa được tạo do lỗi truy vấn SQL.<br>";

if ($add_admin)
    print "<b>TK Admin:</b><br>User: admin<br>Pass:admin<br>";
else
    print "Ko thể tạo tài khoản admin vì lỗi SQL.<br>";

echo '<a href="http://ebook-coding.blogspot.com/">Click vào đầy để xem Demo</a>';
?>
Bạn tiếp tục chạy file "khoitao.php" này để tiến hành tạo table "members" và tk admin, sau khi tạo xong thì xóa file này đi. Nếu bạn đã quen sử dụng phpMyAdmin thì bạn có thể tự tạo table này, còn đối với newbie thì nên làm theo cách của tôi, sau này bạn có thể tự tìm hiểu thêm.

3. Tạo trang đăng ký:

Tạo file "register.php" có code như sau:

PHP Code:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ebook-Coding- Dang ky thanh vien (Huong dan xay dung trang Dang ky/dang Nhap)</title>
<?php
// Tải file mysql.php lên
require_once("mysql.php");
//Kiem tra email co hop le hay ko
function check_email($email) {
    if (strlen($email) == 0) return false;
    if (eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $email)) return true;
    return false;
}
if ( $_GET['act'] == "do" )
{
    // Dùng hàm addslashes() để tránh SQL injection, dùng hàm md5() để mã hóa password
    $username = addslashes( $_POST['username'] );
    $password = md5( addslashes( $_POST['password'] ) );
    $verify_password = md5( addslashes( $_POST['verify_password'] ) );
    $email = addslashes( $_POST['email'] );
    $ten = addslashes( $_POST['name'] );
    $sinhnhat = addslashes( $_POST['sn'] );
    $url = addslashes( $_POST['url'] );
    // Kiểm tra 7 thông tin, nếu có bất kỳ thông tin chưa điền thì sẽ báo lỗi
    if ( ! $username || ! $_POST['password'] || ! $_POST['verify_password'] || ! $email || ! $ten || ! $sinhnhat || ! $ten)
    {
        print "Xin vui lòng nhập đầy đủ các thông tin. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
        exit;
    }
    // Kiểm tra username nay co nguoi dung chua
    if ( mysql_num_rows(mysql_query("SELECT username FROM members WHERE username='$username'"))>0)
    {
        print "Username này đã có người dùng, Bạn vui lòng chọn username khác. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
        exit;
    }
    // Kiểm tra email nay co hop le ko
    if (!check_email($email))
    {
        print "Email này ko hợp lệ. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
        exit;
    }
    if (!ereg("^[0-9]+/[0-9]+/[0-9]{2,4}",$sinhnhat))
    {
        print "Ngày tháng năm sinh ko hợp lệ. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
        exit;
    }
    // Kiểm tra email nay co nguoi dung chua
    if ( mysql_num_rows(mysql_query("SELECT email FROM members WHERE email='$email'"))>0)
    {
        print "Email này đã có người dùng, Bạn vui lòng chọn Email khác. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
        exit;
    }
    // Kiểm tra mật khẩu, bắt buộc mật khẩu nhập lúc đầu và mật khẩu lúc sau phải trùng nhau
    if ( $password != $verify_password )
    {
        print "Mật khẩu không giống nhau, bạn hãy nhập lại mật khẩu. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
        exit;
    }
    // Tiến hành tạo tài khoản
    @$a=mysql_query("INSERT INTO members (username, password, email,URLS,Name,Birthday) VALUES ('{$username}', '{$password}', '{$email}', '{$url}', '{$ten}', '{$sinhnhat}')");
    // Thông báo hoàn tất việc tạo tài khoản
    if ($a)
        print "Tài khoản {$username} đã được tạo. <a href='login.php'>Nhấp vào đây để đăng nhập</a>";
    else
        print "Có lỗi trong quá trình đăng kí, Vui lòng liên hệ BQT";
}
else
{
// Form đăng ký
print <<<EOF
<form action="register.php?act=do" method="post">
    <table border="1" width="400" cellspacing="1" style="border-collapse: collapse" bordercolor="#C0C0C0">
        <tr>
            <td>Tên truy nhập:</td>
            <td><input type="text" name="username" value=""></td>
        </tr>
        <tr>
            <td>Mật khẩu:</td>
            <td><input type="password" name="password" value=""></td>
        </tr>
        <tr>
            <td>Xác nhận mật khẩu:</td>
            <td><input type="password" name="verify_password" value=""></td>
        </tr>
        <tr>
            <td>Địa chỉ E-mail:</td>
            <td><input type="text" name="email" value=""></td>
        </tr>
        <tr>
            <td>URL:</td>
            <td><input type="text" name="url" value=""></td>
        </tr>
        <tr>
            <td>Tên:</td>
            <td><input type="text" name="name" value=""></td>
        </tr>
        <tr>
            <td>Sinh nhật  (Ngày/Tháng/Năm):</td>
            <td><input type="text" name="sn" value=""></td>
        </tr>
        <tr>
            <td><input type="submit" name="submit" value="Đăng ký tài khoản"></td>
            <td><Font size="5"> Ebook-Coding</Font></td>
        </tr>
    </table>
</form>
EOF;
}
?>
4. Tạo trang đăng nhập:

Tạo file "login.php" có code như sau:
PHP Code:
<?php
session_start();
header('Content-Type: text/html; charset=UTF-8');
echo '<title>SinhVienIT.Net - dang nhap (Huong Dan tao trang dang ki/Dang Nhap)</title>';
// Tải file mysql.php lên
require_once("mysql.php");
if ( $_GET['act'] == "do" )
{
    // Dùng hàm addslashes() để tránh SQL injection, dùng hàm md5() để mã hóa password
    $username = addslashes( $_POST['username'] );
    $password = md5( addslashes( $_POST['password'] ) );
    // Lấy thông tin của username đã nhập trong table members
    $sql_query = @mysql_query("SELECT id, username, password FROM members WHERE username='{$username}'");
    $member = @mysql_fetch_array( $sql_query );
    // Nếu username này không tồn tại thì....
    if ( @mysql_num_rows( $sql_query ) <= 0 )
    {
        print "Tên truy nhập không tồn tại. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
        exit;
    }
    // Nếu username này tồn tại thì tiếp tục kiểm tra mật khẩu
    if ( $password != $member['password'] )
    {
        print "Nhập sai mật khẩu. <a href='javascript:history.go(-1)'>Nhấp vào đây để quay trở lại</a>";
        exit;
    }
    // Khởi động phiên làm việc (session)
    $_SESSION['user_id'] = $member['id'];
    $_SESSION['user_admin'] = $member['admin'];
    // Thông báo đăng nhập thành công
    print "Bạn đã đăng nhập với tài khoản {$member['username']} thành công. <a href='index.php'>Nhấp vào đây để vào trang chủ</a>";
}
else
{
// Form đăng nhập
print <<<EOF
<form action="login.php?act=do" method="post">
Tên truy nhập: <input type="text" name="username" value="">
Mật khẩu: <input type="password" name="password" value="">
<input type="submit" name="submit" value="Đăng nhập">
</form>
EOF;
}
?>
5. Tạo trang chủ:

Tạo file "index.php" với code như sau:
PHP Code:
<?php
session_start();
header('Content-Type: text/html; charset=UTF-8');
echo '<title>SinhVienIT.Net - Homepage (Huong Dan tao trang dang ki/Dang Nhap)</title>';
require_once("mysql.php");
if ( !$_SESSION['user_id'] )
{
    echo "Bạn chưa đăng nhập! <a href='login.php'>Nhấp vào đây để đăng nhập</a> hoặc <a href='register.php'>Nhấp vào đây để đăng ký</a>";
}
else
{
    $user_id = intval($_SESSION['user_id']);
    $sql_query = @mysql_query("SELECT * FROM members WHERE id='{$user_id}'");
    $member = @mysql_fetch_array( $sql_query );
    echo "Bạn đang đăng nhập với tài khoản {$member['username']}.";
    echo "<br><a href='suathongtin.php'>Sửa thông tin</a>";
    if ($member['admin']=="1")  echo "<br><a href='admin.php'>Trang quản trị</a>";
    echo "<br><a href='thoat.php'>Thoát ra</a>";
}
?>
6. Tạo trang admin:
Tạo file "admin.php" với code như sau:
PHP Code:
<?php
session_start();
header('Content-Type: text/html; charset=UTF-8');
require_once("mysql.php");
if ( !$_SESSION['user_id'] )
{
    echo "Bạn chưa đăng nhập! <a href='login.php'>Nhấp vào đây để đăng nhập</a> hoặc <a href='register.php'>Nhấp vào đây để đăng ký</a>";
}
else
{
    $user_id = intval($_SESSION['user_id']);
    $sql_query = @mysql_query("SELECT * FROM members WHERE id='{$user_id}'");
    $member = @mysql_fetch_array( $sql_query );
    echo "Bạn đang đăng nhập với tài khoản {$member['username']}.";
    echo "<br><a href='thoat.php'>Thoát ra</a><hr>";
    if ($member['admin']!="1") 
        echo "Bạn ko phải là admin";
    else
    {
        //Noi dung cac ham, cac lenh va code danh cho admin
        echo "Các code cho admin ở đây";
    }

}
?>
5. Tạo trang logout:
Tạo file "thoat.php" với code như sau:
PHP Code:
<?php
session_start();
header('Content-Type: text/html; charset=UTF-8');
echo '<title>SinhVienIT.Net - Huong Dan tao trang dang ki/Dang Nhap</title>';
if (session_destroy())
    echo "Thoát thành công!";
else
    echo "KO thể thoát dc, có lỗi trong việc hủy session";

echo '<br><a href="http://sinhvienit.net/forum/">Bấm vào đây để quay lại trang chủ<br></a>';
?>
5. Tạo trang sửa thông tin cá nhân:
Tạo file "suathongtin.php" với code như sau:
PHP Code:
<?php
session_start();
header('Content-Type: text/html; charset=UTF-8');
echo '<title>SinhVienIT.Net - Sua thong tin ca nhan (Huong Dan tao trang dang ki/Dang Nhap)</title>';
echo '<a href="http://sinhvienit.net/forum/">Bấm vào đây để quay lại<br></a>';
require_once("mysql.php");
if ( !$_SESSION['user_id'] )
{
    echo "Bạn chưa đăng nhập! <a href='login.php'>Nhấp vào đây để đăng nhập</a> hoặc <a href='register.php'>Nhấp vào đây để đăng ký</a>";
}
else
{
    $user_id = intval($_SESSION['user_id']);
    $sql_query = @mysql_query("SELECT * FROM members WHERE id='{$user_id}'");
    $member = @mysql_fetch_array( $sql_query );
    //----Noi dung thong bao sau khi sua
    $thanhcong='Sửa thành công <a href="http://sinhvienit.net/forum/">Quay lại</a>';
    $kothanh='Sửa ko thành công';
    echo "<b>Đang Sửa tài khoản {$member['username']}</b>.<br>";



    if ($_GET['do']=="sua") {
        $ten = addslashes( $_POST['name'] );
        $pass = md5( addslashes( $_POST['pass'] ) );
        $sn = addslashes( $_POST['sn'] );
        $url = addslashes( $_POST['url'] );
        $email = addslashes( $_POST['email'] );
        $sql="
        UPDATE `members` SET
        `email` = '".$email."',
        `URLS` = '".$url."',
        `Name` = '".$ten."',
        `Birthday` = '".$sn."' WHERE `id` =$user_id LIMIT 1 ;";


        if ($sua=mysql_query($sql))
            echo $thanhcong;
        else
            echo $kothanh;

        if ($_POST['pass']!="") {
            $sqlx="UPDATE `members` SET `password` = '".$pass."' WHERE `id` = '$user_id' LIMIT 1 ;";
            $suapass=mysql_query($sqlx);
            if ($suapass)
                echo "(Đã đổi pass) ";
            else
                echo "(Chưa đổi pass) ";
        }
    }
    else
        echo"
        <form method='POST' action='?do=sua'>
            <table border='1' width='100%' id='table1' cellspacing='0' cellpadding='0' style='border-collapse: collapse' bordercolor='#C0C0C0'>
                <tr>
                    <td>Tên:</td>
                    <td><input type='text' value='{$member['Name']}' name='name' size='20'></td>
                </tr>
                <tr>
                    <td>URL:</td>
                    <td><input type='text' value='{$member['URLS']}' name='url' size='20'></td>
                </tr>
                <tr>
                    <td>Sinh Nhật:</td>
                    <td><input type='text' name='sn' value='{$member['Birthday']}' size='20'></td>
                </tr>
                <tr>
                    <td>Email:</td>
                    <td><input type='text' name='email' value='{$member['email']}' size='20'></td>
                </tr>
                <tr>
                    <td>Pass:</td>
                    <td><input type='password' name='pass' size='20'></td>
                </tr>
            </table>
            <p align='center'><input type='submit' value='Sửa'><input type='reset' value='Khôi phục' name='B2'></p>
        </form>
        ";
}
?>
Chúc các bạn thành công!

Lưu ý:
Các bạn nên dùng các trình soạn thảo chuyên cho lập trình để tạo các file trên, Nếu dùng Notepad của window thì có thể sẽ bị lỗi khởi động session nếu lưu dạng UTF-8, còn nếu lưu dạng Ascii thì lại bị lỗi font
Ví dụ đính kèm - Download 
Nguồn:Sinhvienit

Wednesday, April 1, 2015

Giaó Trình Trí Tuệ Nhân Tạo

20Me Reviews     12:44 PM    
Sự phát triển của khoa học công nghệ ngày càng lớn mạnh, giúp cho con người tạo ra nhiều sản phẩm từ điện tử, cơ khí, robots. Nhằm phục vụ tốt nhu cầu thiết yếu của con người. Giup con người làm những điều mà tưởng như không thể và đó được gọi là Trí Thông Minh Nhân Tạo. Vậy trí thông minh nhân tạo là gì chúng ta cùng tìm hiểu sâu hơn qua bộ giáo trình sau 

Gíao Trình hệ cơ sở dữ liệu và bài tập

20Me Reviews     12:34 PM    

Hệ cơ sở dữ liệu là tập hợp các dữ liệu có liên quan với nhau, chứa thông tin của 1 đối tượng nào đó ( như trường học, bệnh viện, ngân hàng, nhà máy...) được phép lưu trữ trên bộ nhớ của máy tính để đáp ứng nhu cầu khai thác thông tin của người sử dụng trong những mục đích khách nhau
Download tài liệu giáo trình | Download Bài Tập thực hành

Thursday, November 20, 2014

Tạo báo cáo với Crystal Report dùng store procedure với parameter C# VS 2010

20Me Reviews     10:40 AM    
Bài này hướng dẫn các bạn tạo báo cáo các hóa đơn bán hàng từ ngày, đến ngày với crystal report, truy vấn dữ liệu qua store procedure có nhiều parameter: từ ngày, đến ngày, cơ sở dữ liệu sql server 2008 .

 1. Slide hướng dẫn/ contractor slide
Tạo Crystal Report dùng Store Procedure
2. Source code: download

Thursday, October 23, 2014

Serie 14 video Hướng dẫn sử dụng WOOCOMMERCE

20Me Reviews     1:02 PM    
Sau nhiều ngày chuẩn bị và liên tục quay và chỉnh sửa thì mình đã hoàn thành một bộ serie video Hướng dẫn Woocommerce bao gồm 14 tập dành cho những bạn nào đang cần nắm được cách sử dụng và thiết lập của plugin thương mại điện tử đình đám này.
Video này có 14 phần bao gồm những phần như sau:
Hy vọng nó sẽ có ích cho các bạn.

Tuesday, June 10, 2014

Hướng dẫn tạo shop bán hàng trên facebook fanpage

20Me Reviews     6:55 PM    
Bước 1 các bạn tạo cho mình 1 fanpage trên facebook
bước 2 thiết lập các giá trị mặc định
Bước 3. Tôi xin hướng dẫn cách tạo 1 app bán hàng ngay trên fanpage
Các bạn vào fanpage sau đó click vào thanh tìm kiếm và tìm : static html ifame tab by woobox
- sau đó các bạn chọn " Install page tab"
- nó sẽ hỏi bạn muốn add tab vào page nào, các bạn nhìn xuống dưới và chọn cho mình page muốn add sau đó nhấn Add/ Thêm thẻ trang
tiếp theo nó sẽ đưa bạn đến trang quản trị nội dung
Bước 4 : cài đặt nội dung
các bạn sẽ thấy 4 lựa chọn ở bên dưới " HTML, URL, IMAGE, REDICREC"
tôi sẽ giải thích 4 nhóm :
url: bạn tạo đường link hiển thị trên tab để người dùng trỏ đến trang shop của bạn
html: nếu bạn có kiến thức về html, css bạn sẽ tạo được nội dung code shop và bạn chỉ cần dán nội dung đó vào khung
image : thêm hình ảnh vào tab vd ảnh sản phẩm của bạn
sau khi thêm nội dung cho page bạn kéo xuống dưới phần Tab Name  đây là phần tên shop bạn muốn hiển thị trên page
Bước 5 chọn save setting
VÀ BÂY GIỜ BẠN CÓ THỂ VÀO FACEBOOK FANPAGE CỦA BẠN ĐỂ XEM THÀNH QUẢ

NẾU MUỐN CHỈNH SỬA NỘI DUNG BẠN CÓ THỂ NHẤP VÀO TAB SHOP CỦA BẠN VÀ CHỌN TAB SHOP CỦA BẠN
ở đây nó sẽ hỏi bạn có muốn chuyển không bạn nhấn " Cancel"
sau đó vào chọn setting chỉnh sửa tùy ý
ngoài ra bạn có thể thêm bản đồ, video trên youtube vào shop của bạn trên fanpage bằng cách thêm mã code vào khung html
Mọi thắc mắc bạn có thể để lại cmt bên dưới nhé thân

Hướng dẫn chuyển tất cả các sub domain về trang chủ bằng file .htaccess

20Me Reviews     6:22 PM    
Bạn chỉ cần vào Đó là vào cpanel, tạo 1 subdomain, ở địa chỉ thư mục thì để ở trang index của bạn (mặc định nó sẽ trỏ vào 1 folder nào đó), còn giá trị thì đặt là *
Một số bạn làm theo cách cũ là đặt giá trị record vào dns setting nhưng không phải ai cũng làm được, cũng chẳng biết sao.
Ở trang bạn trỏ subdomain giá trị * này vào thì đặt htaccess có nội dung này:

<IfModule mod_rewrite.c>
RewriteEngine on


RewriteCond %{HTTP_HOST} !^www\.phpn\.in$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.phpn\.in$ [NC]
RewriteRule !^index\.php($|/) %2%{REQUEST_URI} [PT,L]
</IfModule>

Ý nghĩa của nó là sẽ chuyển mọi sub domain thành có dạng

subdomain.abc.com -> abc.com/subdomain (subdomain ở đây không phải là folder), bạn có thể chỉnh lại dòng thứ 3 tuỳ ý theo kiểu
abc.com/phim?id=subdomain:


RewriteRule !^index\.php($|/) phim?id=%2%{REQUEST_URI} [PT,L]

Hướng dẫn cách chuyển link bằng .htaccess

20Me Reviews     6:19 PM    
Vd:  có link dạng domain.com/ten-bai-viet.123.html domain.com/ten-bai-viet-2.123.html .......
mình muốn khi vào domain.com/ten-bai-viet.123.html thì nó tự chuyển thành domain.com/ten-bai-viet_123.html
vào domain.com/ten-bai-viet-2.123.html thì nó tự chuyển thành domain.com/ten-bai-viet-2_123.html 
khác nhau ở chỗ dấu . và dấu _
các bạn làm như sau :
RewriteRule ^([a-zA-Z0-9\-]+).([0-9]+).html http://www.domain.com/$1_$2.html [R=301,L]

Thursday, May 22, 2014

Thiết kế web bằng joomla

20Me Reviews     2:35 PM    
Chào các bạn, hôm nay mình viết bài này vơi mong muốn chia sẻ cho các bạn vừa mới học joomla có thể hệ thống lại các bước để tạo ra website bằng joomla, quản lý web joomla, thiết kế template joomla… một cách dễ dàng hơn đây cũng là một trong những chủ đề chính của blog và hiển nhiên là sẽ update liên tục các bạn nhớ theo dõi nha!
Joomla là gì?
Đầu tiên joomla là một website chạy bằng ngôn ngữ php và mysql, joomla là một CMS hệ quản trị nội dung chuyên nghiệp. Joomla là website mã nguồn mở, được ra đời cũng khá lâu nên joomla được một cộng đồng phát triển cực kỳ lớn trên toàn thế giới. Cũng chính vì thế nên có một số lượng templates, modules khổng lồ cho bạn sử dụng.
Có người nói với tôi là có khoảng 80% website Việt Nam là sử dụng mã nguồn joomla, tôi nghĩ là đúng như thế! Từ website tin tức, website cho doanh nghiệp, đặc biệt là website thương mại điện tử vừa và nhỏ đa số sử dụng joomla.
thiet ke web bang joomla
Thiết kế web bằng joomla
Như tôi nói trong bài sử dụng wordpress những gì chúng ta tự làm ra mới thực sự thích và cảm thấy tâm đắt về điều đó hii… Joomla là một mã nguồn cho phép bạn custom rất nhiều thứ gần như là thỏa sức tùy biến đặt biệt là việc thiết kế template joomla.
Vậy là chúng ta có những khái niệm tổng quát đầu tiên rồi, bây giờ thì đi thiết kế web bằng joomla thôi hãy cùng tôi, học, trao đổi nha các bạn.
Hướng dẫn cài đặt joomla
Như đã nói joomla chạy trên nền PHP và MySQL nên bạn phải có host php hay localhost để học tập cũng được, tiến hành cài đặt Appserv.
Tiếp đến bạn vào site joomla.org đây là website chính cung cấp mã nguồn joomla, plugin, mod… Bạn nên vào đây download và tham khảo để đảm bảo an toàn cũng như xài được hàng chính hãng hii…
Sau đó bạn giải nén và copy vào trong thư mục gốc của Appserv và tiến hành cài đặt.
Cài đặt - Thiết kế web joomla
Cài đặt - Thiết kế web joomla
Quản trị joomla
Sau khi cài đặt bạn sẽ được website đơn giản òi! Bây giờ chúng ta sẽ tìm hiểu cách quản lý joomla, bạn sẽ tìm hiểu về cách phân quyền, tạo categories, tạo section, article và còn nhiều khái phần quan trọng khác nữa.

Ebook dạy PHP Online

20Me Reviews     2:16 PM    
PHP là 1 mã nguồn mở thông dụng dễ học , đa phần là tự học là chính, Php giúp trang web trở lên sinh động hơn, hấp dẫn , bảo mật tốt . Ngày càng được dân lập trình ưa thích
Download Tại Đây

Hướng Dẫn Lập Trình Visual C

20Me Reviews     2:10 PM    
Download Here

giáo Trình Cơ Sở Dữ Liệu Nâng Cao - DHKHTN

20Me Reviews     1:52 PM    
GIÁO trình cấu trúc dữ liệu đại học khoa học tự nhiên, các bạn download về tham khảo nhé !

Bài giảng SQL

20Me Reviews     1:48 PM    
Tải Về giáo Trình SQL : Download Here

Cơ bản về regular expression trong C#

20Me Reviews     10:10 AM    

1. Giới thiệu:
RE là một ngôn ngữ cực mạnh dùng mô tả văn bản cũng như thao tác trên văn bản. Một RE thường được ứng dụng lên một chuỗi, nghĩa là lên một nhóm ký tự.
Chẳng hạn, ta có chuỗi sau:
Mot, Hai, Ba, Bon, NEVERLAND.
Bạn có thể trả về bất cứ hoặc tất cả các chuỗi con của nó (Hai hoặc Bon chẳng hạn) hoặc thay đổi phiên bản của những chuỗi con của nó (Mot hoặc BoN chẳng hạn).

Một RE là một kiểu mẫu văn bản gồm 2 phần: literal (trực kiện) và metacharacters (ký tự siêu).

  • Một literal đơn thuần chỉ là một ký tự (a-z) mà bạn muốn đem so khớp với chuỗi đích.
  • Metacharacters là một ký tự đặc biệt hoạt động như là 1 mệnh lệnh đối với bộ phận phân tích ngữ nghĩa (parser) của RE

Bây giờ chúng ta thử tạo một regular expression như sau:

Code:
^(From|To|Subject|Date):



RE này sẽ khớp với bất cứ chuỗi con nào miễn là chuỗi này là một hàng mới bắt đầu với “From” hoặc “To” hoặc các chữ “Subject” hoặc “Date” (Dấu ^ nghĩa là bắt đầu 1 hàng mới) chuỗi này kết thúc bởi dấu hai chấm (:).

Dấu ^ cho bộ parser của RE biết chuỗi mà ban đang truy tìm phải bắt đầu bởi một hàng mới. Các chữ “From”, “To”,.. là những literal, và những metacharacter “(“, “)”, và “|” được dùng để tạo nhóm literal và cho biết bất cứ những lựa chọn nào cũng phải khớp. Dấu ^ cũng là metacharacter, nó cho biết là khởi đầu 1 hàng. Do đó, bạn đọc hàng sau đây:

Code:
^(From|To|Subject|Date):
Như sau: “cho khớp bất cứ chuỗi con nào bắt đầu bởi một hàng mới theo sau bởi bất cứ 4 chuỗi literal: From,To,Subject và Date rồi theo sau bởi dấu hai chấm

2. Các ký tự siêu thường dùng (vô cùng quan trọng cần phải nắm)

. : đại diện cho 1 ký tự bất kỳ trừ ký tự xuống dòng \n.
\d : ký tự chữ số tương đương [0-9]
\D : ký tự ko phải chữ số
\s : ký tự khoảng trắng tương đương [ \f\n\r\t\v]
\S : ký tự không phải khoảng trắng tương đương [ ^\f\n\r\t\v]
\w : ký tự word (gồm chữ cái và chữ số, dấu gạch dưới _ ) tương đương [a-zA-Z_0-9]
\W : ký tự không phải ký tự word tương đương [^a-zA-Z_0-9]
^ : bắt đầu 1 chuỗi hay 1 dòng
$ : kết thúc 1 chuỗi hay 1 dòng
\A : bắt đầu 1 chuỗi
\z : kết thúc 1 chuỗi
| : ký tự ngăn cách so trùng tương đương với phép or (lưu ý cái này nếu muốn kết hợp nhiều điều kiện)
[abc] : khớp với 1 ký tự nằm trong nhóm là a hay b hay c.
[a-z] so trùng với 1 ký tự nằm trong phạm vi a-z, dùng dấu - làm dấu ngăn cách.
[^abc] sẽ không so trùng với 1 ký tự nằm trong nhóm, ví dụ không so trùng với a hay b hay c.
() : Xác định 1 group (biểu thức con) xem như nó là một yếu tố đơn lẻ trong pattern .ví dụ ((a(b))c) sẽ khớp với b, ab, abc.
? : khớp với đứng trước từ 0 hay 1 lần. Ví dụ A?B sẽ khớp với B hay AB.
* : khớp với đứng trước từ 0 lần trở lên . A*B khớp với B, AB, AAB
+ : khớp với đứng trước từ 1 lần trở lên. A+B khớp với AB, AAB.
{n} : n là con số, Khớp đúng với n ký tự đúng trước nó . Ví dụ A{2}) khớp đúng với 2 chữ A.
{n, } : khớp đúng với n ký tự trở lên đứng trước nó , A{2,} khớp vói AA, AAA ...
{m,n} : khớp đùng với từ m->n ký tự đứng trước nó, A{2,4} khớp vói AA,AAA,AAAA.

Lấy địa chỉ IP trong lập trình C#,VB.NET,ASP.NET,C,C++,Dephi,VB,JAVA,ASP

20Me Reviews     10:08 AM    
Đối với các lập trình viên ít nhất một lần cũng phải có nhu cầu lấy địa chỉ IP (Internet Protocol) cho việc phát triển ứng dụng. Ví dụ để phục vụ cho việc ghi log truy cập, chống đăng nhập nhiều tài khoản cùng một IP, chặn truy cập thông qua IP,… Thông qua những đoạn mã tổng hợp dưới đây, tôi hy vọng nó sẽ hữu ích trong việc tra cứu của các bạn khi cần. Một số ngôn ngữ như là C#, Delphi, VB.NET, VB, C, Java, ASP.NET, PHP, ASP.



using System;
using System.Net;
 
namespace GetIPCS
{
 ///
 /// Gets IP addresses of the local machine
 ///
 class classGetIPCS
 {
  ///
  /// Gets IP addresses of the local machine
  ///
  [STAThread]
  static void Main(string[] args)
  {
   // Get host name
   String strHostName Dns.GetHostName();
   Console.WriteLine("Host Name: " strHostName);
 
   // Find host by name
   IPHostEntry iphostentry Dns.GetHostByName(strHostName);
 
   // Enumerate IP addresses
   int nIP 0;
   foreach(IPAddress ipaddress in iphostentry.AddressList)
   {
    Console.WriteLine("IP #" + ++nIP ": " +
                      ipaddress.ToString());
   }
  }
 }
}
 
2. Delphi

Code:
uses  Winsock;
 
function getIPs: Tstrings;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  Buffer: array[0..63] of Char;
  I: Integer;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  Result := TstringList.Create;
  Result.Clear;
  GetHostName(Buffer, SizeOf(Buffer));
  phe := GetHostByName(buffer);
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  I    := 0;
  while pPtr^[I] &lt;&gt; nil do
  begin
    Result.Add(inet_ntoa(pptr^[I]^));
    Inc(I);
  end;
  WSACleanup;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetIps.text);
end;
 











3. VB.NET

Code:
Private Sub IPAddress()
'To get local address
    Dim LocalHostName As String
    Dim i As Integer
    LocalHostName = Dns.GetHostName()
    Dim ipEnter As IPHostEntry = Dns.GetHostByName(LocalHostName)
    Dim IpAdd() As IPAddress = ipEnter.AddressList
    For i = 0 To IpAdd.GetUpperBound(0)
    Next
End Sub
4. C
// Borland C++ 5.0: bcc32.cpp getlocalip.cpp
// Visual C++ 5.0: cl getlocalip.cpp wsock32.lib
//
// This sample program is hereby placed in the public domain.
 
#include
#include 
 
int doit(int, char **)
{
    char ac[80];
    if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) {
        cerr < < "Error " << WSAGetLastError() <<
                " when getting local host name." << endl;
        return 1;
    }
    cout << "Host name is " << ac << "." << endl;
 
    struct hostent *phe = gethostbyname(ac);
    if (phe == 0) {
        cerr << "Yow! Bad host lookup." << endl;         return 1;     }     for (int i = 0; phe->h_addr_list[i] != 0; ++i) {
        struct in_addr addr;
        memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
        cout < < "Address " << i << ": " << inet_ntoa(addr) << endl;
    }
 
    return 0;
}
 
int main(int argc, char *argv[])
{
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
        return 255;
    }
 
    int retval = doit(argc, argv);
 
    WSACleanup();
 
    return retval;
}
}













 5. Java
 
import java.net.*;
import java.io.*;
 
public class GetIPAddress
{
    public static void main(String [] args)
    {
        try
        {
            InetAddress thisIp =InetAddress.getLocalHost();
            System.out.println("IP:"+thisIp.getHostAddress());
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

6. ASP
string ip;
ip=Request.ServerVariables("HTTP_X_FORWARDED_FOR");
if(ip==string.Empty)
{
ip=Request.ServerVariables("REMOTE_ADDR");
}
8. PHP

PHP Code:
$ip=$_SERVER['REMOTE_ADDR']; 
9. ASP
Code:
<% Response.Write Request.ServerVariables("REMOTE_ADDR") %>
Thật đơn giản để sử dụng đúng không nào , Chúc vui !

Delegates và Events trong C#

20Me Reviews     9:58 AM    
Có một thực tế đang xảy ra đó là nhiều người rất hay nhầm lẫn giữa hai khái niệm Delegate và Event, đặc biệt là đối với những người mới làm quen với ngôn ngữ C# nói riêng và các ngôn ngữ khác thuộc nền tảng .NET nói chung; Và ngay cả đối với những lập trình viên đã có thâm niên thì cũng không phải dễ dàng gì có thể phân biệt được rạch ròi sự khác nhau giữa hai khái niệm này. Bài viết này sẽ đưa ra một số phân tích, so sánh, qua đó mong muốn có thể làm rõ hơn bản chất của hai khái niệm Delegate và Event, và giúp chúng ta thấy rõ hơn được sự khác nhau cũng như mối quan hệ giữa chúng.

1. Delegate

Theo như định nghĩa được đưa ra trên MSDN thì delegate là một kiểu chứa tham chiếu đến một hoặc nhiều phương thức (method), có thể là phương thức của lớp (class’s method) hoặc là phương thức của đối tượng (object’s method). Đối với những ai đã làm việc với ngôn ngữ C hoặc C++ thì có thể thấy delegate gần giống với khái niệm Con trỏ hàm (funtion’s pointer). Tuy nhiên, hiện nay trong nhiều tài liệu vẫn hay dùng chung từ delegate để chỉ đến hai khái niệm khác nhau, gây ra sự mập mờ, đó là Kiểu delegate(delegate type) và Thực thể delegate (delegate instance, hay còn có thể gọi là Đối tượng delegate); Do đó, trong bài viết này chúng ta sẽ không sử dụng từ delegate với nghĩa chung như vậy mà sẽ phân biệt rạch ròi giữa kiểu delegate và đối tượng delegate.
Một kiểu delegate được khai báo bằng cách sử dụng từ khóa delegate đi kèm theo với kiểu dữ liệu trả về, tên và danh sách tham số của nó. Để một delegate có thể chứa tham chiếu đến một phương thức khác (hoặc đôi khi ta có thể nói là: delegate đại diện cho một phương thức) thì cả delegate và phương thức mà nó tham chiếu đến phải có cùng nguyên mẫu (signature), có nghĩa là cả hai đều phải có chung kiểu dữ liệu trả về và danh sách tham số.
Ta sẽ xét một ví dụ mà ở đó có một delegate với tên là Calculation được khai báo, kiểu delegate này có kiểu dữ liệu trả về là int, nhận vào hai tham số thuộc kiểu int; Một đối tương của delegate Calculation được tạo ra và tham chiếu đến phương thức Add() của lớpProgram, chúng ta có thể để ý rằng cả kiểu delegate Calculation và phương thức Add() có kiểu dữ liệu trả về và danh sách tham số giống nhau.
namespace Test
{
    public delegate int Calculation(int a, int b);
    class Program
    {
        static int Add(int a, int b){
            return a + b;
        }
        static void Main(string[] args)
        {
            Calculation ca = new Calculation(Add);
            int c = ca(5, 4);
            Console.WriteLine(“c = {0}”, c);
            Console.ReadLine();
        }
    }
}
 Một cách dùng khác của delegate đó là kỹ thuật sử dụng delegate để truyền một phương thức vào như là tham số của một phương thức khác, ta cùng xem ví dụ sau:
using System; namespace Test {
public delegate int Calculation(int a, int b); class Program {
static int Add(int a, int b) {
return a + b;
} static int Sub(int a, int b) {
return a – b;
}
static int Calculate(int a, int b, Calculation cal) {
return cal(a, b);
} static void Main(string[] args) {
int c = Calculate(5, 4, Add); Console.WriteLine(“c = {0}”, c); int d = Calculate(5, 4, Sub); Console.WriteLine(“d = {0}”, d); Console.ReadLine();
}
}
}
Ở ví dụ trên thì ta đã tạo ra một phương thức Calculate() có hai tham số kiểu int và một tham số thuộc kiểu delegate Calculation, với cách làm này thì sau này, khi đem ra sử dụng hàm Calculate() thì ta hoàn toàn có thể tự do truyền vào bất cứ hàm nào để thực hiện tính toán, miễn sao hàm đó phải có cùng nguyên mẫu với kiểu delegate Calculation. Cách làm này còn được sử dụng để triển khai kỹ thuật callback, để tránh làm cho bài viết quá dài thì những ai quan tâm tới vấn đề này, xin vui lòng tìm hiểu thêm ở đây và ở đây.

2. Event

Điều đầu tiên mà chúng ta cần khẳng định đó là: Event không phải là đối tượng delegate. Để giúp chúng ta có thể thấy rõ được bản chất của  event cũng như sự khác nhau giữa event và delegate thì chúng ta sẽ mượn hai khái niệm khác cũng được sử dụng rất phổ biến trong ngôn ngữ C# đó là Field và Property. Nhìn từ bên ngoài thì Property có vẻ rất giống với Field nhưng bản chất thì Property không phải là Field; Field là một biến, nó chứa dữ liệu, còn Property là một khối lệnh, nó giống với Method hơn. Trong một Property thì ta có hai khối lệnh có thể được khai báo đó là get và set còn Field thì chỉ được khai báo trên một dòng. Thông thường thì người ta sử dụng các Property như là cách để truy xuất đến các Field của lớp đó, như trong ví dụ sau:
class Customer {
private string name;
public string Name {
get {
return this.name;
} set{
this.name = value;
}
}
}
Nhưng đôi lúc ta cũng có thể tạo ra các Property mà không dính dáng gì đến Field cả:
class TimeUtil {
public DateTime CurrentTime{
get {
return DateTime.Now;
}
}
}
 Và với sự cải tiến không ngừng của C# nói riêng và .NET nói chung thì bây giờ ta có thể khai báo Property với dạng như sau:
class Customer {
public string Name {
get;
set;
}
}
Nhìn khối lệnh trên thì thật đơn giản phải không, và hình như là không có bất cứ một Field nào được khai báo trong đó cả, nhưng thực tế thì nó lại khác. Trình biên dịch sẽ tự động tạo ra một field có kiểu string rồi sau đó sử dụng nó để triển khai property Name, và như vậy, đoạn code ở trên thực ra chỉ là một phiên bản rút gọn của lớp Customer mà chúng ta đã xem xét trước đó. Bây giờ thì chúng ta đã nắm rõ ràng hơn về bản chất của Field và Property, chúng ta quay lại trường hợp của Delegate và Event, có thể nói rằng mối liên quan giữa Delegate và Event không khác với mối liên quan giữa Field và Property là mấy. Thông thường, để xây dựng một Event thì ta thực hiện như ví dụ sau:
public delegate void ErrorNotification(string message);
class MyMachine{
public event ErrorNotification Notify;
public void ReportError(string error) {
if (Notify != null)
Notify(error);
}
}
và sử dụng:
static void Main(string[] args) {
MyMachine machine = new MyMachine();
machine.Notify += new ErrorNotification(PrintString);
machine.ReportError(“Some bug ocurred”);
Console.ReadLine();
}
static void PrintString(string msg){
Console.WriteLine(msg);
}
Ở ví dụ trên thì ta đã khai báo một kiểu delegate có tên là ErrorNotification, sau đó sử dụng nó để tạo một event cho lớp MyMachine với tên là Notify. Nhìn vào đoạn code đó thì sẽ có nhiều người cho rằng event được tạo ra bằng cách tạo một đối tượng mới của kiểu delegate ErrorNotification, nhưng thực tế thì không hề đơn giản như vậy. Một Event thực chất là một khối lệnh, tương tự như Property, nó cũng có hai khối lệnh con được khai báo trong đó là add và remove; khối lệnh add được dùng để đăng ký một phương thức với event, còn khối lệnh remove được dùng để gỡ bỏ một phương thức ra khỏi event đó. Đây chính là cách khai báo một event ngắn gọn, và dễ gây ra nhầm lẫn, ta thử viết lại đoạn code của lớp MyMachineở dạng nguyên thủy của nó:
class MyMachine{
private ErrorNotification notify;//Delegate instance
//Event declaration
public event ErrorNotification Notify{
add{
this.notify += value;
}
remove{
this.notify -= value;
}
}
public void ReportError(string error) {
if (notify != null)
notify(error);
}
}
và đem ra sử dụng:
static void Main(string[] args) {
MyMachine machine = new MyMachine();
machine.Notify += new ErrorNotification(PrintString);
machine.ReportError(“Some bug ocurred”);
Console.ReadLine();
}
static void PrintString(string msg){
Console.WriteLine(msg);
}
Hãy chú ý đến cái cách mà chúng ta đã khai báo event Notify của lớp MyMachine với hai khối lệnh add và remove bên trong. Và với cách triển khai cụ thể như vậy, ta có thể dễ dàng thấy rằng Event thực chất là cái cách mà chúng ta sử dụng để truy xuất đến một private delegate ở bên trong một lớp; Ở đây thì value có kiểu là ErrorNotification . Bây giờ thì bạn đã tin cái câu khẳng định trước đó chưa? Event không phải là đối tượng delegate. Và chắc bạn cũng đã thông cảm được với việc tại sao chúng ta lại dựa vào Field và Property để có dẫn dắt vào vấn đề tương quan giữa Delegate và Event, bởi vì thực sự nó có sự tương đồng nhau mà. Tóm lại thì cách khai báo event có dạng:
public event EventHandler MyEvent
chỉ là một cách viết ngắn gọn, và nó còn có tên gọi là field-like event.

3. Mấu chốt của vấn đề

Tại sao lại cần thiết phải có cả hai khái niệm là delegate và event? Câu trả lời ở đây chính là Encapsulation (tính bao gói).
Đâu là cách để đăng ký một event cho một đối tượng nào đó? Có ba sự lựa chọn:
- Một là, tạo một đối tượng delegate với mức truy cập là public, cách này thì chắc chắn là bị loại đầu tiên, vì nó không đảm bảo được sự đóng gói của đối tượng.
- Cách thứ 2, tạo một đối tượng delegate có mức truy cập là private và đồng thời tạo ra một property để truy xuất đến đối tượng delegate đó; cách này thì khá hơn cách trước, nhưng nhược điểm của nó là ta có thể sẽ có khó khăn khi muốn đăng ký nhiều phương thức với sự kiện này, bởi vì nó chỉ có thể nhận vào một phương thức mà thôi, ví dụ: someInstance.MyEvent = eventHandler, như vậy thì nó sẽ xóa mất phương thức mà trước đó MyEvent đã tham chiếu đến, chú ý đến toán tử “=” chứ không phải là  ”+=” (Propety thì không thể dùng với toán tử +=).
- Cách thứ 3, và cũng là cách mà ta đang sử dụng, đó là tạo một đối tượng delegate rồi sau đó tạo hai khối lệnh dùng để add và remove các đối tượng delegate. Với cách thứ 3 thì ta đã bảo đảm được tính bao gói một cách toàn diện. Và cách thứ 3 khi được viết ngắn gọn thì chính là cái cách mà chúng ta vẫn thường dùng, kể từ khi bắt đầu làm quen với events.

4. Một vài sự khác nhau về cách sử dụng của Delegate và Event

Event có thể được khai báo trong interface, Delegate thì không.
Event chỉ có thể được gọi (invoked) ở bên trong class chứa nó, Delegate thì có thể được gọi ở bất cứ đâu (Tùy thuộc vào access modifier).

5. Kết luận

Delegate cung cấp cho ta một cách đơn giản để có thể đại diện cho các lời gọi của phương thức, đặc biệt là các phương thức của đối tượng. Delegate được sử dụng để triển khai các event.
Trong khi đó, event là cách để một lớp có thể đưa ra các thông báo (notification) đến các lớp khác khi có một sự kiện nào đó xảy ra với bản thân nó. Lớp tung ra event được gọi là publisher, còn lớp nhận và xử lý các event này được gọi là Subcriber.
Event và Delegate là một cách mà C# sử dụng để triển khai cơ chế Observer Pattern (cũng còn được gọi là mô hình Publisher/Subcriber), điều mà trong Java thì được thực hiện bởi  các ActionListener.
Nguồn: http://tapchilaptrinh.wordpress.com

© 2014-2015 Ebook-Coding Share and Learning | Distributed By My Blogger Themes | Designed By Ebook-coding