Thursday, February 17, 2011

PHP Multiple files upload

Overview
In this tutorial create 2 files
1. multiple_upload.php
2. multiple_upload_ac.php


Step
1. Create file multiple_upload.php
2. Create file multiple_upload_ac.php
3. Create folder "upload" for store uploaded files.
.4. CHMOD your upload folder to "777" by using your ftp software(change permission).

Create file multiple_upload.php
View in browser

############### Code

<table width="500" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form action="multiple_upload_ac.php" method="post" enctype="multipart/form-data" name="form1" id="form1">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td><strong>multiple Files Upload </strong></td>
</tr>
<tr>
<td>Select file
<input name="ufile[]" type="file" id="ufile[]" size="50" /></td>
</tr>
<tr>
<td>Select file
<input name="ufile[]" type="file" id="ufile[]" size="50" /></td>
</tr>
<tr>
<td>Select file
<input name="ufile[]" type="file" id="ufile[]" size="50" /></td>
</tr>
<tr>
<td align="center"><input type="submit" name="Submit" value="Upload" /></td>
</tr>
</table>
</td>
</form>
</tr>
</table>


Create file multiple_upload_ac.php
############### Code
<?php
//set where you want to store files
//in this example we keep file in folder upload
//$HTTP_POST_FILES['ufile']['name']; = upload file name
//for example upload file name cartoon.gif . $path will be upload/cartoon.gif

$path1= "upload/".$HTTP_POST_FILES['ufile']['name'][0];
$path2= "upload/".$HTTP_POST_FILES['ufile']['name'][1];
$path3= "upload/".$HTTP_POST_FILES['ufile']['name'][2];
//copy file to where you want to store file
copy($HTTP_POST_FILES['ufile']['tmp_name'][0], $path1);
copy($HTTP_POST_FILES['ufile']['tmp_name'][1], $path2);
copy($HTTP_POST_FILES['ufile']['tmp_name'][2], $path3);
//$HTTP_POST_FILES['ufile']['name'] = file name
//$HTTP_POST_FILES['ufile']['size'] = file size
//$HTTP_POST_FILES['ufile']['type'] = type of file

echo "File Name :".$HTTP_POST_FILES['ufile']['name'][0]."<BR/>";
echo "File Size :".$HTTP_POST_FILES['ufile']['size'][0]."<BR/>";
echo "File Type :".$HTTP_POST_FILES['ufile']['type'][0]."<BR/>";
echo "<img src=\"$path1\" width=\"150\" height=\"150\">";
echo "<P>";
echo "File Name :".$HTTP_POST_FILES['ufile']['name'][1]."<BR/>";
echo "File Size :".$HTTP_POST_FILES['ufile']['size'][1]."<BR/>";
echo "File Type :".$HTTP_POST_FILES['ufile']['type'][1]."<BR/>";
echo "<img src=\"$path2\" width=\"150\" height=\"150\">";
echo "<P>";
echo "File Name :".$HTTP_POST_FILES['ufile']['name'][2]."<BR/>";
echo "File Size :".$HTTP_POST_FILES['ufile']['size'][2]."<BR/>";
echo "File Type :".$HTTP_POST_FILES['ufile']['type'][2]."<BR/>";
echo "<img src=\"$path3\" width=\"150\" height=\"150\">";
///////////////////////////////////////////////////////
// Use this code to display the error or success.
$filesize1=$HTTP_POST_FILES['ufile']['size'][0];
$filesize2=$HTTP_POST_FILES['ufile']['size'][1];
$filesize3=$HTTP_POST_FILES['ufile']['size'][2];
if($filesize1 && $filesize2 && $filesize3 != 0)
{
echo "We have recieved your files";
}
else {
echo "ERROR.....";
}
//////////////////////////////////////////////
// What files that have a problem? (if found)
if($filesize1==0) {
echo "There're something error in your first file";
echo "<BR />";
}
if($filesize2==0) {
echo "There're something error in your second file";
echo "<BR />";
}
if($filesize3==0) {
echo "There're something error in your third file";
echo "<BR />";
}
?>


CHMOD upload folder to 777 (change permission)
This step, do it when you upload to real server.
This example, I use WS-FTP, right click at upload folder > FTP Commands > CHMOD(Unix)


Upload File อย่างปลอดภัย เช็คจากประเภทของไฟล์ หรือนามสกุลของไฟล์ดี

ทุกคนคงเคยเขียนโปรแกรม webboard ที่สามารถทำการ upload รูปขึ้นมาได้กันบ้างแล้ว และแต่ละคนคงจะมีวิธีการตรวจสอบว่าเป็น file รูปภาพหรือไม่ แตกต่างกันออกไปแล้วแต่ความถนัด ในเรื่องนี้ผมจะเปรียบเที่ยบความแตกต่างระหว่างการตรวจสอบชนิดของ file ที่ upload ขึ้นมาผ่านทาง file type กับ นามสกุลของ file มาดูจิว่า แบบไหนน่าใช้กว่ากัน

