Hiển thị các bài đăng có nhãn Căn bản lập trình web với PHP. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Căn bản lập trình web với PHP. Hiển thị tất cả bài đăng

Thứ Bảy, 13 tháng 3, 2021

Học lập trình web căn bản với PHP


Bài 1: Các kiến thức căn bản

Part 1: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac.html

Part 2: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac_06.html

Part 3: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac_79.html


Bài 2: HTML - Ngôn ngữ đánh dấu văn bản

Part 1: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-2.html

Part 2: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-2_06.html

Part 3: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-2_8467.html

Part 4: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-2_5561.html

Part 5: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-2_8323.html

Part 6: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-2_3456.html


Bài 3: Định dạng HTML nâng cao với CSS

Part 1: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-3-inh.html

Part 2: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-3-inh_06.html

Part 3: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-3-inh_6370.html

Part 4: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-3-inh_3457.html


Bài 4: Kiến thức lập trình PHP căn bản

Part 1: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php.html

Part 2: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_06.html

Part 3: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_4632.html

Part 4: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_6366.html

Part 5: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_891.html

Part 6: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_2455.html

Part 7: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_5054.html

Part 8: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_517.html

Part 9: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_6579.html

Part 10: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_4969.html

Part 11: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_9882.html

Part 12: https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-4-php_1303.html


Chủ Nhật, 6 tháng 5, 2012

Căn bản lập trình web voi PHP - Bài 4(X) : PHP Căn Bản

X. "Headers Already Sent " : Thực trạng và giải pháp

Lỗi "Headers Already Sent " là 1 lỗi thông dụng đến khó tin, và tui đã nhận được rất rất nhiều câu hỏi về nó dạng như " Nó là cái gì ?, Sao lại như thế" , vì vậy tui quyết định đưa nó lên bàn mổ nhằm làm sáng tỏ vấn đề

Một HTTP response ( trả về ) thông thường bao gồm 2 phần là header( đầu) và content (nội dung), Phần header trong 1 HTTP response chỉ ra bản chất của response và  cách xử lý với chúng. Ví dụ, 1 response có chỉ ra "Location" trong header , cái này báo cho trình duyệt để tự động chuyển đến Url được chỉ ra trong header.Hoặc 1 response có "Content-type" trong header, trình duyệt sẽ xử lý nội dung theo loại nội dung :image xử khác , text xử khác, Flash xửa khác
Header cũng được sử dụng khi bạn làm việc với session, có thể bạn ko thấy rõ được điều này, nhưng trong những hàm về session của PHP nó đều dùng thông qua cookie. Vì thế ngay khi bạn dùng session bạn đã tạo ra 1 HTTP header. Hàm session_start() khởi tạo 1 tập cookie và vì thế nó gửi 1 HTTP header xuống trình duyệt.
Phần còn lại của HTTP response là nội dung (content), cái này chắc bạn nhìn thấy nó dễ dàng rồi. Phần này phải được gửi đi sau headers, và một khi nội dung đã được gửi đi thì sẽ ko có header nào có thể được gửi xuống trình duyệt nữa. Nội dung bao gồm các đoạn mã HTML hoặc bất cứ thứ gì được tạo ra trong script của bạn. Khi bạn gọi echo() bạn đã xuất nội dung xuống trình duyệt rồi đấy.

Thế thì liên quan gì đến lỗi "Headers Already Sent"? Lỗi này xuất hiện khi bạn cố gắng gửi 1 HTTP header xuống trình duyệt sau khi nội dung đã được gửi xuống. Trong một HTTP response đều này là phạm pháp , ko được phép bởi vì " gạo đã nấu thành cơm"  , trình duyệt đã xử lý xong phần nội dung được gửi xuống rồi, header ko còn tác dụng gì nữa cả .

Và như tớ đã nói ở trên, session_start() gửi header xuống client, hàm header() cũng gửi header xuống ... vì thế 2 thằng này là dễ gặp lỗi "Headers Already Sent" nhất nếu như đã gửi nội dung xuống trình duyệt trước khi gọi chúng.

Giải pháp cho vấn đề này đơn giản chỉ là : hãy chắc chắn rằng bạn không gửi bất cứ nội dung gì xuống trình duyệt trước khi gọi các hàm có làm việc với header.Nói thì như thế nhưng thực tế cũng khá khó khăn vì ... chúng ta là người Việt, chúng ta phải viết tiếng Việt trong code , chúng ta phải dùng Unicode ... và đa số các Editor PHP , khi bạn chọn encoding cho file là Utf-8 nó sẽ vô tư kèm theo cho bạn 3 kí tự ở đầu file gọi là BOM (byte order mark) ( dịch ra là gì thì tớ ko biết ), các kí tự này thuộc dạng vô hình nên chúng ta sẽ ko nhìn thấy chúng , nhưng máy tính thì thấy.... vì thế cho nên bạn có bỏ ra cả tháng trời để ngồi mò mẫm trong code xem có kí tự nào được xuất ra hay chưa thì cũng vô vọng . Cách đơn giản nhất là hãy chọn Utf-8 witthout BOM trong Editor của bạn .

Nhưng có một giải pháp khác an toàn nhàn nhã hơn là hãy giao tất cả những gì bạn xuất ra cho bộ đệm (output buffering ) nắm giữ, sau khi xử lý xong tất cả sẽ được cho vào đại pháo bắn 1 lần xuống trình duyệt ... không cần lo sau trước thứ tự gì nữa cả . Hãy thêm vào đầu code của bạn ob_start() và cuối code ob_end_flush(), bạn có thể vừa code vừa ngủ , để biết thêm về những hàm output buffering  hãy tìm đến PHP Manual .
 

Căn bản lập trình web voi PHP - Bài 4(IX) : PHP Căn Bản

IX. Sử dụng Session trong PHP

Trang web HTML thông thường sẽ ko thể truyền dữ liệu từ trang này sang trang khác. Nói 1 cách khác là : tất cả thông tin trở thành quên lãng khi một trang web mới được tải . Điều này gây khó khăn cho một số công việc như là mua hàng ( shopping carts) - những thứ cần thiết dữ liệu ( sản phẩm người dùng đã chọn) ghi nhớ từ trang này sang trang khác

Khái niệm về Sessions trong PHP

PHP session giải quyết vấn đề này bằng cách cho phép lưu trữ dữ liệu của người dùng trên server để sử dụng về sau ( như username, món hàng ...)Tuy nhiên những thông tin session này chỉ là tạm thời và thường bị xoá đi ngay khi người dùng rời khỏi trang web đã dùng session.
Chính vì tính tạm thời này mà nếu bứng dụng của bạn cần thiết lưu trữ dữ liệu 1 cách lâu dài , bạn hãy dùng các cách lưu trữ khác như là csdl Mysql

Session hoạt động bằng cách tạo 1 chuỗi unique (UID) cho từng vistore và chứa thông tin dựa trên ID đó. việc này sẽ giúp tránh tình trạng dữ liệu bị xung đột giữa các user
Lưu ý: Nếu bạn vẫn còn ít kinh nghiệm về việc dùng session trong ứng dụng thì ko nên dùng nó trên các website đòi hỏi bảo mật cao vì rất dễ gây ra các lỗ hổng bảo mật nguy hiểm
Bắt đầu với PHP Session
Việc đầu tiên trước khi bạn làm bất cứ việc gì với session là bạn phải chạy nó trước, và nó dc đặt ngay trên đầu trong code của bạn, trước khi HTML dc xuất ra

Dưới đây là 1 ví dụ đơn giản về việc tạo session trong PHP

PHP Code:
Code:
<?php
session_start
(); // start up your PHP session! ?>

đoạn mã ngắn trên sẽ đăng kí cho ng dùng 1 session ở trên Server, cho phép bạn lưu thông thông tin của ng dùng và đưa nó vào UID cho session của user đó

Lưu giá trị của session

Khi bạn muốn lưu trữ 1 thông tin nào đó ở session, dc dùng như 1 mảng kết hợp. đó là nơi bạn lưu và lấy dữ liệu ra. sau đây là 1 ví dụ đơn giản cho việc đơn giản này ^^

PHP Code:
Code:
<?php
session_start
(); $_SESSION['views'] = 1; // lưu viewsecho "Pageviews = ". $_SESSION['views']; //lấy views và hiện thị?>
output:
Pageviews = 1

trong ví dụ này, chúng ta đã học dc cách lưu trữ của biến session thông qua mảng kết hợp $_SESSION và cũng như cách lấy nó ra

Sử dụng SESSION

Bây giờ chúng ta đã biết cách lưu và lấy dử liệu từ biến $_SESSION, mọi chuyện thật dễ dàng phải ko , và tiếp theo ta sẽ tìm hiểu 1 vài hàm liên qua đến session.
Khi bạn tạo 1 biến và lưu nó vào 1 session, bạn có lẽ muốn dùng nó sau này, tuy nhiên, trước khi bạn dùng biến session đó, bạn nên kiểm tra nó đã dc khởi tạo hay chưa.

