พบกับบทความเกี่ยวกับคอมพิวเตอร์และ programming ได้ที่ http://articles.modoeye.com
PHP development / อยากได้โค้ดแบ่งหน้าครับ รายละเอียดข้างใน อิ ๆ ฟอร์มเดิม
โอ๋
โอ๋
Mon 20 Feb 2006 09:18:10

โค้ดข้างล่างเป็นโค้ดที่ดึงข้อมูลมาจากดาต้าเบสครับ คือดึงแบบเพียว ๆ แบบนี้แหละ แต่มันจะโชว์ข้อมูลมาตรึมเลยอ่ะครับ

<?
$sql_link = mysql_pconnect ("","","");
mysql_select_db("");

$row1 = mysql_query("SELECT a.* , m.displayname FROM activity_01pangya a , mem_account m WHERE m.no = a.mem_no ORDER BY mem_no ASC");
while ($r = mysql_fetch_array($row1)){
 echo "[$r[mem_no]] : $r[displayname] >> $r[mem_serial]<br>";  // โชว์  id ,ชื่อสมาชิก, โค้ด
}
?>

ผมเลยอยากได้โค้ดแบ่งหน้าอะครับ รบกวนด้วยครับ คืองานต้องส่งแล้ว

แล้วก็ขอโค้ดนับจำนวนคนที่ได้ serial ทั้งหมดอะครับ แบบว่าไม่รู้จะเอาโค้ดยังไงมาใส่อ่ะ

Administrator
Mon 20 Feb 2006 10:23:00
การแบ่งหน้าก็เพียงเอาข้อมูลที่ query ได้จากฟังก์ชั่น mysql_query ซึ่งได้เป็น Result resource ใส่ฟังก์ชั่น mysql_num_rows() จะได้เป็นจำนวนของ Records ที่มีผลจากคำสั่ง SELECT ครับ จากนั้นก็นำไปหารด้วยจำนวนที่ต้องการแสดงผลต่อหนึ่งหน้า ก็จำได้จำนวนหน้าพร้อมเศษทศนิยมซึ่งต้องปัดขึ้น ก็เอาเลขที่หารได้นั้นใส่ฟังก์ชั่น ceil() จะได้ประมาณนี้ครับ