ในช่วงแรกๆ ที่ผมหัดเขียนโปรแกรมเพื่อทำการ upload file ขึ้นมาที่ server ผมจะใช้วิธีการตรวจสอบ ว่าเป็น file ชนิดอะไรจาก
นาม สกุลของ file แต่หลังจากนั้นผมก็เริ่มเขียนโปรแกรมโดยการตรวจสอบชนิดของ file จาก file type ซึ้งผมคิดว่ามันน่าจะดีกว่าแบบแรก แต่ผมก็พบว่ามันไม่ได้ดีอย่างที่ผมคิด มาดูกันแต่ละแบบแล้วกันว่ามีความแตกต่างและจุดบกพร้องอย่างไรบ้าง
ในการตรวจสอบชนิดของ file จากการตรวจสอบจากนามสกุลของ file ที่ upload ขึ้นมานั้นสามารถที่จะเขียน code ได้ง่ายๆ ดังนี้
# copy แล้ว save เป็นupload1.php เพื่อใช้ในการทดสอบ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
 
// รับเฉพาะ .gif กับ .jpg นะครับ
 
print $file_name;
 
if(strtoupper(substr($file_name, -4)) == ".JPG" || strtoupper(substr($file_name, -4)) == ".GIF"){
       copy($file,"/www/upload/".$file_name);
}
 
?>
<form action="upload1.php" method="POST" enctype="multipart/form-data">
<input type="file" name="file"><input type="submit">
</form>
โดยที่ ช่อง input ที่ใช้ select file มี name = file แบบนี้นะ <input type="file" name="file">
และตัวแปร $file_name จะแทนชื่อของ file ที่ upload ขึ้นมา หรืออาจจะใช้ $_FILES['file']['name'] ก็ได้
ซึ่ง จากตัวอย่างจะเห็นว่ามี การ copy ข้อมูลไปไว้ที่ folder /www/upload/ โดยวิธีนี้จะดีตรงที่สามารถทำการ ตรวจสอบได้ง่าย แต่หากว่า file ที่ upload ขึ้นมาไม่ใช้ file รูปภาพ ก็ไม่สามารถที่จะตรวจสอบได้แล้ว อย่างเช่น ถ้า user ทำการเปลี่ยน นามสกุลของ file เป็น .gif ก่อนที่จะทำการ upload ขึ้นมาเราก็ตรวจสอบโดยวิธีนี้ไม่ได้ แต่ก็ดีตรงที่ file ที่ save ไปนั้นไม่ว่าจะเป็น file อะไร ก็จะมีนามสกุล เป็น .jpg กับ gif เสมอ
วิธีการตรวจสอบชนิดของ file โดยการ ตรวจสอบ จาก file type คือการตรวจสอบชนิดของ file จริงๆว่าเป็น file ชนิดอะไร ไม่ว่าจะทำการเปลี่ยน นามสกุลของ file ไปเป็นอะไร ก็ตามเจ้า file type ก็ยังเหมือนเดิม มาดู code กันเลย
# copy แล้ว save เป็น upload2.php เพื่อใช้ในการทดสอบ
1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
print $file_type;
 
if($file_type == "image/jpeg" || $file_type == "image/gif"){
      copy($file,"/www/upload/".$file_name);
}
 
?>
<form action="upload2.php" method="POST" enctype="multipart/form-data">
<input type="file" name="file"><input type="submit">
</form>
จาก code ที่ผ่านมาคุณคงจะคิดว่า แหม่ ตรวจสอบจากเจ้า file type นี้มันดีกว่านะ เพราะว่าไม่ว่าจะทำการเปลี่ยน นามสกุลของ file อย่างไร เราก็สามารถที่จะตรวจได้หมด เลยว่ามันเป็น อะไร กันแน่
อันที่จริง จะคิด แบบนี้ ก็จริงอยู่ครับว่ามันสามารถที่จะตรวจสอบได้ว่า เป็น file อะไรกันแน่ถ้าหากว่า user ทำการเปลี่ยน นามสกุล ของ file ก่อนที่จะทำการ upload ขึ้นมา
แต่ลองมาคิดดูอีกที่ หากว่าข้อมูลที่เขาส่งขึ้นมามันไม่ได้ มาจาก form ที่เราเขียนขึ้นละ มันกลับมาจากโปรแกรมที่สามารถทำการเปลี่ยน header ได้ละ จะเป็นยังไง ผลนะเหรอครับ ระวังให้ดีเราอาจจะโดน hack ง่ายๆ แน่ๆๆ
ตัวอย่างเช่นผมสร้าง file ชื่อ xx.php จากนั้นผมก็เขียน code php ตามปกติ อาจจะเขียน phpinfo(); ดูก็ได้ จากนั้นผมก็ทำการ upload file นี้เข้ามาโดยผ่านทาง โปรแกรม upload file ที่เราสร้างกันตะกี่นี้ อะอะ แต่ว่าผมไม่ได้ ทำการ upload ผ่านทาง form ที่คุณสร้าง นะ แต่ว่าผมจะเขียนโปรแกรม เพื่อทำการ upload มาที่ upload2.php ของคุณเอง โดยที่โปรแกรมของ ผมจะทำการหลอก header ด้วยว่าเป็น file .gif แค่นี้ ผมก็สามารถที่จะทำการ upload xxx.php มาที่ server ของคุณได้แล้ว ลองคิดดูเอง นะถ้าใน file xx.php ไม่ได้มีแค่ phpinfo() ละจะเป็นยังไง
คุณอาจจะคิดว่า จะหลอกมันได้ยังไง ในเมื่อขนาดว่าเราเปลี่ยน นามสกุลมาเป็น .gif มันยังรู้เลยว่า file type ที่แท้จริง คืออะไร
ซึ่งในการ เขียนโปรแกรมเพื่อหลอก header ตรงนี้ผมจะนำมาบอก อีกครั้งหนึ่ง วันนี้ดึกแล้ว ง่วงมากๆๆ นอนก่อน…ครับ