Thao tác này được thực hiện thông qua hàm isset, isset là 1 hàm kiểm tra bất kì biến nào và nó đã dc khởi tạo và gán giá trị hay chưa.

Qua nhưng ví dụ trên, chúng ta có thể tạo 1 bộ đếm đơn giản cho 1 trang bằng cách sử dùng isset để kiểm tra nó đa dc tạo hay chưa và gán giá trị cho nó. Đây là 1 ví dụ:

PHP Code:
Code:
<?php
session_start
();
if(isset(
$_SESSION['views']))
    
$_SESSION['views'] = $_SESSION['views']+ 1;
else
    
$_SESSION['views'] = 1;

echo 
"views = ". $_SESSION['views']; ?>

Trong lần chạy đầu tiền của trangm câu lệnh If sẽ trả về false vì chưa có biến session [views] nào được tạo cả. tuy nhiên, khi bạn refresh lại trang đó, thì câu lệnh if sẽ trả về giá trị true và biến đếm counter sẽ tăng lên 1 đơn vị. và sẽ tăng cho mỗi lần chạy của trang đó lên 1.

Xóa và Hủy Session

Mặt dù dữ liệu trong session chỉ mang tính chất tạm thời và nó ko yêu cầu phải xóa sau khi sử dụng, nhưng có thể trong trường hợp nào đó bạn phải xóa dữ liệu của nó cho mục đích của bạn.
Hãy tưởng tượng bạn đang điều hành 1 doanh nghiệp online, và 1 thanh viên đang dùng website của bạn mua 1 món hàng. Thành viên đó đã hoàn tất việc mua hàng (phiên giao dịch) trên website, do đó , bạn phải xóa mọi thứ trong session sau khi việc này hoàn tất.

PHP Code:
Code:
<?php
session_start
();
if(isset(
$_SESSION['cart']))
    unset(
$_SESSION['cart']); ?>

Bạn cũng có thể hủy hoàn toàn các session bằng cách gọi hàng session_destroy

PHP Code:
Code:
<?php
session_start
(); session_destroy();?>

Destroy sẽ reset session của bạn, do đó không nên gọi hàm này trước khi bạn còn muốn thao tác lên dữ liệu chứa trong session đó. 

Căn bản lập trình web voi PHP - Bài 4(VIII) : PHP Căn Bản

VIII. Làm Việc Với CSDL MySQL

D. PHP & MYSQL

Bài viết này sẽ tập trung vào việc khai thác hệ quản trị CSDL miễn phí MySQL.

Các bước xây dựng chương trình có kết nối tới CSDL My SQL:

Thông thường, trong một ứng dụng có giao tiếp với CSDL, ta phải làm theo bốn trình tự sau:
Bước 1: Thiết lập kết nối tới CSDL.
Bước 2: Lựa chọn CSDL.
Bước 3: Tiến hành các truy vấn SQL, xử lý các kết quả trả về nếu có
Bước 4: Đóng kết nối tới CSDL.

Nếu như trong lập trình thông thường trên Windows sử dụng các chương trình điều khiển trung gian (ADO, ODBC...) để thực hiện kết nối và truy vấn, thì trong PHP, khi lập trình tương tác với CSDL, chúng ta thường sử dụng thông qua các hàm.

Chú ý: Trước khi sử dụng PHP để lập trình với MySQL, hãy sử dụng chương trình quản lý phpMyAdmin để tạo trước một CSDL, vài bảng cũng như người dùng... để tiện thực hành. Bài hướng dẫn sử dụng phpMyAdmin sẽ được trình bày sau.

Trong bài viết này, tôi sử dụng MySQL chạy trên nền máy chủ localhost, người sử dụng của CSDL này có username là mysql_user, mật khẩu là mysql_password

Thiết lập kêt nối tới MySQL.

Để kết nối tới MySQL, ta sử dụng hàm mysql_connect()
Cú pháp:
mysql_connect(host,tên_truy_cập,mật_khẩu);
trong đó:
host là chuỗi chứa tên (hoặc địa chỉ IP) của máy chủ cài đặt MySQL.
tên_truy_cập là chuỗi chứa tên truy cập hợp lệ của CSDL cần kết nối
mật_khẩu là chuỗi chứa mật khẩu tương ứng với tên truy cập
Ví dụ:
<?
mysql_connect ("localhost", "thu_mot_ti","thu_hai_ti");
?>
Khi kết nối tới MySQL thành công, hàm sẽ trả về giá trị là một số nguyên định danh của liên kết, ngược lại, hàm trả về giá trị false.
Ta có thể dùng hàm if để kiểm tra xem có kết nối được tới MySQL hay không:

<?php
    $link = mysql_connect("localhost", "mysql_user", "mysql_password");
    if (!$link)
     {
         echo "Không thể kết nối được tới CSDL MySQL";
     }
?>

Lựa chọn CSDL

Để lựa chọn một CSDL nào đó mà người sử dụng có tên là tên_truy_cập" có quyền sử dụng, ta dùng hàm mysql_select_db:
mysql_select_db (tên_CSDL);
Hàm này thường được dùng sau khi thiết lập kết nối bằng hàm mysql_connect. Hàm này trả về true nếu thành công, false nếu thất bại.
VD:
<?php
    $link = mysql_connect("localhost", "mysql_user", "mysql_password");
    if (!$link)
     {
         echo "Không thể kết nối được tới MySQL";
     }
    if (!mysql_select_db ("Forums"))
     {
         echo "Không thể lựa chọn được CSDL Forums";
     }
?>

Đóng kết nối tới CSDL:
Để đóng kết nối tới CSDL, ta dùng hàm mysql_close.
Hàm này có nhiệm vụ đóng kết nối tới CSDL có mã định danh được tạo ra bởi hàm mysql_connect().
Cú pháp: mysql_close(mã_định_danh_kết_nối).

Ví dụ:
<?php
    $link = mysql_connect("localhost", "mysql_user", "mysql_password");
    if (!$link)
     {
         echo "Không thể kết nối được tới MySQL";
     }
    mysql_close($link);
?>

Trong bài viết này, tôi sử dụng MySQL chạy trên nền máy chủ localhost, người sử dụng có username là mysql_user, mật khẩu là mysql_password.
CSDL có tên là CMXQ_Forum, trong đó có một bảng là CMXQ_Users để lưu thông tin về những thành viên của diễn đàn. Bảng CMXQ_Users có các trường sau:
User_ID: Autonumber.// mã số của người dùng
User_Name: Varchar [20] // tên truy cập của người dùng
User_Pass: Varchar[64] //mật khẩu của người dùng
User_IP: Varchar [15] //Địa chỉ IP của người dùng.
User_Post: Number // Số bài viết của người dùng.

Bây giờ tôi sẽ tiến hành một số thao tác thêm, sửa và xóa dữ liệu trên bảng đó. Xin xem lại bài Căn bản về SQL.
Để thực thi một câu lệnh SQL bất kỳ trong PHP tác động lên MySQL, ta dùng hàm mysql_query (chuỗi_câu_lệnh_SQL)

I. Thêm một bản ghi vào bảng.
Ví dụ tôi muốn chèn thêm một người sử dụng có User_Name là "CMXQ", User_Pass là "123456", User_Post=0 ta làm như sau:
<?
$sql = "INSERT INTO CMXQ_Users (User_Name, User_Pass) VALUES ("CMXQ","123456",0);
mysql_query ($sql);
?>

II. Xóa một bản ghi khỏi bảng.
Trong trường hợp này, ta sử dụng câu lệnh SQL DELETE FROM:
VD: tôi muốn xóa khỏi bảng CMXQ_Users tất cả những người có User_Name="CMXQ":
<?
$sql = "DELETE FROM CMXQ_Users WHERE User_Name='CMXQ'";
mysql_query ($sql);
?>

III. Sửa thông tin của bản ghi trong bảng.
Trong trường hợp này, tôi sử dụng cú pháp UPDATE:
VD: Tôi muốn cập nhật địa chỉ IP cho người có User_Name="CMXQ" với địa chỉ IP được lấy từ trình duyệt:
<?
$sql = "UPDATE CMXQ_Users SET User_IP ='" . $_SERVER['REMOTE_ADDR'] . "' Where User_Name='CMXQ'";
mysql_query ($sql);
?>
(Biến $_SERVER['REMOTE_ADDR'] chứa địa chỉ IP của trình duyệt. Xin xem lại ở bài trước)


Chúng ta đã biết cách dùng hàm mysql_query() để tiến hành các truy vấn sửa, thêm và xóa. Bài này tập trung vào việc ứng dụng PHP để lấy thông tin từ CSDL.

Qua những phần ở trên, chúng ta đã biết cách làm việc với các câu truy vấn SELECT. Bây giờ, kết hợp với hàm mysql_query() để lấy thông tin.