$pages = ceil((mysql_num_rows($res)/20);

จากนั้นก็วน loop for ทำการ print ตัวเลขตั้งแต่ 1-จำนวน $pages แล้วก็ใส่ลิงค์ของแต่ละหน้า

ส่วนการ SELECT ในหน้าต่อๆไปก็ใช้ keyword LIMIT ช่วยในการ query ครับ

ส่วนการจะหาค่า field member ที่มี serial นั้นต้องดูก่อนว่า field serial นั้นถ้าไม่มีค่าจะเป็นค่าใด NULL หรือ EmptyString ซึ่งนำค่านั้นมาใส่ใน WHERE CLAUSE ครับ
โอ๋
โอ๋
Mon 20 Feb 2006 11:01:08

อู้ อึ้งเลยครับ ขอแบบเต็ม ๆ ได้ป่ะ ผมมันอ่อนหัดเรื่องสคริ๊ปมาก ๆ เลยครับ ถ้าตัวอย่างไม่มีอผมก็แย่เลยครับ

Administrator
Mon 20 Feb 2006 11:30:30

<?

$num_records = 20; //Amount of records per page

$sql_link = mysql_pconnect ("","","");
mysql_select_db("");

$records = mysql_num_rows(mysql_query("SELECT a.* , m.displayname FROM activity_01pangya a , mem_account m WHERE m.no = a.mem_no")); // Get amount of records

$result = mysql_query("SELECT a.* , m.displayname FROM activity_01pangya a , mem_account m WHERE m.no = a.mem_no ORDER BY m.mem_no ASC LIMIT ".(isset($_GET["start"])?$_GET["start"]:0).",".$num_records); //SELECT specified records

while ($r = mysql_fetch_array($result, MYSQL_ASSOC)){
 echo "[$r[mem_no]] : $r[displayname] >> $r[mem_serial]<br>";  // โชว์  id ,ชื่อสมาชิก, โค้ด
}

$pages = ceil($records/$num_records);
for($i = 0; $i < $pages; $i++){
    echo "<a href=\"".$_SERVER["PHP_SELF"]."?start=".($i*$num_records)."\">".($i+1)."</a>";
}
?>

อธิบาย

$num_records = เป็นตัวแปรจำนวน records ต่อหน้า

$records = mysql_num_rows(mysql_query("SELECT a.* , m.displayname FROM activity_01pangya a , mem_account m WHERE m.no = a.mem_no")); เป็นการ SELECT ข้อมูลทั้งหมดที่มีผลต่อ Query นี้เพื่อนับจำนวนทั้งหมดเก็บไว้ในตัวแปร $records

$result = mysql_query("SELECT a.* , m.displayname FROM activity_01pangya a , mem_account m WHERE m.no = a.mem_no ORDER BY m.mem_no ASC LIMIT ".(isset($_GET["start"])?$_GET["start"]:0).",".$num_records); เป็นการ SELECT record ที่มีผลตามที่ระบุ โดยตรวจสอบว่ามีการส่งตัวแปร start มาใน querystring หรือไม่ ถ้ามีก็ให้เริ่มนำ record ตั้งแต่ที่ระบุเป็นจำนวน $num_records ( LIMIT <recodr เริ่มต้น>, <จำนวน record>Wink

$pages = ceil($records/$num_records); หาจำนวนหน้าทั้งหมด

for($i = 0; $i < $pages; $i++){
    echo "<a href=\"".$_SERVER["PHP_SELF"]."?start=".($i*$num_records)."\">".($i+1)."</a>";
} ทำลิงค์เพื่อไปยังหน้าต่างๆ โดยส่งตัวแปร start ไปใน querystring
โอ๋
โอ๋
Mon 20 Feb 2006 12:24:12

มัน error แบบนี้ครับ

//
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /www/xxx/xxx/xxx/xxx/list.php on line 24
123456789101112131415

บันทัดที่ 24 คือ 
while ($r = mysql_fetch_array($result, MYSQL_ASSOC)){

บันทัดที่ 25 
echo "[$r[mem_no]] : $r[displayname] >> $r[mem_serial]<br>";  // âªÇì  id ,ª×èÍÊÁÒªÔ¡, â¤é´
}

Administrator
Mon 20 Feb 2006 12:28:27
$result = mysql_query("SELECT a.* , m.displayname FROM activity_01pangya a , mem_account m WHERE m.no = a.mem_no ORDER BY mem_no ASC LIMIT ".(isset($_GET["start"])?$_GET["start"]:0).",".$num_records);
โอ๋
โอ๋
Mon 20 Feb 2006 12:47:02

ได้แล้วครับ ขอบคุณอีกครั้งครับผม

โอ๋
โอ๋
Mon 20 Feb 2006 13:14:55

แล้วถ้าจะเขียนโค้ดให้นับจำนวนทั้งหมด ทำไงบ้างครับ

Administrator
Mon 20 Feb 2006 14:35:22
เข้าใจว่าถามถึงการ นับจำนวน record ทั้งหมด คุณอาจจะใช้ COUNT ของ SQL ก็ได้ครับ หรือจะใช้ mysql_num_rows() ของ PHP ก็ได้ครับ
โอ๋
โอ๋
Wed 22 Feb 2006 11:22:43

ได้แล้วครับ พอดีผมทำเป็นแบบโชว์หน้าละ 50 มันก็เลยดึงมาโชว์แค่ 50  นะครับ ทำยังไงถึงจะได้โชว์ทั้งหมดเลยครับ

Administrator
Wed 22 Feb 2006 12:03:54
ในคำสั่ง Quqery เพียงไม่ต้องใส่ LIMI เท่านั้นครับ
เด็กมีปัญหา
เด็กมีปัญหา
Fri 8 Sep 2006 22:12:04

ใช้ SQL Server เป็นฐานข้อมูล มันไม่มีคำสั่ง limit แล้วจะทำยังไงดีล่ะ แถมยังติดต่อฐานข้อมูลด้วย ODBC อีกลองประยุกต์ใช้แล้วไม่ได้ผลเลย แต่ code นี้ผมว่าเข้าใจง่ายดีนะแต่ใช้กับงานของผมไม่ได้ รบกวนคุณ Admin ด้วยครับ

Administrator
Fri 8 Sep 2006 23:11:55
ถ้าใน SQL Server ใช้คำสั่ง TOP() แทนครับเช่น SELECT TOP(50) field_name FROM ....
เด็กมีปัญหา
เด็กมีปัญหา
Fri 8 Sep 2006 23:58:26

while ($r = mysql_fetch_array($result, MYSQL_ASSOC)){
 echo "[$r[mem_no]] : $r[displayname] >> $r[mem_serial]<br>";  // โชว์  id ,ชื่อสมาชิก, โค้ด
}
แล้วถ้าแปลงให้เป็นการติดต่อแบบ odbc ล่ะครับใช่แบบนี้หรือเปล่า

$num_records = 20;
      $sql= "SELECT * FROM Hardware ORDER BY Name ASC";
      $records = odbc_num_rows(odbc_exec($conn,$sql));
      *** $result = odbc_exec($conn, ("SELECT TOP $num_records * FROM Hardware ORDER BY Name ASC ".(isset($_GET["start"])?$_GET["start"]:0).",".$num_records));
      while ($r = odbc_fetch_row($result)){
       echo odbc_result($result,"Name");
       echo "<a href=$PHP_SELF?no=" .odbc_result($result,"No"). ">" .odbc_result($result,"Name")."</a>";
      }
      $pages = ceil($records/$num_records);
      for($i = 0; $i < $pages; $i++){
          echo "<a href=\"".$_SERVER["PHP_SELF"]."?start=".($i*$num_records)."\">".($i+1)."</a>";
      }

เหมือนว่าจะผิดพลาดครับที่ *** แต่ความรู้ยังไม่มากพอแบบว่ามือใหม่ ขอรบกวนคุณ Admin อีกรอบแล้วกัน

Administrator
Sat 9 Sep 2006 00:12:39
$result = odbc_exec($conn, ("SELECT TOP $num_records * FROM Hardware ORDER BY Name ASC ".(isset($_GET["start"])?$_GET["start"]:0).",".$num_records));

ตรงนี้เป็นโค๊ดเพื่อสร้าง parameter ให้กับ LIMIT ครับ คำสั่งที่ใช้สำหรับ SQL Server ควรจะเหลือ

$result = odbc_exec($conn, ("SELECT TOP $num_records * FROM Hardware ORDER BY Name ASC");

เท่านี้ครับ
เด็กมีปัญหา
เด็กมีปัญหา
Sat 9 Sep 2006 12:31:19

แล้วถ้าต้องการให้มันแสดงหน้าเหมือนกับการใช้ limit ล่ะครับ แบบว่าถ้าใช้ top มันจะแสดงแค่หน้าแรกเท่านั้น อย่างนี้ต้องทำอย่างไรบ้างล่ะครับผม แบบว่าขอละเอียดเลยแล้วกันครับ พยายามนั่งงมเมื่อคืนแล้วครับแต่ทำไม่ได้ -_-"

Administrator
Sat 9 Sep 2006 13:24:24
ต้องใช้ SELECT TOP ซ้อนกันครับ เช่น

"SELECT TOP 10 * FROM Hardware h WHERE h.id NOT IN (SELECT TOP 20 * FROM Hardware ORDER BY Name ASC) ORDER BY Name ASC"

โดย h.id เป็น field ที่เป็น primary key ครับ จากโค๊ดจะได้ record ตั้งแต่ record ที่ 11 - 20 ครับ
เด็กมีปัญหา
เด็กมีปัญหา
Sat 9 Sep 2006 19:31:13

จะลองทำดูนะครับ ขอบคุณครับคุณ Admin

p_narak
p_narak
Thu 7 Feb 2008 17:28:21
Admin เก่งจังค่ะ ขอบคุณที่ให้ความรู้นะคะ
splintercell_p...
splintercell_pandora
Thu 28 Feb 2008 11:27:05

แล้วการนับทีละหน้าแบบต่อเนื่องหล่ะ

เช่น หน้าแรก 1-50 แล้วหน้าที่ สอง 51-100 หล่ะ มันไม่ไป มันตัดที่ 1-50 ตลอดเลย

งง.... Please...

webmaster
webmaster
Sat 8 Mar 2008 02:45:06
ก็หาเลขหน้าคูณด้วย record ต่อ 1หน้าจะได้ค่าเริ่มต้น ค่าท้ายก็เอาจำนวน record มาบวกเท่านั้นครับ
Reply
Name:
E-mail:
Home | Services | Forum | Classified | Directories | Support | Contact
ATOM feed RSS 0.9 feed RSS 1.0 feed RSS 2.0 feed
Copyright © 2005 - 2007 Modoeye.com, All Rights Reserved.
Disclaimer | Privacy policy | Term of Use | Term of Services
Valid XHTML Valid CSS! PHP: Hypertext Preprocessor MySQL database Apache Powered! FreeBSD Power to serve
Modoeye Sitemap Client login