การ Upload File มาที่ Web Server โดยใช้ php ทำยังไง

สวัสดีครับ วันนี้จะขอเขียนตัวอย่างง่ายๆ ในการ Upload ไฟล์จากเครื่องผู้ใช้ มาที่ web server โดยใช้ php ซึ่งท่านสามารถเอาไปดัดแปลงเพื่อให้ใช้งานได้ตามความต้องการครับ

ในตัวอย่างนี้จะมีไฟล์ด้วยกัน 2 ไฟล์ครับ ไฟล์แรก จะเป็นฟอร์มในการ ใส่ชื่อไฟล์ที่จะ Upload ครับ ชื่อว่า main.htm code เป็นดังนี้ครับ

<HTML>
<FORM ENCTYPE="multipart/form-data" ACTION="add_file.php" METHOD="post">
Upload ไฟล์นี้มาที่ Server: <INPUT TYPE="file" NAME="userfile"><BR>
<INPUT TYPE="submit" VALUE="Upload"><BR>
</FORM>
</HTML>


ซึ่งก็จะเห็นว่าไม่มีอะไรยาก มีเพียงแค่ ENCTYPE="multipart/form-data" ที่จะบอกว่า ข้อมูลใน form นี้เป็น mime format เท่านั้นเอง

คราวนี้ลองมาดูอีกไฟล์ที่เป็นส่วนในการจัดการ upload มาที่ server ชื่อ add_file.php ครับ หน้าตาเป็นดังนี้
<?php
$Upload_Dir = "d:"; //กำหนดว่าจะให้ copy ไฟล์ที่มาจากเครื่องผู้ใช้ไปที่ใด ระบุที่นี่ได้ครับ
$Max_File_Size = 100000; //กำหนดขนาดไฟล์ที่ใหญ่ที่สุดที่อนุญาตให้ upload มาที่ Server มีหน่วยเป็น byte
$File_Type_Allow = array("application/x-zip-compressed" /*.zip*/,
                    "text/plain" /*.txt*/,
                    "image/bmp" /* .bmp, .ico*/,
                    "image/gif" /* .gif*/,
                    "image/pjpeg" /*.jpg, .jpeg*/,
                    "image/jpeg" /* .jpg, .jpeg*/); //กำหนดประเภทของไฟล์ว่าไฟล์ประเภทใดบ้างที่อนุญาตให้ upload มาที่ Server

function validate_form($file_input,$file_size,$file_type) { //เป็น function ที่เอาไว้ตรวจสอบว่าไฟล์ที่ผู้ใช้ upload ตรงตามเงื่อนไขหรือเปล่า
   global $Max_File_Size,$File_Type_Allow;
   if ($file_input == "none") {
      $error = "ไม่มี file ให้ Upload";
   } elseif ($file_size > $Max_File_Size) {
      $error = "ขนาดไฟล์ใหญ่กว่า $Max_File_Size ไบต์";
   } elseif (!check_type($file_type,$File_Type_Allow)) {
      $error = "ไฟล์ประเภทนี้ ไม่อนุญาตให้ Upload";
   } else {
      $error = false;
   }

   return $error;
}

function check_type($type_check) { //เป็นฟังก์ชัน ที่ตรวจสอบว่า ไฟล์ที่ upload อยู่ในประเภทที่อนุญาตหรือเปล่า
   global $File_Type_Allow;
   for ($i=0;$i<count($File_Type_Allow);$i++) {
      if ($File_Type_Allow[$i] == $type_check) {
         return true;
      }
   }
   return false;
}

$error_msg = validate_form($userfile,$userfile_size,$userfile_type); // ตรวจดูว่า ไฟล์ที่ upload ตรงตามเงื่อนไขหรือเปล่า
if ($error_msg) {
   echo $error_msg;
} else {
   if (copy($userfile,$Upload_Dir."/$userfile_name")) { //ทำการ copy ไฟล์มาที่ Server
      echo "ไฟล์ Upload เรียบร้อย";
   } else {
      echo "ไฟล์ Upload มีปัญหา";
   }
}
?>

ครับสำหรับตัวอย่างนี้ก็คงไม่ยากอะไรในการที่จะ upload ไฟล์มาที่ Server นะครับ แต่มีข้อระวังอยู่นิดหน่อยก็คือ ในตัวอย่างจะเป็น code ที่ ทดสอบที่เครื่องของผู้เขียนเอง โดยใช้ Apache และ php บน Win98 หากจะเปลี่ยนมาใช้บน Unix Server ก็ให้แก้ตัวแปร $Upload_Dir เป็น ของ unix และที่สำคัญท่านอาจพบปัญหาเกี่ยวกับ permission ท่านต้องแน่ใจว่า directory ที่ท่านระบุเปิดสิทธิ์ให้ทุกคนมีสิทธิ์เขียนไปที่ Directory นั้นด้วย หากพบปัญหาอะไรก็ถามมาได้ครับ

Upload File ด้วย PHP