Cú pháp hàm mysql_query như sau:

mysql_query(câu lệnh sql).

VD: Để lấy tất cả các bản ghi trong bảng "Members", ta sẽ gọi hàm mysql_query() như sau:

<?
mysql_query ("Select * from Members")
?>

Vấn đề là khi thực hiện truy vấn này, dữ liệu sẽ được trả về dưới dạng một bảng. Ta sẽ tiến hành lấy từng dòng của bảng đó ra dưới dạng một mảng (sử dụng hàm mysql_fetch_array()), tiếp đó, việc xử lý các phần tử của mảng đó như thế nào là tùy ý các bạn.

Xem ví dụ sau:

<?php
    $result = mysql_query("SELECT id, name FROM mytable");
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
    {
        printf ("ID: %s  Name: %s", $row["name"]);
    }

    mysql_free_result($result);
?>

Đoạn lệnh trên lặp duyệt qua bảng kết quả result, đối với mỗi dòng của bảng, hàm mysql_fetch_array() sẽ đảm nhiệm việc tách dòng đó rồi đưa vào một mảng có tên là $row. Mỗi phần tử của mảng này sẽ là giá trị của cột có tên tương ứng.

Như vậy, trước khi xác định dữ liệu cần lấy là gì, chúng ta phải thiết kế câu truy vấn SQL sao cho hợp lý và đảm bảo rằng truy vấn đó chỉ lấy ra những thông tin gì cần sử dụng. Nếu lấy ra nhiều quá sẽ gây quá tải hệ thống dẫn đến treo máy.

Sau khi đã có được câu truy vấn SQL, ta chỉ việc kết hợp với hàm mysql_query() để trả kết quả về dưới dạng một biến nào đó.

Phần tiếp theo, chúng ta sẽ dùng một hàm có tên là mysql_fetch_array () để lấy từng dòng dữ liệu ra để xử lý.

Hàm mysql_fetch_array có hai tham số:
- Tham số đầu tiên xác định biến nắm giữ kết quả trả về bởi hàm mysql_query()
- Tham số thứ hai xác định kiểu định danh trường:
+ MYSQL_ASSOC: Đưa ra một mảng với chỉ số của mảng là tên trường
+ MYSQL_NUM: Đưa ra một mảng với chỉ số của mảng là số thứ tự của trường được liệt kê trong câu truy vấn SQL
+ MYSQL_BOTH: Đưa ra một mảng với chỉ số kết hợp giữa hai loại trên

Thông thường, ta dùng MYSQL_ASSOC để sử dụng chỉ số bằng tên các trường.

Khi truy vấn CSDL MySQL, ta có thể sử dụng thêm một số hàm phụ trợ:
mysql_num_rows(biến kết quả): trả về số các dòng lấy được từ biến kết quả.

VD:

<?php
$link = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("database", $link);
$result = mysql_query("SELECT * FROM table1", $link);
$num_rows = mysql_num_rows($result);
echo "Có $num_rows bản ghi được tìm thấy\n";
?>

Tương tự ta có:
mysql_num_fields (biến kết quả): Trả về số trường (cột) trong tập kết quả

mysql_affected_rows (): Trả về số bản ghi bị ảnh hưởng bởi các câu lệnh SQL INSERT, UPDATE, DELETE.

Ví dụ:

<?php
    mysql_pconnect("localhost", "mysql_user", "mysql_password") or
        die ("Could not connect");
    mysql_query("DELETE FROM mytable WHERE id < 10");
    printf ("Số bản ghi bị xóa: %d\n", mysql_affected_rows());
?>

mysql_data_seek ( nguồn kết quả, dòng cần truy cập): Hàm này chuyển con trỏ dòng của nguồn kết quả đến một dòng nào đó. Dòng đầu tiên trong bảng kết quả được đánh số là 0, dòng cuối cùng chính là mysql_num_rows()-1. Hàm trả về TRUE nếu thành công, ngược lại là FALSE

Chú ý rằng hàm này chỉ sử dụng cùng với hàm mysql_query
Ví dụ:
<?php
    $link = mysql_pconnect("localhost", "mysql_user", "mysql_password")
        or die("Could not connect");

    mysql_select_db("samp_db")
        or exit("Could not select database");

    $query = "SELECT last_name, first_name FROM friends";
    $result = mysql_query($query)
        or die("Query failed");

    /* fetch rows in reverse order */
    for ($i = mysql_num_rows($result) - 1; $i >= 0; $i--) {
        if (!mysql_data_seek($result, $i)) {
            echo "Cannot seek to row $i\n";
            continue;
        }

        if(!($row = mysql_fetch_object($result)))
            continue;

        echo "$row->last_name $row->first_name<br />\n";
    }

    mysql_free_result($result);
?>

Phân trang trong ứng dụng PHP/MySQL 

Khi truy vấn dữ liệu mà nhận được một danh sách kết quả quá dài, người ta thường phải phân trang ứng dụng cho phù hợp (ít nhất là về mặt thẩm mỹ).

Nguyên tắc của việc phân trang ứng dụng như sau:

- Bước 1: Tính tóan số lượng bản ghi thỏa mãn điều kiện trả về ( thường sử dụng hàm count trong câu lệnh SQL).
- Bước 2: Xác định số lượng bản ghi sẽ hiển thị trên một trang.
- Bước 3: Dựa trên các thông tin có được từ bước 1 và 2, xác định được số trang cần hiển thị.
- Bước 4: Tính tóan số lượng bản ghi sẽ hiển thị tính từ trang nào đó do NSD lựa chọn (Sử dụng câu lệnh LIMIT).

Dưới đây tôi sẽ cung cấp cho các bạn 2 function,
- Function GetPageLinks ($Sql, $PageSize): Trả về một chuỗi văn bản chứa số trang hiển thị, với dữ liệu vào bao gồm câu lệnh SQL ($Sql) xác định số lượng bản ghi thỏa mãn điều kiện tìm kiếm, và "kích thước" của một trang ($PageSize)