สำหรับคราวนี้ เราจะดูวิธีการในการ Upload File โดยใช้ PHP ซึ่ง ก็เป็นเรื่องง่ายมากครับ และในตัวอย่างนี้ผมใช้ Run กะ IIS บน WindowsXP Professional ซึ่งได้ทำการลง PHP Version 4.3.0 ซึ่ง Download มาจาก www.php.net และสำหรับเพื่อนๆที่ได้ใช้ Windows ตัวอื่นๆ สามารถ อ่านวิธีการติดตั้ง ได้จาก บทความ ที่ผ่านมาของผมครับ (ติดตั้ง PHP 4 บน WINDOWS 9X, Me และ NT(IIS2 และ IIS3), ติดตั้ง PHP 4 บน WINDOWS 2000) แต่สำหรับผู้ใช้ WindowsXP ก็มีวิธีคล้ายกัน ที่เพิ่มเข้ามาก็คือ ให้เข้าไปแก้ไฟล์ php.ini ในหัวข้อ cgi.force_redirect = 0 ครับ ต่อจากนั้นก็ให้ทดสอบ โดยใช้วิธีการทดสอบเดียวกันกับ ติดตั้ง PHP 4 บน WINDOWS 2000 ครับ โดยใช้เพียง function phpinfo(); ในการทดสอบครับ ดังตัวอย่างด้านล่าง
test.php
<?php
     phpinfo();
?>
สำหรับการปรับแต่งการ Upload สามารถปรับเปรียนได้ที่ไฟล์ php.ini โดยดูที่
file_uploads = On
และสำหรับ upload_tmp_dir = จะเป็นการกำหนด path ที่ใช้เป็น Temp เก็บไฟล์ไว้ชั่วคราวเท่านั้น โดยไฟล์ต่างๆ ที่เรา upload มาแล้วจะถูกเก็บไว้ใน Path นี้ ไว้ไม่นาน ก็จะถูกลบโดยอัตโนมัติครับ , ค่าของ upload_tmp_dir นี้ เราไม่ต้องกำหนด ก็ได้ครับ เพราะมันจะใช้ Temp ที่มีในระบบ OS นั้นๆครับ
upload_max_filesize จะเป็นการกำหนด ขนาดของไฟล์สูงสุดที่ สามารถรับได้
เอาละครับงานนี้เรามาดูส่วนของไฟล์ html ที่จะทำหน้าที่เป็นตัว Post ข้อมูลไปยังไฟล์ php โดยมีโค้ดดังนี้
upload.html
<html> 
<form action="upload.php" method=post enctype="multipart/form-data"> 
    File: <input type=file name="userfile"><br> 
   <input type=submit><br> 
</form> 
</html> 
โดยส่วนที่สำคัญ ก็คือส่วนของ enctype="multipart/form-data" และ name="userfile" โดย ส่วนแรกจะเป็นการบอกว่ามีการ ส่งทั้ง ข้อมูลที่เป็นข้อความ และ ที่เป็นไฟล์ครับ ,ส่วนหลังจะเป็นการกำหนดชื่อของ Input ที่ส่งไป ครับ
ตอนนี้ ก็มาถึงเรื่องไฟล์ php ที่เราจะใช้ในการรับ และ จัดการกับ ไฟล์ที่ส่งมา โดยมีโค้ดดังตารางด้านล่าง
upload.php
<?php
  $realname = $HTTP_POST_FILES['userfile']['name'];
  if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name']))
  {
     copy($HTTP_POST_FILES['userfile']['tmp_name'], "./upload/$realname");
     echo "Upload Filename: " . $HTTP_POST_FILES['userfile']['name'];
  }
  else{
     echo "Upload not complete";
   }
?>
***ก่อนเราจะทำการทดสอบโค้ด ให้คุณ สร้าง โฟล์เดอร์ upload ไว้ที่ๆเดียวกับที่คุณเก็บไฟล์ php นะครับ
จากโค้ดข้างต้น จะเป็นการเก็บชื่อไฟล์ที่เรา upload มา เก็บไว้ในตัวแปร $realname จากนั้นจะเป็นการตรวจสอบว่า ในข้อมูลที่ส่งมา (ผ่าน การ Post ) มีไฟล์มาด้วยหรือ ไม่ ถ้าไม่ ก็ให้แสดงข้อความว่า Upload not complete แต่ หากว่า มีการส่งไฟล์มาด้วย ก็จะทำการ คัดลอกไฟล์ดังกว่า ด้วยการใช้ function copy คัดลอกไปไว้ใน โฟล์เดอร์ upload โดยมีชื่อไฟล์ เป็นชื่อเดิมของไฟล์ที่ส่งมา หลังจากนั้นก็แสดงข้อความ Upload File : และชื่อไฟล์ที่ได้รับ
ทิ้งทาย
หากว่าคุณไม่สามารถใช้ $HTTP_POST_FILES ได้ ให้คุณทำการเพิ่มโค้ด
global $HTTP_POST_FILES;
ไว้เป็นบรรทัดแรกของโปรแกรม และสำหรับ ฟังก์ชั่น is_uploaded_file นั้นจะใช้ได้ตั้งแต่ PHP 3>= 3.0.17 และ PHP 4 >= 4.0.3 ครับ แล้วพบกันใหม่กับ 9M

การเขียน Script เพื่อแบ่งหน้า

 การเขียน Script เพื่อแบ่งหน้า


<?php
/*Connect ฐานข้อมูล */
mysql_connect('localhost','root',''); // connect mysql
mysql_select_db('topic'); // select database
/* check ว่ามี ค่าตัวแปร $start หรือไม่ ถ้าไม่มีให้ตั้งเป็น 0
ปล. อันนี้ต้องใช้กับตัวแบ่งนะ ห้ามเอาออก*/

if(!isset($start)){
$start = 0;
}
$limit = '10'; // แสดงผลหน้าละกี่หัวข้อ
/* หาจำนวน record ทั้งหมด
ปล. อันนี้ต้องใช้กับตัวแบ่งนะ ห้ามเอาออก*/

$Qtotal = mysql_query("select * from topic"); //คิวรี่ คำสั่ง
$total = mysql_num_rows($Qtotal); // หาจำนวน record
/* คิวรี่ข้อมูลออกมาเพื่อแสดงผล */
$Query = mysql_query("SELECT * FROM topic ORDER BY id DESC LIMIT $start,$limit"); //คิวรี่คำสั่ง
$totalp = mysql_num_rows($Query); // หาจำนวน record ที่เรียกออกมา
/* อันนี้ ไม่เกี่ยวเอาออกได้ */
printf("มีหัวข้อทั้งหมด %d หัวข้อ / ",$total);
printf("แสดงหน้าละ %d หัวข้อ<br />",$totalp);
echo "<hr />";
/* วนลูปข้อมูล */
while($arr = mysql_fetch_array($Query)){
echo sprintf("<B>%03d</B>",$arr[id])." - $arr[title]<br />"; // แสดงผล
}
echo "<hr>";
/* ตัวแบ่งหน้า */
$page = ceil($total/$limit); // เอา record ทั้งหมด หารด้วย จำนวนที่จะแสดงของแต่ละหน้า
/* เอาผลหาร มาวน เป็นตัวเลข เรียงกัน เช่น สมมุติว่าหารได้ 3 เอามาวลก็จะได้ 1 2 3 */
for($i=1;$i<=$page;$i++){
if($_GET['page']==$i){ //ถ้าตัวแปล page ตรง กับ เลขที่วนได้
echo "[<a href='?start=".$limit*($i-1)."&page=$i'><B>$i</B></A>]"; //ลิ้งค์ แบ่งหน้า เงื่อนไขที่ 1
}else{
echo "[<a href='?start=".$limit*($i-1)."&page=$i'>$i</A>]"; //ลิ้งค์ แบ่งหน้า เงื่อนไขที่ 2
}
}

?>

แบ่งหน้า ด้วย Code แบบง่าย

ในตัวอย่างข้างล่างเป็นการนำเสนอรายชื่อจังหวัดในประเทศไทย
โดยจะทำการนำมาแสดงหน้าละ 10 รายการ
สามารถดูตัวอย่าง โค้ด และ ดาต้าเบสจังหวัดในประเทศไทย ได้ดังต่อไปนี้
ดาวน์โหลดตัวอย่างดาต้าเบส
คลิกเพื่อดาวน์โหลด