Code:
function GetPageLinks($Sql,$PageSize)
{
 
$result=mysql_query ($Sql);
 
if (!$result or mysql_num_rows ($result)==0)
 
{
 
 
 

 
}
 
else
 
{
 
 
$line=mysql_fetch_array($result);
 
 
$Pages=ceil($line[0]/$PageSize);
 
 
if ($Pages>1)
 
 
{
 
 
 
$PageLink="Trang ";
 
 
 
for ($i=0;$i<=$Pages-1;$i++)
 
 
 
{
 
 
 
 
$j=$i+1;
 
 
 
 
if ($j==$_GET["page"])
 
 
 
 
 
{
 
 
 
 
 
 
$PageLink.=" {$j} | ";
 
 
 
 
 
}
 
 
 
 
else
 
 
 
 
 
{
 
 
 
 
 
 
$NewGet="";
 
 
 
 
 
 
reset ($_GET);
 
 
 
 
 
 
while (list($key, $val) = each($_GET))
 
 
 
 
 
 
{
 
 
 
 
 
 
 
 
 
 
 
 
 
   if ($key!='page')
 
 
 
 
 
 
 
 
 
 
 
 
 
   {
 
 
 
 
 
 
 
 
$NewGet.="&{$key}={$val}";
 
 
 
 
 
 
   }
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
 
 
 
 
 
$NewGet.="&page={$j}";
 
 
 
 
 
 
$NewGet=substr($NewGet,1);
 
 
 
 
 
 

 
 
 
 
 
 
$PageLink.=" <a href='?{$NewGet}'>{$j}</a> | ";
 
 
 
 
 
}
 
 
 
}
 
 
 
$PageLink=substr($PageLink,0,-2);
 
 
}
 
}
 
return $PageLink;
}

Hàm tiếp theo sẽ hiển thị danh sách các record của một trang nào đó, đồng thời demo cách sử dụng hàm GetPageLinks ở trên:
(VD dưới đây sử dụng một câu truy vấn lấy dữ liệu từ một bảng dulieu với một Category có id xác định:

Code:
function LoadList()
{
 
if (isset($_GET["CatId"]) and is_numeric ($_GET["CatId"]))
 
 
 
$Dieukien="where CatId={$_GET["CatId"]}";
 

// Cau lenh truy van chinh khi chua phan trang:
 
 
$Sql="Select * from dulieu {$Dieukien} ";
// Tinh toan so luong ban ghi tra ve:
 
 
$PageSize=20;
 
 
$CountSQL="Select count(*) from dulieu {$Dieukien}";
 
 
$PageLinks= GetPageLinks ($CountSQL,$PageSize);
 
 

 
 
if (isset ($_GET["page"]) and is_numeric ($_GET["page"]))
 
 
{
 
 
 
$StartNum=$PageSize * ($_GET["page"]-1); // Xac dinh vi tri ban ghi bat dau
 
 

 
 
}
 
 
else
 
 
{
 
 
 
$StartNum=0;
 
 
}
//Tiep tuc xay dung cau lenh truy van de lay du lieu theo trang
 
 
$Sql.= " Limit {$StartNum}, {$PageSize}";
 
 

 
 
$result=mysql_query ($Sql);
 
 
if (!$result or mysql_num_rows ($result)==0)
 
 
 
{
 
 
 
 
$tmp="Híc, tui chẳng mò được chi cả!";
 
 
 
}
 
 
else
 
 
 
{
 
 
 
 
$tmp="{$PageLinks}";
 
 
 
 
//========== Hiển thị dữ liệu, các bạn tự viết cho phù hợp với yêu cầu
 
 
 
 
$tmp.="{$PageLinks}";
 
 
 
}
 

 
 
return $tmp;
}

Căn bản lập trình web voi PHP - Bài 4(VIII) : PHP Căn Bản

VIII. Làm Việc Với CSDL MySQL

C.  Giới thiệu ngôn ngữ truy vấn CSDL SQL

I. Một số khái niệm cơ bản về CSDL
Cơ sở dữ liệu (database) có thể hiểu là nơi chứa dữ liệu. Có nhiều loại cơ sở dữ liệu khác nhau như cơ sở dữ liệu quan hệ, CSDL hướng đối tượng, CSDL phân tán...
Hiện nay, trong phần lớn các ứng dụng, người ta thường sử dụng CSDL quan hệ.
Trong mô hình CSDL quan hệ, dữ liệu thường được chia thành các bảng có liên quan với nhau.

VD: ta có 2 bảng:

Bảng 1 chứa các thông tin về Mã hàng, tên hàng, ngày nhập hàng, giá nhập hàng
Bảng 2 chứa các thông tin về Mã hàng, ngày bán hàng, giá bán.

Hai bảng này có quan hệ với nhau thông qua mã hàng, tức là chỉ cần có mã hàng ở bảng 2, ta có thể tìm ra tên hàng dựa trên mối liên hệ giữa mã hàng và tên hàng lưu ở bảng 1.

Hệ quản trị CSDL là chương trình dùng để quản lý một CSDL nào đó. Chẳng hạn như chương trình Access là một hệ quản trị CSDL để quản lý CSDL Access. Thông thường thì tên của hệ quản trị CSDL gắn liền với tên của loại CSDL. VD như: CSDL Access <-> Hệ quản trị CSDL Access, CSDL MySQL <-> Hệ quản trị CSDL MySQL, CSDL Oracle <-> Hệ quản trị CSDL Oracle. Trong trường hợp này thì người ta thường nhầm lẫn giữa khái niệm CSDL và cấu trúc (dạng nhị phân) của một CSDL do hệ quản trị CSDL quy định.

Người ta gọi các cột trong một bảng là các trường, các dòng trong một bảng là các bản ghi.

Mỗi trường sẽ có một kiểu dữ liệu xác định. Đó có thể là kiểu số, kiểu chuỗi, kiểu ngày tháng...

VD về một bảng có chứa thông tin người dùng. Bảng này sẽ có tên là NSD, các cột (trường) là: Ma_ND, Ten_ND, Tuoi_ND, Matkhau_ND; trong đó Ma_ND có kiểu nguyên, Ten_ND có kiểu chuỗi, Tuoi_ND có kiểu số, Matkhau_ND có kiểu chuỗi.

II. Ngôn ngữ truy vấn CSDL SQL

SQL là một ngôn ngữ được sử dụng trong các ngôn ngữ lập trình để truy vấn thông tin trong CSDL. Điểm mạnh của ngôn ngữ này là cấu trúc đơn giản, có thể nhập lệnh vào dưới dạng các chuỗi văn bản, sau đó chuyển câu lệnh tới các chương trình điều khiển trung gian để truy vấn dữ liệu rồi trả về cho chương trình. Như vậy, mọi thao tác kết xuất, truy vấn hoàn tòan dễ dàng thông qua việc điều khiển chuỗi văn bản có chứa câu lệnh SQL.

Bài viết này tập trung vào việc trình bày cú pháp của ngôn ngữ SQL, có thể sử dụng PHP để biểu diễn một số thao tác để mọi người dễ dàng hình dung.

1. Câu lệnh chèn dữ liệu vào một bảng.
Cú pháp của câu lệnh này có dạng:
Code:
INSERT INTO tên_bảng (danh_sách_trường) VALUES (danh_sách_giá_trị)

Trong đó:

Các từ khóa cố định là INSERT, INTO và VALUES.
tên_bảng là tên của một bảng quan hệ trong CSDL.
danh_sách_trường là danh sách các trường trong bảng quan hệ được sử dụng để chèn giá trị vào, mỗi trường cách nhau một dấu phảy.
danh_sách_giá_trị là danh sách các giá trị tương ứng với các trường, có bao nhiêu trường thì phải chèn vào bấy nhiêu giá trị.

Chú ý:
Thông thường, các giá trị chuỗi phải được đặt trong cặp dấu nháy hoặc dấu ngoặc kép tùy thuộc vào ngôn ngữ biểu diễn và kiểu dữ liệu của trường. Mỗi giá trị cách nhau bởi một dấu phẩy.

VD, với bảng dữ liệu ở trên (Bảng NSD có các cột (trường) là: Ma_ND, Ten_ND, Tuoi_ND, Matkhau_ND), ta có thể dùng câu lệnh SQL để chèn thông tin vào như sau:

Code:
INSERT INTO NSD (Ten_ND,MatKhau_ND) VALUES('Sinh','123456')

Hoặc ta có thể chèn nhiều thông tin hơn:

Code:
INSERT INTO NSD (Ten_ND,Tuoi_ND,MatKhau_ND) VALUES('Sinh',30,'123456')

2. Câu lệnh chỉnh sửa dữ liệu trong bảng
Để chỉnh sửa (cập nhật) thông tin trong bảng, ta dùng câu lệnh UPDATE với cú pháp sau:

Code:
UPDATE tên_bảng SET tên_trường1=giá_trị1[, tên_trường_i=giá_trịi] WHERE điều_kiện

Chẳng hạn, nếu ta muốn đổi mật khẩu của những người có trường Ten_ND là Sinh thành 'JQKA' trong bảng trên, ta sẽ làm như sau:

Code:
UPDATE NSD SET Matkhau_ID = 'JQKA' WHERE Ten_ND='Sinh'

Chú ý mệnh đề điều kiện WHERE. Mệnh đề này sẽ được mô tả chi tiết hơn ở phía dưới.

3. Câu lệnh xóa dữ liệu trong bảng
Để xóa dữ liệu trong bảng, ta dùng câu lệnh DELETE với cú pháp sau:
Code:
DELETE FROM tên_bảng WHERE điều_kiện.

Câu lệnh này sẽ xóa tất cả những bản ghi thỏa mãn điều kiện nằm sau mệnh đề WHERE.
VD:
Quote
DELETE FROM NSD WHERE Ten_ND='Sinh'

4. Câu lệnh truy vấn (tìm kiếm) dữ liệu trong bảng
Đây là câu lệnh phức tạp nhất trong nhóm các câu lệnh của SQL.
Cú pháp của lệnh này như sau:
SELECT [danh_sách_trường] FROM [danh_sách_bảng] WHERE [danh_sách_điều_kiện] [ORDER BY]


Câu lệnh SELECT

Câu lệnh SELECT được dùng để truy xuất dữ liệu từ một bảng. Kết quả trả về dưới dạng bảng được lưu trong 1 bảng, gọi là bảng kết quả - result table (còn được gọi là tập kết quả - result set).

Cú pháp

Cú pháp của câu lệnh SELECT như sau:

    SELECT tên_các_cột
    FROM tên_bảng

Ví dụ, để truy xuất các cột mang tên LastName và FirstName từ một bảng có tên là Persons, ta dùng một câu lệnh SELECT như sau:

    SELECT LastName, FirstName FROM Persons

Ta có thể dùng dấu * để thay thế cho tất cả các cột:
    SELECT * FROM Persons
Kết quả trả về từ một câu truy vấn SQL được lưu trong 1 tập kết quả (result set). Tập kết quả này sau đó sẽ được lập trình viên tìm cách đưa ra dưới dạng một bảng hoặc một hình thức nào đó. Xin xem chi tiết ở phần lập trình với php


Mệnh đề WHERE

Mệnh đề WHERE được dùng để thiết lập điều kiện truy xuất.
Để truy xuất dữ liệu trong bảng theo các điều kiện nào đó, một mệnh đề WHERE có thể được thêm vào câu lệnh SELECT.

Cú pháp mệnh đề WHERE trong câu lệnh SELECT như sau:

    SELECT tên_cột FROM tên_bảng
    WHERE tên_cột phép_toán giá_trị

Trong mệnh đề WHERE, các phép toán được sử dụng là

    Phép toán      Mô tả
    =               So sánh bằng
    <>             So sánh không bằng
    >               Lớn hơn
    <               Nhỏ hơn
    >=             Lớn hơn hoặc bằng
    <=             Nhỏ hơn hoặc bằng
    BETWEEN    Nằm giữa một khoảng
    LIKE           So sánh mẫu chuỗi

Lưu ý: Trong một số phiên bản của SQL, phép toán <> có thể được viết dưới dạng !=

Ví dụ để lấy danh sách những người sống ở thành phố Sandnes, ta sử dụng mệnh đề WHERE trong câu lệnh SELECT như sau:

    SELECT * FROM Persons
    WHERE City = 'Sandnes'

Tóan tử AND và OR

Hai toán tử AND và OR nối hai hoặc nhiều điều kiện trong mệnh đề WHERE lại với nhau.
Toán tử AND sẽ hiển thị 1 dòng nếu TẤT CẢ các điều kiện đều thoả mãn. Toán tử OR hiển thị một dòng nếu BẤT KỲ điều kiện nào được thoả.

Ví dụ: Sử dụng AND để tìm những người có tên là Tove và họ là Svendson:

    SELECT * FROM Persons
    WHERE FirstName = 'Tove'
    AND LastName = 'Svendson'

Ví dụ: Sử dụng OR để tìm những người có tên là Tove hoặc họ là Svendson:

    SELECT * FROM Persons
    WHERE firstname = 'Tove'
    OR lastname = 'Svendson'

Ví dụ: Sử dụng kết hợp AND và OR cùng với dấu ngoặc đơn để tạo nên các câu truy vấn phức tạp:

    SELECT * FROM Persons WHERE
    (FirstName = 'Tove' OR FirstName = 'Stephen')
    AND LastName = 'Svendson'

Từ khoá DISTINCT

Từ khoá DISTINCT được dùng để lọc ra các giá trị khác nhau.

Câu lệnh SELECT sẽ trả về thông tin về các cột trong bảng. Nhưng nếu chúng ta không muốn lấy về các giá trị trùng nhau thì sau?

Với SQL, ta chỉ cần thêm từ khoá DISTINCT vào câu lệnh SELECT theo cú pháp sau:

    SELECT DISTINCT tên_cột FROM tên_bảng

Ví dụ: Tìm tất cả các công ty trong bảng đặt hàng, câu lệnh SQL thông thường sẽ như sau:

    SELECT Company FROM Orders

Để tìm tất cả các công ty khác nhau trong bảng đặt hàng, ta sử dụng câu lệnh SQL sau:

    SELECT DISTINCT Company FROM Orders

Mệnh đề ORDER BY:
Mệnh đề ORDER BY được dùng để sắp xếp các dòng.
Cú pháp: Select..... ORDER BY tên các cột [ASC/DESC]
ORER BY có thể đi kèm từ khóa DESC để sắp xếp theo chiều giảm dần, hoặc ASC để sắp xếp theo chiều tăng dần của các cột

VD: Để lấy danh sách các công ty theo thứ tự chữ cái (tăng dần):

    SELECT Company, OrderNumber FROM Orders
    ORDER BY Company

VD 2: Lấy danh sách các công ty theo thứ tự chữ cái (tăng dần) và hoá đơn đặt hàng theo thứ tự số tăng dần:

    SELECT Company, OrderNumber FROM Orders
    ORDER BY Company, OrderNumber

VD 3: Lấy danh sách các công ty theo thứ tự giảm dần:

    SELECT Company, OrderNumber FROM Orders
    ORDER BY Company DESC


 

Căn bản lập trình web voi PHP - Bài 4(VIII) : PHP Căn Bản

VIII. Làm Việc Với CSDL MySQL

1. Giới Thiệu MYSQL

My SQL là gì?

MySQL là một phần mềm quản trị CSDL mã nguồn mở, miễn phí nằm trong nhóm LAMP (Linux - Apache -MySQL - PHP)

Tại sao lại sử dụng MySQL?

MySQL là phần mềm miễn phí hoàn toàn, ổn định, an toàn.

Hiện nay trong số các Website có lưu lượng truy cập lớn thuộc hàng "top" trên Internet, có rất nhiều Website sử dụng liên minh LAMP này.

"Liên minh" mã mở LAMP đang được coi là một đối trọng với các sản phẩm mã đóng "đắt vãi..." (vãi gì thì tôi không biết ) của Microsoft (Windows, IIS, SQL Server, ASP/ASP.NET).

Một số đặc điểm của MySQL

MySQL là một phần mềm quản trị CSDL dạng server-based (gần tương đương với SQL Server của Microsoft).
MySQL quản lý dữ liệu thông qua các CSDL, mỗi CSDL có thể có nhiều bảng quan hệ chứa dữ liệu.
MySQL có cơ chế phân quyền người sử dụng riêng, mỗi người dùng có thể được quản lý một hoặc nhiều CSDL khác nhau, mỗi người dùng có một tên truy cập (user name) và mật khẩu tương ứng để truy xuất đến CSDL.

Khi ta truy vấn tới CSDL MySQL, ta phải cung cấp tên truy cập và mật khẩu của tài khỏan có quyền sử dụng CSDL đó. Nếu không, chúng ta sẽ không làm được gì cả.

2. Sử dụng PHPMyAdmin

Hiện nay hầu hết các host đều sử dụng phpmyadmin để quản lý database vì nó free , hiệu quả, dễ dùng, tuy nhiên không phải host nào cũng có , một số host không cài sẵn , bạn phải tự cài. Bạn tải phpMyadmin và upload lên host .
Có thể vào trang chủ http://www.phpmyadmin.net hay nhấn vào đây để download :
http://sourceforge.net/project/s ... mp;release_id=63838

Sau khi upload phpmyadmin lên host xong bạn mở file config.inc.php ra sửa ( có thể sửa xong rùi upload lên ).

Tìm đoạn code :


$cfgPmaAbsoluteUri = ' '

Thêm vào :
$cfgPmaAbsoluteUri = 'http://yoursite.com/duong_dan_den_thu_muc_phpmyadmin/'


Tìm đoạn :
$cfgServers[1]['user'] = 'root';

$cfgServers[1]['password'] = '';

$cfgServers[1]['only_db'] = '';

Thêm vào :
$cfgServers[1]['user'] = 'tên login của bạn';
$cfgServers[1]['password'] = '*******'; //PASWORD CỦA BẠN
$cfgServers[1]['only_db'] = 'tên login của bạn';


Sau đó save lại và mở trình duyệt gõ :
http://yoursite.com/duong_dan_den_thu_muc_phpmyadmin/index.php

Sau đây là cách sử dụng :

Sau khi bạn nhập username và password ,đã vào trong phpmyadmin

Bây giờ bạn hãy click vào tên database , ( dưới chữ home , bên trái )

Bây giờ ví dụ bạn muốn tạo table , thì sẽ có 2 trường hợp , 1 là người ta đã viết sẵn câu lệnh cho bạn và save các câu lệnh thành 1 tập hợp các lệnh dưới dạng ví dụ như shoutbox.sql , hoặc là nuke.sql , trong trường hợp này bạn kích vào SQL sau đó nhấn vào nút browers của phpmyadmin,chọn file tập hợp lệnh trong máy ( như trong hình là nuke.sql ) sau đó nhấn vào run để tạo table

Trường hợp thứ 2 là người ta kô có làm sẵn tập hợp lệnh cho bạn mà chỉ cho bạn các lệnh tạo table, thực ra cũng tương tự, bạn cứ copy hết tất cả các lệnh ấy và paste vào ô Run SQl Query/ queries . sau đó nhấn go để chạy lệnh. vậy là xong.

Bây giờ tới phần backup ,restore dữ liệu , bạn có một forum đông khách , nhưng bạn sợ một ngày kia bị mất thành viên , bài gửi khi bạn đổi host hoặc host có vấn đề .? cách tốt nhất là bạn dùng phpmyadmin backup toàn bộ database mỗi ngày hoặc mỗi tuần tùy bạn . Sau đó nếu forum có chuyện gì thi bạn có thể khởi tạo lại forum mà vẫn giữ được bài viết , thành viên.

trong phpmyadmin bạn sẽ thấy hình sau :

Bây giờ bạn hãy click chọn Export sau đó chọn save as file, sau đó nhấn Go . rồi save database vào máy tính . điều này có nghĩa là TOÀN Bộ database của bạn đã được save vào máy tính )

Trong trường hợp bạn chuyển host khác, hoặc là forum có trục trặc cần sử dụng lại database cũ thì bạn phải restore database , tức là lấy database bạn đã save trong máy tính bây giờ đem chép ngược nó lên web host của bạn .
Bạn hãy nhấn vào Import -> Browse để chọn file database bạn đã save sau đó nhấn go . vậy là database của bạn đã được phục hồi như cũ .

To Be Continued ...

Căn bản lập trình web voi PHP - Bài 4(VII) : PHP Căn Bản

VII. HTML Form - Gửi Và Nhận Dữ Liệu Qua HTML Form

Dữ liệu của người dùng từ trình duyệt sẽ được gửi lên máy chủ dưới dạng từng cặp biến=giá_trị và có thể đi theo 3 con đường khác nhau. Tuỳ theo từng con đường cụ thể, trên máy chủ ta cũng có các cách khác nhau để lấy dữ liệu được gửi lên.. 3 con đường đó là: GET, POST và COOKIES. Vậy GET, POST và COKIES là gì?

1. Truyền dữ liệu thông qua phương thức GET
Dữ liệu gửi từ trình duyệt lên qua phương thức GET là phần dữ liệu được nhập trực tiếp theo sau địa chỉ URL do trình duyệt gửi lên, được phân biệt với tên file script bằng dấu hỏi chấm (?). Ví dụ, khi ta gõ vào trình duyệt địa chỉ URL sau:

http://www.phpvn.org/topic.php?TOPIC_ID=161
Khi đó, trình duyệt sẽ gửi theo địa chỉ trên một cặp biến = giá trị, trong đó biến có tên là TOPIC_ID và giá trị là 161 (TOPIC_ID=161).
Chúng ta cũng có thể đưa lên nhiều cặp biết=giá_trị bằng cách phân cách chúng bởi dấu &:
http://www.phpvn.org/index.php?method=Reply&TOPIC_ID=161&FORUM_ID=20
Với địa chỉ URL trên, chúng ta sẽ gửi lên 3 cặp biến=giá_trị theo phương thức GET, đó là: method=Reply, TOPIC_ID=161 và FORUM_ID=20.
Khi trình duyệt gửi các thông tin này lên máy chủ, PHP sẽ tự động sinh ra một mảng có tên là $_GET[] để nắm giữ tất cả các cặp biến và giá trị đó, trong đó, chỉ số của mảng chính là một chuỗi mang tên của tên biến và giá trị của chỉ số đó chính là giá trị của biến do trình duyệt gửi lên. Ví dụ, với địa chỉ URL sau:

http://www.phpvn.org/post.php?method=Reply&TOPIC_ID=161&FORUM_ID=20

Thì PHP sẽ tự động sinh ra một mảng $_GET có nội dung sau:
$_GET["method"] = "Reply" // tương ứng với cặp method=Reply
$_GET["TOPIC_ID"] = 161 // tương ứng với cặp TOPIC_ID=161
$_GET["FORUM_ID"] = 20 // tương ứng với cặp FORUM_ID=20

Sau đó, trong trang web của mình, các bạn có thể tha hồ sử dụng các biến này. Ví dụ, tôi làm một đoạn chương trình sau để khi người dùng nhập vào biến user=sinh thì cho hiển thị "Hello, my Boss", còn nếu biến user khác sinh thì "Hello " + giá trị của biến:

Code:
<?
// Hàm isset được sử dụng để kiểm tra xem một biến đã được thiết lập hay chưa
if (isset ($_GET["user"]))
{
    if ($_GET["user"]=="sinh")
    {
        echo "Hello, my boss. Good morning!";
    }
    else
    {
        echo "Hello, " . $_GET["user"] . ". Good morning!";
    }
}
else
{
echo "Hello, guest. How do you do?";
}
?>

OK, bây giờ hãy save lại. Giả sử tôi lưu với tên là welcome.php trong thư mục www. Mở trình duyệt lên, gõ vào ô Address dòng chữ sau:
http://localhost/welcome.php?user=sinh

Hãy xem kết quả hiển thị trên màn hình, sau đó thay chữ sinh bằng một cái tên gì đó xem kết quả ra sao.



II. Phương thức POST

Post là phần dữ liệu được gửi qua các form HTML có method ="POST" (xin xem lại bài về HTML).

Để lấy các biến theo kiểu POST, PHP sẽ tự động sinh ra mảng có tên là $_POST[]. Mảng này có chỉ số chính là tên của các phần tử trong form (các thẻ input, select... có thuộc tính name) và giá trị là nội dung giá trị do người sử dụng nhập vào các phần tử có tên tương ứng. Chẳng hạn với mẫu biểu HTML sau:

Code:
<form method="POST">
<p>
  User Name:<input type="text" name="T1" size="20"> </p>
<p>
  Password:
  <input type="password" name="T2" size="20"></p>
<p>Sex: <Select name ="sex">
<option value =1>Male </option>
<option value =0>Female </option>
</select>
</p>
<input type="submit" value="Gui di" name="B1">
</form>

Khi người dùng nhập user name (giả sử là Sinh), password (giả sử là 123456) và chọn sex là Male, khi đó, mảng $_POST sẽ có các phần tử sau:
$_POST["T1"] = Sinh
$_POST["T2"] = 123456
$_POST["sex"] = 1

Sau khi lấy được các giá trị này rồi, các bạn có thể thoải mái sử dụng.

Đây là ví dụ một chương trình giải phương trình bậc nhất (cho nó đơn giản)

Code:
<form method="POST">
<p style="margin-top: 0; margin-bottom: 0">
  Nhập a:<input type="text" name="a" size="20"></p>
  <p style="margin-top: 0; margin-bottom: 0">Nhập b:<input type="text" name="b" size="20"></p>
  <p style="margin-top: 0; margin-bottom: 0">
  <input type="submit" value="Tính" name="B1"></p>
</form>
<?
      $a=0;
      $b=0;
      if (isset ($_POST["a"]))
      {
            $a =$_POST["a"];
      }
       if (isset ($_POST["b"]))
      {
            $b =$_POST["b"];
      }
      if ($a<>0)
      {
            echo "<BR>Nghiem la: " . $b/$a;Chỗ này là -$b/$a
      }
      else
      {
            if ($b==0)
                  {
                        echo "<BR>Vo so nghiem";
                  }
            else
            {
                  echo "<BR>Vo nghiem";
            }
      }
?>

Bây giờ hãy làm cốc cafe hoặc trà đá cho tỉnh táo.

III Cookie và cách sử dụng Cookie
Cookies là một phần dữ liệu được lưu trên máy khách. Mỗi khi máy khách gửi một yêu cầu tới máy chủ nào đó, thì nó sẽ gửi phần dữ liệu được lưu trong cookie tương ứng với máy chủ đó.

Trong Cookie có một số thông số sau:
- Địa chỉ URL mà trình duyệt sẽ gửi cookie tới
- Thời gian hết hạn của cookie
- Các cặp biến:giá trị được lưu trữ liên tục

Người ta thường dùng cookies để lưu trữ các thông tin có liên quan đến nhiều "phiên" làm việc khác nhau. Vi giao thức HTTP là giao thức không lưu trạng thái (Mỗi khi xử lý xong một yêu cầu từ máy khách là nó phủi tay tự ngắt kết nối luôn và chẳng thèm quan tâm đến máy khách làm gì ), nên cookies được sinh ra để làm nhiệm vụ lưu trữ một số biến trạng thái để khắc phục nhược điểm này.

Khác với dữ liệu gửi từ form (Post hay Get) thì cookies sẽ được trình duyệt tự động gửi đi theo mỗi lần truy cập lên máy chủ. Trong quá trình làm việc, cookie có thể bị thay đổi giá trị. Cookie sẽ bị vô hiệu hoá nếu cửa sổ trình duyệt điều khiển cookie đóng lại và cookie hết thời gian có hiệu lực. Theo mặc định, thời gian "sống" của cookies là tồn tại cho đến khi cửa sổ trình duyệt sử dụng cookies bị đóng. Tuy nhiên người ta có thể thiết lập tham số thời gian để cookie có thể sống lâu hơn (6 tháng chẳng hạn). Ví dụ như chế độ Remember ID & Password của 1 số trang web.

Cách ghi thông tin vào cookie và gửi xuống trình duyệt
Trong PHP, để gửi cookie xuống trình duyệt, ta có thể sử dụng hàm setcookie:
setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Trong đó:
- string name: Chuỗi mang tên của cookie
- string value: Chuỗi mang giá trị của cookie tương ứng với tên đã cho
- int expire: Thời gian hết hạn của cookie
- string path: Đường dẫn của cookie (đến 1 thư mục nào đó trên máy chủ. Tham số này cho biết cookie sẽ chỉ được truyền đi nếu như trang web mà trình duyệt yêu cầu nằm trên thư mục đó, thay vì lúc nào cũng phải gửi đi tới bất kỳ khu vực nào).
- string domain: cookie này sẽ được gửi tới domain nào?
- int secure: Chế độ bảo mật.

Các tham số trong cặp dấu ngoặc vuông là tuỳ chọn

Ví dụ: setcookie ("ten_truy_cap","lan gio vo tinh");

Chú ý: Hàm setcookie phải được gọi trước khi bạn gửi bất kỳ một nội dung nào xuống trình duyệt:

VD: Cách dùng đúng:
Code:
// Thực hiện các câu lệnh nào đó, nhưng không được phép gửi gì xuống trình duyệt
setcookie ("ten_truy_cap","lan gio vo tinh");
setcookie ("password","thumotti");
// Thực hiện các câu lệnh tiếp theo, có thể xuất dữ liệu xuống trình duyệt:

echo "<html><body>Xin chào lan gio vo tinh";

VD: Cách dùng sai:
Code:
// Thực hiện các câu lệnh nào đó
echo ("cái gì đó");
setcookie ("ten_truy_cap","lan gio vo tinh");
setcookie ("password","thumotti");
// các câu lệnh khác.

Ví dụ trên sai vì bạn đã trót gửi dòng "cái gì đó" xuống trình duyệt trước khi gọi hàm setcookie.

Cách lấy dữ liệu lưu trong cookie:

Để lấy dữ liệu đã lưu trong cookies do trình duyệt gửi lên, ta có thể dùng mảng $_COOKIE["tên_cookie"]

Chẳng hạn, với câu lệnh setcookie ở trên, sau khi trình duyệt gửi lên, ta sẽ có 2 biến sau:
$_COOKIE["ten_truy_cap"] // chứa giá trị "lan gio vo tinh"
$_COOKIE["password"] // chứa giá trị "thumotti".

Chi tiết hơn các bạn có thể xem trong PHP Manual.
http://fr2.php.net/manual/en/language.variables.superglobals.php

_____
Note : Cập nhật thêm vởi sorivevol
Do từ php 4.1 thì có thêm $_POST, $_GET, $_REQUEST,$_COOKIE etc . & trở thành super global variable & cũng do lý do tốc độ nên register_long_arrays thường được off, do vậy các bạn khi sử dụng $HTPP_*_VARS sẽ có thể xảy ra 1 số lỗi.
Cho nên các bạn nên sử dụng $_POST,$_GET,$_COOKIE,etc. để lập trình.

Căn bản lập trình web voi PHP - Bài 4(VI) : PHP Căn Bản

VI. Mảng Trong PHP

Là một danh sách các phần tử có cùng kiểu dữ liệu.Mảng có thể là mảng một chiều hay nhiều chiều. Mảng  có 2 thành phần là chỉ mục (key) và giá trị. Chỉ mục có thể là số nguyên hoặc là chuỗi . Bạn có thể khởi tạo mảng bằng các cách như sau:
$arr[key] = value;
$arr[] = value;
$arr= array($key1 =>value1,$key2=>value2);
$arr = array(value1, value2);
Như đã giới thiệu thì mảng có thể dùng số nguyên hoặc chuỗi để làm chỉ mục , ta tạm thời phân loại ra nhu sau:

1.Mảng một chiều có chỉ mục: là mảng được quản lý bằng cách sử dụng chỉ số dưới kiểu integer để biểu thị vị trí của giá trị yêu cầu.Cú pháp: $name[index1];
Ví dụ: một mảng một chiều có thể được tạo ra như sau:
            $meat[0]="chicken";

            $meat[1]="steak";

            $meat[2]="turkey";

Nếu bạn thực thi dòng lệnh sau: print $meat[1]; thì trên trình duyệt sẽ hiển thị dòng sau: steak.

Bạn cũng có thể sử dụng hàm array( ) của PHP để tạo ra một mảng.Ví dụ:

$meat=array("chicken","steak","turkey");

Lưu ý : Khác với các ngôn ngữ lập trình khác ( nhu Pascal chẳng hạn) , phần tử đầu tiên của mảng có chỉ mục là 0 , không phải 1 . Nhưng khi khai báo mảng , chỉ mục khởi đầu không nhất thiết là 0 .
ví dụ bạn tạo mảng thế này
$meat = array("chicken","steak","tukey");
Để lấy phần tử đầu tiên bạn sẽ gọi
echo $meat[0];
Nhưng nếu khia báo thế này
$arr[5] = 1;
thì chỉ mục tiếp theo là 6.

$arr[] = 3; // key là 6 nhá.

Nhớ kỹ đều này nhá , lúc đầu tớ cũng bị PHP lừa về chuyện này đấy ( do trước đây chỉ học Pascal).

2.Mảng một chiều kết hợp: rất thuận lợi khi dùng để ánh xạ một mảng sử dụng các từ hơn là sử dụng các số ( integer), nó giúp ta giảm bớt thời gian và các mã yêu cầu để hiển thị một giá trị cụ thể.
Ví dụ: bạn muốn ghi lại tất cả các thức ăn và các cặp rượu ngon trong việc ăn nhậu của mình.

$annhau["ruou"] = "Minh Mạng Tửu";

$annhau["khaivi"] = "Lạc rang";

$annhau["Trangmieng"] = "Chuối";

Một cách khác là bạn có thể sử dụng hàm array( ) của PHP để tạo ra một mảng loại này, ví dụ như sau:

$annhau = array( "ruou" => "Minh Mạng Tửu", "khaivi" => "Lạc Rang", "trangmieng" => "Chuối");

Khi truy xuất phần tử mảng :
echo $annhau["ruou"];

Sẽ xuất ra : Minh Mạng Tửu

3.Mảng nhiều chiều có chỉ mục: chức năng của nó cũng giống như mảng một chiều có chỉ mục, ngoại trừ việc nó có thêm một mảng chỉ mục được dùng để chỉ định một phần tử. Cú pháp: $name[index1] [index2]..[indexN];

Một mảng hai chiều có chỉ mục được tạo ra như sau:

            $position = $chess_board[5][4];


4.Mảng đa chiều kết hợp: khá hữu ích trong PHP. Giả sử bạn muốn ghi lại các cặp rượu-thức ăn, không chỉ loại rượu, mà cả nhà sản xuất. Bạn có thể thực hiện như sau:

$pairings["Martinelli"] ["zinfandel"] = "Broiled Veal Chops";

$pairings["Beringer"] ["merlot"] = "Baked Ham";

$pairings["Jarvis"] ["sauvignon"] = "Prime Rib";

--------------


Hết phần khái niệm , tiếp theo là giới thiệu các hàm để truy xuất mảng
Để truy xuất hay nhập giá trị cho 1 phần tử mảng cụ thể , bạn có thể gọi trực tiếp chúng như sau:
$arr = $mang[1];
hoặc
$arr = $dothi["x"];

Cú pháp là tên mảng[chỉ mục]

Tips : Để xóa 1 phần tử ra khỏi mảng , ta dùng unset()
Ví dụ
$arr = array(1,2,3,4);
unset($arr[2]);
// $arr bay giờ là array(1,2,4);

Để điếm các phần tử của mảng , dùng hàm count()
$arr = array(1,2,3,4);
$so = count($arr); // đố bạn bằng bao nhiu ?

Để duyệt qua hết tất cả các phần tử của mảng (truy xuất hoặc nhập giá trị) ta dùng các cách sau:
Cách thứ nhất , dùng vòng lập for
Nếu biết trước số phần tử của mảng ta có thể dùng vòng lặp for để duyệt qua các phần tử mảng:
Code:
<?php
$giatri 
= array(1,2,3,4,5,6,7,8,9,10);
for (
$i = 0; $i < 10 ; $i ++)
echo 
$giatri[$i]."<br>";?>
Chạy đoạn mã trên PHP sẽ xuất ra từ 1 đến 10 .

Để nhập giá trị vào thì cũng thế nhá
Ví dụ
Code:
<?phpfor ($i = 0; $i < 10 ; $i ++)
echo 
$giatri[$i] = $i +1 ;?>
Cách thứ 2 : Dùng Foreach
Cú pháp :
Quote
foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement
Ví dụ
Code:
<?php
$giatri 
= array(1,2,3,4,5,6,7,8,9,10);
foreach (
$giatri as $value)
echo 
$value."<br>";?>

Với foreach này để nhập giá trị vào ta phải thêm dấu " &" trước biến $value , như thế này &$value
Code:
<?php
$arr 
= array(1, 2, 3, 4);
foreach (
$arr as &$value) {
    
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)?>

Thêm 1 ví dụ nữa , lần này sẽ có sự xuất hiện của chỉ mục
Code:
<?php
$arr 
= array("mot"=>"one", "hai"=>"two","ba"=> "three");
foreach (
$arr as $key => $value) {
    echo 
"Key: $key; Value: $value<br />\n";
}
?>

Một cách khác để làm như trên ta sẽ dùng vòng lặp while đi với list() và each(). Xét ví dụ sau , thay vì dùng foreach như trên thì ta dùng while như sau:

Code:
<?php
$arr 
= array("one", "two","three");
while (list(
$key, $value) = each($arr)) {
    echo 
"Key: $key; Value: $value<br />\n";
}
?>
Lưu ý , list() chỉ hoạt động với mảng có chỉ mục là số và phần tử khởi đầu của mảng có chỉ mục là 0 ( PHP manual nói thế)
List sẽ gán giá trị cho biến được khai báo bên trong hàm list với giá trị là giá trị tương ứng của mảng.
Còn hàm each() sẽ trả về giá trị chỉ mục và giá trị của phần tử mảng hiện tại , đồng thời chuyển vị trí của chỉ mục lên 1 đơn vị , sẽ trả về False nếu vị trí của chỉ mục là vị trí cuối cùng trong mảng.Cặp giá trị trả về này sẽ nằm trong 1 mảng 4 phần tử là 0,1 , key, value . Phần tử 0 và key chứa tên chỉ mục của mảng, phần tử 1 và value tất nhiên sẽ chứa giá trị .
Có thể chỉ sử dụng while và each thôi cũng được
Code:
<?php
$arr 
= array("one", "two","three");
while (
$phantu = each($arr)) {
    echo 
"Key: $phantu['key']; Value: $phantu['value']<br />\n";
}
?>

Đối với mảng nhiều chiều thỉ cách làm cũng tương tự, chỉ phức tạp hơn là thêm 1 vòng lặp nữa.

Code:
<?php
$sanpham 
= array( array("ITL","INTEL","HARD"),
                        array(
"MIR", "MICROSOFT","SOFT"),
                        array(
"PHP", "PHPVN.ORG","TUTORIAL")
                         );
for (
$row = 0; $row < 3; $row++)
 {
    for (
$col = 0; $col <3; $col++)
        {
         echo 
"|".$sanpham[$row][$col];
         }
echo 
"<br>";
}
?>


To Be Continued ..


Sắp xếp mảng

Do PHP lưu trữ các phần tử trong mảng theo thứ tự chúng được đưa vào mảng, chính vì vậy đôi lúc sẽ nảy sinh nhu cầu sắp xếp các phần từ trong mảng. Để sắp xếp ta có thể dùng các hàm có sẵn của PHP, tiêu biểu là hàm sort
Code:
<?php
    $arr 
= array(5, 3, 6, 4, 2, 1);
    
var_dump($arr);
    echo 
"<br/>\n";
    
sort($arr);
    
var_dump($arr); ?>

Kết quả thu được sẽ là:
Quote
array(6) {
  • => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) }