ดูตัวอย่างคลิก

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=windows-874" />  
  5. <title></title>  
  6. <style type="text/css">  
  7. body{  
  8.     font-size:12px;  
  9. }  
  10. </style>  
  11. <?php  
  12.     // สร้างฟังก์ชั่น สำหรับแสดงการแบ่งหน้า  
  13.     function page_navigator($before_p,$plus_p,$total,$total_p){  
  14.         echo $before_p." to ".$plus_p." of ".$total." |  Go to Page ";  
  15.         for($i=0;$i<$total_p;$i++){  
  16.             echo "<a href='?s_page=$i'>".intval($i+1)."</a> ";  
  17.         }  
  18.     }  
  19. ?>  
  20. </head>  
  21.   
  22. <body>  
  23. <?php  
  24. // ทำการเชิ่อมต่อฐานข้อมูล  
  25. $link=mysql_connect("localhost","root","123456"or die("error".mysql_error());  
  26.  mysql_select_db("test",$link);   
  27. ?>  
  28. <?php  
  29.     $q="select * from province ";  // แก้ไขขื่อตารางตามต้องการ  
  30.     $qr=mysql_query($q);  
  31.     $total=mysql_num_rows($qr);  
  32.     $e_page=10; // กำหนด จำนวนรายการที่แสดงในแต่ละหน้า  
  33.     if(!isset($s_page)){  
  34.         $s_page=0;  
  35.     }else{  
  36.         $chk_page=$s_page;    
  37.         $s_page=$s_page*$e_page;  
  38.     }  
  39.     $q.=" limit $s_page,$e_page";  
  40.     $qr=mysql_query($q);  
  41.     if(mysql_num_rows($qr)>=1){  
  42.         $plus_p=($chk_page*$e_page)+mysql_num_rows($qr);  
  43.     }else{  
  44.         $plus_p=($chk_page*$e_page);      
  45.     }  
  46.     $total_p=ceil($total/$e_page);  
  47.     $before_p=($chk_page*$e_page)+1;  
  48. ?>       
  49. <table width="100%" border="0" cellspacing="0" cellpadding="0">  
  50.   <tr>  
  51.     <td bgcolor="#CCCCCC">จังหวัด</td>  
  52.   </tr>  
  53.    <tr>  
  54.   <td>  
  55.   <fieldset>  
  56.  <?php  
  57.  // เรียกใช้งานฟังก์ชั่น สำหรับแสดงการแบ่งหน้า  
  58.   page_navigator($before_p,$plus_p,$total,$total_p);   
  59.   ?>  
  60.   </fieldset>  
  61.   </td>  
  62.   </tr>   
  63.   
  64.   <?php  
  65.     $q="select * from province limit $s_page,$e_page"// แก้ไขขื่อตารางตามต้องการ  
  66.     $qr=mysql_query($q);  
  67.     while($rs=mysql_fetch_array($qr)){  
  68.   ?>  
  69.   <tr>  
  70.     <td bgcolor="#F2F2F2"><?=$rs['name_province']?></td>  
  71.   </tr>    
  72.   <?php } ?>  
  73.   <tr>  
  74.   <td>  
  75.   <fieldset>  
  76.  <?php  
  77.   // เรียกใช้งานฟังก์ชั่น สำหรับแสดงการแบ่งหน้า  
  78.   page_navigator($before_p,$plus_p,$total,$total_p);   
  79.   ?>  
  80.   </fieldset>  
  81.   </td>  
  82.   </tr>  
  83. </table>  
  84. </body>  
  85. </html>  


  1. --   
  2. -- Table structure for table `province`  
  3. --   
  4.   
  5. CREATE TABLE `province` (  
  6.   `id_province` int(11) NOT NULL auto_increment,  
  7.   `name_province` varchar(255) NOT NULL default '',  
  8.   PRIMARY KEY  (`id_province`)  
  9. ) ENGINE=MyISAM DEFAULT CHARSET=tis620 AUTO_INCREMENT=77 ;  
  10.   
  11. --   
  12. -- Dumping data for table `province`  
  13. --   
  14.   
  15. INSERT INTO `province` VALUES (1, 'กรุงเทพมหานคร');  
  16. INSERT INTO `province` VALUES (2, 'กระบี่');  
  17. INSERT INTO `province` VALUES (3, 'กาญจนบุรี');  
  18. INSERT INTO `province` VALUES (4, 'กาฬสินธุ์');  
  19. INSERT INTO `province` VALUES (5, 'กำแพงเพชร');  
  20. INSERT INTO `province` VALUES (6, 'ขอนแก่น');  
  21. INSERT INTO `province` VALUES (7, 'จันทบุรี');  
  22. INSERT INTO `province` VALUES (8, 'ฉะเชิงเทรา');  
  23. INSERT INTO `province` VALUES (9, 'ชลบุรี');  
  24. INSERT INTO `province` VALUES (10, 'ชัยนาท');  
  25. INSERT INTO `province` VALUES (11, 'ชัยภูมิ');  
  26. INSERT INTO `province` VALUES (12, 'ชุมพร');  
  27. INSERT INTO `province` VALUES (13, 'เชียงราย');  
  28. INSERT INTO `province` VALUES (14, 'เชียงใหม่');  
  29. INSERT INTO `province` VALUES (15, 'ตรัง');  
  30. INSERT INTO `province` VALUES (16, 'ตราด');  
  31. INSERT INTO `province` VALUES (17, 'ตาก');  
  32. INSERT INTO `province` VALUES (18, 'นครนายก');  
  33. INSERT INTO `province` VALUES (19, 'นครปฐม');  
  34. INSERT INTO `province` VALUES (20, 'นครพนม');  
  35. INSERT INTO `province` VALUES (21, 'นครราชสีมา');  
  36. INSERT INTO `province` VALUES (22, 'นครศรีธรรมราช');  
  37. INSERT INTO `province` VALUES (23, 'นครสวรรค์');  
  38. INSERT INTO `province` VALUES (24, 'นนทบุรี');  
  39. INSERT INTO `province` VALUES (25, 'นราธิวาส');  
  40. INSERT INTO `province` VALUES (26, 'น่าน');  
  41. INSERT INTO `province` VALUES (27, 'บุรีรัมย์');  
  42. INSERT INTO `province` VALUES (28, 'ปทุมธานี');  
  43. INSERT INTO `province` VALUES (29, 'ประจวบคีรีขันธ์');  
  44. INSERT INTO `province` VALUES (30, 'ปราจีนบุรี');  
  45. INSERT INTO `province` VALUES (31, 'ปัตตานี');  
  46. INSERT INTO `province` VALUES (32, 'พระนครศรีอยุธยา');  
  47. INSERT INTO `province` VALUES (33, 'พะเยา');  
  48. INSERT INTO `province` VALUES (34, 'พังงา');  
  49. INSERT INTO `province` VALUES (35, 'พัทลุง');  
  50. INSERT INTO `province` VALUES (36, 'พิจิตร');  
  51. INSERT INTO `province` VALUES (37, 'พิษณุโลก');  
  52. INSERT INTO `province` VALUES (38, 'เพชรบุรี');  
  53. INSERT INTO `province` VALUES (39, 'เพชรบูรณ์');  
  54. INSERT INTO `province` VALUES (40, 'แพร่');  
  55. INSERT INTO `province` VALUES (41, 'ภูเก็ต');  
  56. INSERT INTO `province` VALUES (42, 'มหาสารคาม');  
  57. INSERT INTO `province` VALUES (43, 'มุกดาหาร');  
  58. INSERT INTO `province` VALUES (44, 'แม่ฮ่องสอน');  
  59. INSERT INTO `province` VALUES (45, 'ยโสธร');  
  60. INSERT INTO `province` VALUES (46, 'ยะลา');  
  61. INSERT INTO `province` VALUES (47, 'ร้อยเอ็ด');  
  62. INSERT INTO `province` VALUES (48, 'ระนอง');  
  63. INSERT INTO `province` VALUES (49, 'ระยอง');  
  64. INSERT INTO `province` VALUES (50, 'ราชบุรี');  
  65. INSERT INTO `province` VALUES (51, 'ลพบุรี');  
  66. INSERT INTO `province` VALUES (52, 'ลำปาง');  
  67. INSERT INTO `province` VALUES (53, 'ลำพูน');  
  68. INSERT INTO `province` VALUES (54, 'เลย');  
  69. INSERT INTO `province` VALUES (55, 'ศรีสะเกษ');  
  70. INSERT INTO `province` VALUES (56, 'สกลนคร');  
  71. INSERT INTO `province` VALUES (57, 'สงขลา');  
  72. INSERT INTO `province` VALUES (58, 'สตูล');  
  73. INSERT INTO `province` VALUES (59, 'สมุทรปราการ');  
  74. INSERT INTO `province` VALUES (60, 'สมุทรสงคราม');  
  75. INSERT INTO `province` VALUES (61, 'สมุทรสาคร');  
  76. INSERT INTO `province` VALUES (62, 'สระแก้ว');  
  77. INSERT INTO `province` VALUES (63, 'สระบุรี');  
  78. INSERT INTO `province` VALUES (64, 'สิงห์บุรี');  
  79. INSERT INTO `province` VALUES (65, 'สุโขทัย');  
  80. INSERT INTO `province` VALUES (66, 'สุพรรณบุรี');  
  81. INSERT INTO `province` VALUES (67, 'สุราษฎร์ธานี');  
  82. INSERT INTO `province` VALUES (68, 'สุรินทร์');  
  83. INSERT INTO `province` VALUES (69, 'หนองคาย');  
  84. INSERT INTO `province` VALUES (70, 'หนองบัวลำภู');  
  85. INSERT INTO `province` VALUES (71, 'อ่างทอง');  
  86. INSERT INTO `province` VALUES (72, 'อำนาจเจริญ');  
  87. INSERT INTO `province` VALUES (73, 'อุดรธานี');  
  88. INSERT INTO `province` VALUES (74, 'อุตรดิตถ์');  
  89. INSERT INTO `province` VALUES (75, 'อุทัยธานี');  
  90. INSERT INTO `province` VALUES (76, 'อุบลราชธานี'); 

Code แบ่งหน้า สวย ๆ

คนละตัวกันครับ ของ PostSmiles.com ตามโค๊ดด้านล่างนี้เลยครับ

โค๊ด:
<style type="text/css">
<!--
span.split-page-present {
 padding: 0px 5px;
 margin: 0px 1px;
 border: 1px solid #999999;
 background-color: #999999;
 line-height: 1.5em;
 font-size: 0.9em;
 color: #FFFFFF;
}
span.split-page-select {
 color: #000000;
}
span.split-page-select a:link {
 padding: 0px 5px;
 margin: 0px 1px;
 border: 1px solid #E5E5E5;
 background-color: #E5E5E5;
 line-height: 1.5em;
 font-size: 0.9em;
 color: #000000;
 text-decoration: none;
}
span.split-page-select a:visited {
 padding: 0px 5px;
 margin: 0px 1px;
 border: 1px solid #E5E5E5;
 background-color: #E5E5E5;
 line-height: 1.5em;
 font-size: 0.9em;
 color: #000000;
 text-decoration: none;
}
span.split-page-select a:hover {
 padding: 0px 5px;
 margin: 0px 1px;
 border: 1px solid #999999;
 background-color: #999999;
 line-height: 1.5em;
 font-size: 0.9em;
 color: #FFFFFF;
 text-decoration: none;
}
div#wrapper-split-page {
 margin: 10px 20px 10px 20px;
 text-align: right;
}-->
</style>
<?php
 # Function: Display split pages : link normal function split_page($geturl ""$rows_page ""$totalpage ""$startpage ""$endpage ""$page "") {  if (!empty($rows_page)) {   $total_all_records number_format($rows_page',');   echo " <strong>Page:</strong> {$page} of {$totalpage} (Total: {$total_all_records} items) ";   if (!empty($rows_page)) {    if ($page 1) {     $back $page 1;     echo "<a href=\"{$geturl}&page=1\"><img src=\"images/icon/icon-first-page.png\" title=\"First Page\" width=\"10\" height=\"12\" border=\"0\" align=\"absmiddle\" /></a>&nbsp;";     echo "<a href=\"{$geturl}&page={$back}\"><img src=\"images/icon/icon-prev-page.png\" title=\"Previous Page\" width=\"7\" height=\"12\" border=\"0\" align=\"absmiddle\" /></a>&nbsp;";     if ($startpage 1) { echo " ... "; }    } else {     echo "<img src=\"images/icon/icon-first-page-dummy.png\" title=\"First Page\" width=\"10\" height=\"12\" border=\"0\" align=\"absmiddle\" />&nbsp;";     echo "<img src=\"images/icon/icon-prev-page-dummy.png\" title=\"Previous Page\" width=\"7\" height=\"12\" border=\"0\" align=\"absmiddle\" />&nbsp;";     if ($startpage 1) { echo " ... "; }    }    # Display number pages for link and select    for ($i $startpage$i <= $endpage$i++) {     if ($i == $page ) {      echo "<span class=\"split-page-present\">{$i}</span>";     } else  {      echo "<span class=\"split-page-select\"><a href=\"{$geturl}&page={$i}\">{$i}</a></span>";     }       if ($page $totalpage) {     $next $page 1;     if ($endpage $totalpage) { echo " ... "; }     echo "&nbsp;<a href=\"{$geturl}&page={$next}\"><img src=\"images/icon/icon-next-page.png\" title=\"Next Page\" width=\"7\" height=\"12\" align=\"absmiddle\" /></a>";     echo "&nbsp;<a href=\"{$geturl}&page={$totalpage}\"><img src=\"images/icon/icon-last-page.png\" title=\"Last Page\" width=\"10\" height=\"12\" align=\"absmiddle\" /></a>";    } else {     if ($endpage $totalpage) { echo " ... "; }     echo "&nbsp;<img src=\"images/icon/icon-next-page-dummy.png\" title=\"Next Page\" width=\"7\" height=\"12\" align=\"absmiddle\" />";     echo "&nbsp;<img src=\"images/icon/icon-last-page-dummy.png\" title=\"Last Page\" width=\"10\" height=\"12\" align=\"absmiddle\" />";    }   }   //echo " <span class=\"split-page\">{ <a href=\"{$geturl}&page=all\">Show All</a> }</span>"; // end if: !empty($rows_page) }    # Process data : use MySQL class for any website $link=mysql_connect("localhost","root",""); mysql_select_db("thailocation"); # Configuration variable for split pages $pagelen 20// config : set value for display per pages $range 5// config : number page for show in link $page $_GET['page']; # Mode SQL Command : Select for count data in condition $sql " SELECT "// $sql .= " ar_id "; $sql .= " FROM "; $sql .= " tbl_article ";   // end if : $cate_id != "all" # Execute query command $res['select_all_data'] = mysql_query($sql); # Calculate variable for split pages $rows_page mysql_num_rows($res['select_all_data']); $totalpage ceil($rows_page $pagelen); # Check :  if (empty($page)) { $page 1; } //  if ((!ereg("^[0-9]+$""$page")) && ($page != "all")) { $page 1; } //  if ($page $totalpage) { $page 1; } //  $goto = ($page 1) * $pagelen;  $startpage $page $range; $endpage $page $range; if ($startpage <= 1) {  $startpage 1; } if ($endpage >= $totalpage) {  $endpage $totalpage; # Mode SQL Command : Select data for split pages (main data in condition) $sql " SELECT "; $sql .= " *  "; $sql .= " FROM "; $sql .= " tbl_article "; $sql .= " ORDER BY "; $sql .= " ar_id "; $sql .= " DESC "; if ($page != "all") { // Display all page : { Show All } $sql .= " LIMIT $goto , $pagelen "; } # Execute query command $res['select_split_page'] = mysql_query($sql);   # Get number of rows in result : per page $count_rows mysql_num_rows($res['select_split_page']);