array(6) {
  • => int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) }
Các bạn có thể thấy là các giá trị đã được sắp xếp tăng dần tuy nhiên các key cũng đã bị thay đổi. Để dữ nguyên các key ban đầu, ta sử dụng hàm asort. Thay thế hàm sort trong ví dụ bằng asort thì sẽ thu được kết quả như sau:

Quote
array(6) {
  • => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) }
array(6) { [5]=> int(1) [4]=> int(2) [1]=> int(3) [3]=> int(4)
  • => int(5) [2]=> int(6) }
Các hàm này cũng sẽ làm việc tốt đẹp với các xâu kí tự, tuy nhiên với 1 mảng có các giá trị "report1.pdf", "report5.pdf", "report10.pdf", and "report15.pdf" thì kết quả thu được sẽ là:
Quote
"report1.pdf", "report10.pdf", "report15.pdf", "report5.pdf"

Đơn giản là vì mã ASCII của "1" nhỏ hơn "5" nên kết quả sẽ ra như vậy. Để giải quyết vấn đề này, thay vì sort và asort ta sử dụng natsort hoặc natcasesort. Kết quả thu được sẽ là:

"report1.pdf", "report5.pdf", "report10.pdf", "report15.pdf"

Sắp xếp mảng nâng cao

Giả sử bạn có mảng nhiều chiều sau:

Code:
<?php
    $bikes 
= array();
    
$bikes["Tourmeister"] = array("name" => "Grande Tour Meister",
                                
"engine_cc" => 1100,
                                
"price" =>12999);
    
$bikes["Slasher1000"] = array("name" => "Slasher XYZ 1000",
                                
"engine_cc" => 998,
                                
"price" => 11450);
    
$bikes["OffRoadster"] = array("name" => "Off-Roadster",
                                
"engine_cc" => 550,
                                
"price" => "4295"); ?>

Khi muốn sắp xếp mảng $bikes theo price của mỗi phần tử thì làm thế nào? Không thể dùng các hàm ở trên được! Vậy giải pháp duy nhất là ta sẽ phải tự sắp xếp

Code:
<?php
    
function compare_price($in_bike1, $in_bike2)
    {
        if (
$in_bike1["price"] > $in_bike2["price"])
        {
            return 
1;
        }
        else if (
$in_bike1["price"] == $in_bike2["price"])
        {
            return 
0;
        }
        else
        {
            return -
1;
        }
    }

    
uasort($bikes, "compare_price");
    foreach (
$bikes as $bike)
    {
        echo 
"Bike {$bike['name']} costs \${$bike['price']}<br/>\n";
    } 
?>

Trong ví dụ trên, mấu chốt chính là ở hàm uasort, hàm này sẽ so sánh từng giá trị trong mảng với nhau bằng hàm so sánh compare_price. Hàm này sẽ so sánh 2 giá trị được đưa vào là $in_bike1 và $in_bike2 rồi trả lại 1 trong 3 giá trị: 1, 0 hoặc (-1) khi so sánh price của $in_bike1 và $in_bike2. Sau cùng ta sẽ thu được kết quả:
Quote
Bike Off-Roadster costs $4295
Bike Slasher XYZ 1000 costs $11450
Bike Grande Tour Meister costs $12999