###########Show data#################################$i 1;$cols=2//Colums$c=$cols;
echo "<table>\n<tr>";
 while ( $rs mysql_fetch_array$res['select_split_page'] ) ) {  
  $c--;
  echo "<td width='50%' valign='top'>";
   echo "<table width='100%' border='0' cellspacing='0' cellpadding='2'> <tr>";   if($rs['ar_picture']){
       echo "<td width='10%' valign='top'><img src='datafiles/article/".$rs['ar_picture']."' align='absmiddle'  style='border:1px solid #666666;'></td>";   }
      echo "<td width='90%' valign='top'> 
   <a href='".WEB_URL."/article/".$_REQUEST['ar_type_name']."-".eregi_replace(" ","+",$rs['ar_topic'])."-".$rs['ar_id'].".html' target='_blank' >
   <strong><u>".$rs['ar_topic']."</u></strong>
   <br><font style='font-size:11px; color:#666666'>".$rs['ar_fdetail']."...</font></a>
   </td>";   echo  "</tr> ";   echo " <tr>
    <td height='10' style='border-bottom: dotted 1px #E1E1E1' colspan='2'></td>
    </tr> ";
   echo "</table>";
  echo "</td>"//
  if ($c==0) {
    echo "</tr><tr>";
    $c=$cols;
  }
}
echo "</tr>\n</table>\n";############################################
?>
<div id="wrapper-split-page">
  <?php# Call function split_pages$geturl WEB_URL."/article_list/".$_REQUEST['ar_type_name']."-".$_REQUEST['ar_type']."&tag=".$_REQUEST['tag']."";
if ($page == "all") { // Display all page : { Show All } $total_all_records number_format($rows_page','); echo "<span class=\"split-page\"><strong>Show All</strong> { {$total_all_records} items }</span>";
} else { // if page = 1, 2, 3 split_page($geturl$rows_page$totalpage$startpage$endpage$page); // call function split_pages()}?>
  </div>

ลอง เอาไปศึกษาประยุกต์ใช้ดูนะครับ ถ้าจะให้ดีควรแยกโค๊ด Function และ stylesheets ออกมาเป็นไฟล์ แล้วค่อย Include มาใช้จะทำให้โค๊ดดูง่ายขึ้นครับ

 
Design by sutoday | Bloggerized by storesu - suvachai | laikeng