Sắp xếp ngược lại

Trong các phần trên ta đều thấy sắp xếp tăng dần, vậy để sắp xếp giảm dần thì làm thế nào? Ta có thể sử dụng rsort và arsort thay thế cho sort và asort. Chú ý là không có ursort! Để sắp xếp ngược lại bạn chỉ cần đảo ngược thứ tự trong hàm so sánh của mình

Sắp xếp theo key

Để sắp xếp theo key, ta có các hàm ksort, krsort, và uksort. Sắp xếp theo key sẽ luôn giữ nguyên các key vì vậy không có kasort. Các giá trị đi kèm mỗi key cũng sẽ được giữ nguyên

Các hàm khác

array_merge
Hàm này sẽ nhận vào 2 mảng và trả lại 1 mảng trong đó bao gồm tất cả các giá trị của 2 mảng ban đầu. Các key sẽ được giữ nguyên trừ trường hợp:

2 mảng có 1 key là xâu kí tự giống nhau, thì giá trị của mảng thứ nhất sẽ bị ghi đè bằng giá trị của key đó ở mảng thứ hai
Ở mảng thứ hai nếu trùng các key là số nguyên với mảng thứ nhất, thì các giá trị của mảng thứ hai sẽ nhận 1 key mới (không ghi đè)
Xét ví dụ:

Code:
<?php
    $ar1 
= array('name' => 'Zeke', 10, 100);
    
$ar2 = array('name' => 'Zimbu', 2, 3, 4);

    
$newar = array_merge($ar1, $ar2);

    
print_r($newar); ?>


Kết quả thu được sẽ là:


Quote
Array (
[name] => Zimbu
  • => 10
  • [1] => 100
    [2] => 2
    [3] => 3
    [4] => 4
    )



array_combine

Hàm này nhận vào 2 mảng rồi trả lại 1 mảng, trong đó các key là các giá trị của mảng thứ nhất, các giá trị là từ mảng thứ hai. Nếu 2 mảng không có cùng số phần tử sẽ báo lỗi. Xét ví dụ sau:


Code:
<?php
    $ar1 
= array('name', 'age', 'height');
    
$ar2 = array('Bob', 23, '5\'8"');

    
$newary = array_combine($ar1, $ar2);

    
print_r($newary); ?>


Kết quả thu được sẽ là:


Quote
Array (
[name] => Bob
[age] => 23
[height] => 5'8"
)


array_intersect

Hàm này nhận vào 2 mảng rồi trả lại các phần tử cùng có ở 2 mảng. Các key sẽ được giữ nguyên, nếu cùng 1 giá trị mà lại có 2 key khác nhau thì key ở mảng thứ nhất sẽ được sử dụng. Xét ví dụ sau:

Code:
<?php
    $ar1 
= array('name' => 'Zeke', 10, 100);
    
$ar2 = array('eeek' => 'Zeke', 2, 3, 4, 10);

    
$newar = array_intersect($ar1, $ar2);

    
print_r($newar); ?>


Kết quả thu được (đoán trước rồi hãy đọc xem có đúng kô nhé )
Quote
Array (
[name] => Zeke
  • => 10
)

array_search

Khi bạn cần tìm 1 giá trị trong mảng thì sử dụng hàm này. Cấu trúc rất đơn giản:

Code:
<?php
  $ar1 
= array(1, 10, 100, 23, 44, 562, 354);

  
var_dump(array_search(100, $ar1));
  
var_dump(array_search(3333, $ar1)); ?>


Và đây là kết quả:

Quote
int(2)
bool(false)

Học lập trình web căn bản với PHP

Bài 1: Các kiến thức căn bản Part 1:  https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac.html Part 2:  https://...