วิธีสร้างเพจเอาท์พุตใน php.ini เพจเอาท์พุตจาก MySQL

/* 09.07.2008 */

เอาต์พุตเพจ (PHP และ MySQL)

บ่อยครั้งที่มีความจำเป็นต้องแสดงข้อมูลประเภทเดียวกันจำนวนมากบนเว็บไซต์และเพื่อความสะดวกในการรับรู้ควรแบ่งออกเป็นส่วนต่างๆ เช่น ใช้การดูข้อมูลนี้ทีละหน้า การตัดสินใจครั้งนี้ใช้แล้ว เครื่องมือค้นหาเมื่อแสดงผลการค้นหา กระดานสนทนา กระดานข้อความ ฯลฯ บทความนี้จะอธิบายวิธีการใช้เพจเอาท์พุตโดยใช้ MySQL และ PHP

ประการแรกฉันทราบว่าบทความนี้ไม่ได้สอนวิธีการทำงานกับฐานข้อมูลและ PHP แต่ให้คำอธิบายของการนำไปใช้งานและให้คำอธิบายที่พร้อมใช้งาน (การนำทางหน้า)

เริ่มกันเลย! สมมติว่ามีฐานข้อมูล (MySQL) พร้อมโฆษณา เป็นต้น เราจำเป็นต้องใช้การแสดงผลบนเว็บไซต์ โดยแบ่งเป็น 20 ชิ้นต่อหน้า หากต้องการย้ายไปมาระหว่างส่วนต่างๆ ที่ด้านล่างของแต่ละหน้าคุณจะต้องสร้างลิงก์ที่มีหมายเลข "ส่วน" (ป้ายกำกับหน้า):

ไปกันเลย...

การดึงข้อมูลเป็นชิ้นๆ

หากต้องการเลือกโฆษณาทั้งหมดจากฐานข้อมูล คุณต้องมีข้อความค้นหาดังนี้

เลือก * จากตารางที่ 1

แน่นอนว่านี่เป็นเวอร์ชันที่เรียบง่ายและในงานจริงส่วนใหญ่มักจะมีคำขออยู่ เงื่อนไขต่างๆ (ข้อไหน, เรียงตาม ...)

เพื่อให้แบบสอบถามนี้ทำการเลือกในส่วนต่างๆ คุณจะต้องเพิ่มตัวดำเนินการลงไป จำกัด:

ไวยากรณ์คำสั่ง LIMIT: LIMIT row_count

พารามิเตอร์ทางเลือก ชดเชยบอกคุณว่าคุณต้องข้ามกี่แถวจากจุดเริ่มต้นของตัวอย่าง และ row_countระบุจำนวนแถวที่ต้องเลือก เช่น จำกัด 0, 20 (หรือเพียงจำกัด 20 ละเว้นศูนย์ ชดเชย) เลือก 20 แถวแรก (แถว 0 ถึง 19) และ LIMIT 40, 20 ระบุให้ข้าม 40 (แถว 0 ถึง 39) และเลือก 20 แถวถัดไป (เช่น แถว 40 ถึง 59 จะถูกเลือก)

โปรดทราบว่าแถวในกลุ่มตัวอย่างจะมีหมายเลขจากศูนย์ ไม่ใช่จากหนึ่ง

ดังนั้น ข้อความค้นหาสำหรับตัวอย่างโฆษณาของเราจะเป็น:

#สอบถามเพื่อเลือกหน้า 1: เลือก * จากตาราง 1 จำกัด 0, 20 #แบบสอบถามเพื่อเลือกหน้า 2: SELECT * จาก table1 จำกัด 20, 20 #แบบสอบถามเพื่อเลือกหน้า 3: SELECT * จาก table1 จำกัด 40, 20

ฯลฯ ชดเชยเพิ่มขึ้นอันละ 20 หน้าถัดไป, ก row_countเท่ากับ 20 เสมอ

ควรสังเกตด้วยว่าตัวดำเนินการ LIMIT ในแบบสอบถามมาตามลำดับหลังจาก WHERE , GROUP BY , HAVING , ORDER BY แต่ถ้าคุณยังใหม่กับ MySQL คุณสามารถพูดได้ว่ามันมาท้ายบรรทัดแบบสอบถาม (ตามด้วย โอเปอเรเตอร์ที่ค่อนข้างไม่ค่อยได้ใช้)

ส่วนที่สองที่เราต้องจัดการคือบรรทัดที่มีป้ายกำกับหน้า...

ทางลัดหน้า

ตัวอย่างเช่น สำหรับตัวอย่างโฆษณายี่สิบรายการที่สาม ป้ายกำกับอาจมี มุมมองถัดไป:

หน้า 3

เมื่อคุณคลิกที่ลิงค์นี้สคริปต์ obyavleniya.php จะเปิดตัวซึ่งสามารถเข้าถึงพารามิเตอร์ page_number ซึ่งระบุว่ามีการขอโฆษณา 3 ยี่สิบรายการ - หน้า 3 สคริปต์จะข้ามโฆษณา 40 รายการแรก และเลือก 20 รายการถัดไป

หากต้องการแสดงป้ายกำกับแถวนี้ คุณจำเป็นต้องทราบจำนวนหน้าทั้งหมด (เพื่อทราบจำนวนป้ายกำกับที่จะ "วาด") เราหาได้โดยการหารจำนวนโฆษณาทั้งหมดด้วยจำนวนโฆษณาบนหน้าเว็บ โดยปัดเศษผลลัพธ์ให้เป็นจำนวนเต็มที่สูงขึ้น นั่นคือ หากในตัวอย่างของเรา สมมติว่ามีโฆษณาเพียง 107 รายการและเราแสดงโฆษณา 20 รายการในแต่ละหน้า จำนวนหน้าจะเป็น: 107 / 20 = 5.35 กล่าวคือ 5 เต็มหน้า(โฆษณาละ 20 รายการ) + โฆษณาที่ไม่สมบูรณ์ 1 รายการ (โฆษณา 7 รายการ) รวมทั้งหมดปัดเศษขึ้นได้ 6 หน้า (ดังนั้นจะมี 6 ป้ายกำกับ)

การนับจำนวนโฆษณาทั้งหมดมีสองวิธี วิธีแรกคือการเรียกใช้คิวรีสรุปแยกต่างหากซึ่งเกือบจะคล้ายกับคิวรีสำหรับการเลือกข้อมูล โดยไม่มีการจำกัดตัวดำเนินการ LIMIT และการดำเนินการเรียงลำดับที่ไม่จำเป็น (ORDER BY) ตัวอย่างเช่น:

#แบบสอบถามการเลือกโฆษณา 3 หน้า SELECT * จาก table1 โดยที่ category_id="89" และ ... เรียงลำดับตาม publish_date DESC จำกัด 40, 20 #query เพื่อนับโฆษณาทั้งหมดในฐานข้อมูล เลือก COUNT(*) จาก table1 โดยที่ category_id="89" และ ...

ข้อความค้นหาแรกจะเลือกโฆษณา และข้อความค้นหาที่สองจะคำนวณจำนวนทั้งหมดโดยใช้ฟังก์ชัน COUNT ในทางปฏิบัติ การสืบค้นข้อมูลอาจค่อนข้างยุ่งยากและหนักหน่วง ดังนั้นการสืบค้นที่หนักหน่วงเพิ่มเติมสำหรับการนับจึงไม่ใช่การดำเนินการที่ "จำเป็น" ที่สุด อีกทั้งเส้นทางนี้ไม่หรูหราเท่าเส้นทางที่สอง...

MySQL 4.0.0 นำเสนอสิ่งดีๆ มากมาย เช่น ฟังก์ชัน FOUND_ROWSและเกี่ยวข้องกับมัน SQL_CALC_FOUND_ROWS- ตัวเลือกของคำสั่ง SELECT

พิจารณาตัวเลือกที่สองในการคำนวณจำนวนแถวทั้งหมด:

เลือก SQL_CALC_FOUND_ROWS* จาก table1 โดยที่ category_id="89" และ ... เรียงลำดับตาม publish_date DESC LIMIT 40, 20 SELECT FOUND_ROWS()

ขอย้ำอีกครั้งว่าคำขอแรกจะทำการเลือกโฆษณา และคำขอที่สองจะได้รับจำนวนทั้งหมด แต่...

ขอเลือกโฆษณาใน ในกรณีนี้แตกต่างจากการเลือกจากตัวเลือกแรกเฉพาะเมื่อมีตัวเลือก SQL_CALC_FOUND_ROWS เท่านั้น ตัวเลือกนี้สั่งให้ MySQL พร้อมด้วยการเลือกข้อมูลสร้างและนับแถวทั้งหมดที่แบบสอบถามจะส่งกลับโดยไม่มีตัวดำเนินการ LIMIT เหล่านั้น. โดยพื้นฐานแล้ว คำขอนี้รวมไปถึงการซ่อนเร้น คำขอ COUNT รายการจากตัวเลือกแรก ในกรณีนี้ จำนวนเงินที่คำนวณได้จะไม่ถูกส่งกลับ แต่เซิร์ฟเวอร์จะจดจำไว้ ตอนนี้ เพื่อที่จะค้นหาหมายเลขนี้ คุณต้องดำเนินการคำขอด้วยฟังก์ชัน FOUND_ROWS (ในกรณีนี้ เซิร์ฟเวอร์จะไม่ทำการคำนวณใด ๆ แต่จะส่งคืนสิ่งที่จำได้ก่อนหน้านี้)

ตัวเลือกที่สองดูหรูหรากว่าอย่างแน่นอนและยังสามารถเพิ่มความเร็วได้อีกด้วย

นำมารวมกันทั้งหมด

ตอนนี้คุณรู้ทุกสิ่งที่คุณต้องการแล้ว และฉันสามารถให้อัลกอริทึมที่อธิบายตรรกะของสคริปต์ obyavleniya.php สำหรับการแบ่งหน้า ซึ่งจะเปิดตัวเมื่อผู้ใช้เข้าสู่หน้าโฆษณา...

  1. ก่อนอื่น เมื่อเรียกใช้สคริปต์ เราจะดูว่าผู้ใช้ร้องขอหน้าใด (ในตัวอย่างของเรา ซึ่งระบุด้วยพารามิเตอร์ page_number)
  2. ขึ้นอยู่กับจำนวนของหน้าที่ร้องขอ เราจะคำนวณพารามิเตอร์ออฟเซ็ตของตัวดำเนินการ LIMIT
  3. เราเรียกใช้แบบสอบถามเพื่อเลือกโฆษณาด้วยตัวดำเนินการ LIMIT offset, 20 (โดยที่ 20 คือจำนวนโฆษณาที่แสดงบนหน้าเว็บในตัวอย่างของเรา)
  4. เราได้จำนวนโฆษณาทั้งหมดในฐานข้อมูล
  5. จากจุดที่ 4 เราคำนวณจำนวนหน้าโฆษณาทั้งหมดและสร้างสตริงป้ายกำกับ

นั่นคือทั้งหมดที่ ตอนนี้ ฉันหวังว่าคุณจะสามารถเขียนสคริปต์ของคุณเอง หรือใช้ของฉัน เพื่อทำความเข้าใจแก่นแท้ของวิธีการทำงาน

คลาส PHP Paging สำหรับการเพจ

ตอนนี้ฉันจะยกตัวอย่างวิธีการจัดระเบียบ การนำทางหน้าโดยใช้คลาส PHP Paging

//เชื่อมต่อคลาสเพจจิ้งต้องการ("pageing.inc.php "); //เชื่อมต่อกับฐานข้อมูล$_DB = mysqli ใหม่($host,$user,$passwd,$db_name); //สร้างอินสแตนซ์ของคลาสเพจจิ้ง //ในฐานะพารามิเตอร์ เราจะส่งตัวชี้ไปยังการเชื่อมต่อ MySQL$_PAGING = เพจใหม่($_DB); // ดำเนินการร้องขอข้อมูลปกติโดยไม่ต้องกังวล // เกี่ยวกับการแบ่งหน้าผ่านเมธอด get_page ของอ็อบเจ็กต์คลาส Paging$r = $_PAGING->get_page("SELECT * FROM table1"); ในขณะที่($row = $r->fetch_assoc()) ( //ประมวลผลข้อมูลที่ได้รับจากฐานข้อมูลตามปกติและแสดงให้ผู้ใช้เห็น } //แสดงบรรทัดข้อมูลเช่น: "แสดงตั้งแต่ 1 ถึง 20 จาก 107" echo $_PAGING->get_result_text()." โฆษณา"; //แสดงลิงก์ทางลัดไปยังหน้าก่อนหน้าและหน้าถัดไป echo "หน้า: ".$_PAGING->get_prev_page_link()" ".$_PAGING->get_next_page_link()"

"; //ตลอดจนบรรทัดที่มีหมายเลขหน้า (ทางลัดหลัก)เสียงสะท้อน $_PAGING->get_page_links(); -

สิ่งเดียวเท่านั้น สคริปต์นี้แตกต่างจากสคริปต์ทั่วไปที่ไม่มีการแบ่งหน้าตรงที่การร้องขอตัวอย่างข้อมูลที่จำเป็นต้องแบ่งออกเป็นส่วน ๆ นั้นไม่ได้ทำผ่าน mysqli->query() แต่ทำผ่านเมธอด get_page() ที่นำมาใช้ในคลาส Paging เช่นเดียวกับ สาม บรรทัดสุดท้ายซึ่งแสดงป้ายกำกับและบรรทัดรายงานการเลือก

ป.ล

ป.ล. :ฉันนำเสนอคำลงท้ายนี้เพื่อความสมบูรณ์ของการนำเสนอมากกว่าความเป็นจริง ข้อมูลที่ทันสมัยสำหรับผู้อ่านส่วนใหญ่

การใช้ SQL_CALC_FOUND_ROWS และ FOUND_ROWS() มีข้อผิดพลาดบางประการเมื่อใช้ในการสืบค้น UNION เนื่องจากคำสั่ง LIMIT สามารถใช้ได้ในหลายที่ และอาจส่งผลต่อทั้งคำสั่ง SELECT แต่ละรายการภายใน UNION และ ผลลัพธ์โดยรวมยูเนี่ยนโดยทั่วไป วัตถุประสงค์ของ SQL_CALC_FOUND_ROWS สำหรับ UNION คือการนับจำนวนแถวที่จะถูกส่งกลับโดยไม่มี LIMIT ทั่วโลก ดังนั้น เงื่อนไขสำหรับการใช้ SQL_CALC_FOUND_ROWS กับแบบสอบถาม UNION ควรได้รับ:

  • คีย์เวิร์ด SQL_CALC_FOUND_ROWS ต้องปรากฏในคีย์เวิร์ดแรก คำสั่งเลือก ;
  • ค่าของ FOUND_ROWS() จะมีความแม่นยำก็ต่อเมื่อใช้ UNION ALL หากระบุ UNION โดยไม่มี ALL จะมีการตัดออกที่ซ้ำกัน และค่าของ FOUND_ROWS() จะเป็นค่าโดยประมาณเท่านั้น
  • หากไม่มี LIMIT ใน UNION ดังนั้น SQL_CALC_FOUND_ROWS จะถูกละเว้น และจำนวนแถวในตารางชั่วคราวที่สร้างขึ้นเพื่อดำเนินการ UNION จะถูกส่งคืน

คำถามเดียวกันนี้มักถูกถามในฟอรัม: วิธีสรุปทีละหน้า และทุกครั้งที่มีคนตอบ: "ง่าย ๆ ! เลือกคำขอจำกัด $n,$m" ในความเป็นจริงทุกอย่างไม่ได้ง่ายอย่างนั้น

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


  • ประมวลผลหมายเลขหน้า (รวมถึงการตรวจสอบว่ามากกว่าจำนวนหน้าทั้งหมดหรือไม่)
  • วาดแถบนำทาง (ไม่ใช่แค่ "ไปมา" แต่มีลิงก์ไปยังหน้าที่ติดกันหลายหน้า)

นี่คือจุดเริ่มต้นของปัญหาหลัก

ฉันเพิ่งทำงานในไซต์ที่มีสถิติแบบหน้าต่อหน้าในทุกรายการ (และมีรายการจำนวนมาก!) ตอนนั้นเองที่วิธีแก้ปัญหามาถึงวิธีลดสิ่งเหล่านี้ให้เหลือง่ายและ การตัดสินใจเพียงครั้งเดียว- ผลลัพธ์ที่ได้คือสี่ฟังก์ชันที่ฉันใช้ในตอนนี้ในทุกที่ที่ต้องการเอาต์พุตข้อมูลแบบหน้าต่อหน้า และฉันไม่เสียเวลากังวลเกี่ยวกับปัญหา (ฉันจะทำอย่างไรที่นั่น ฉันจะนำโค้ดนี้ออกจากที่นั่นได้อย่างไร ).

ฟังก์ชั่นแรกคือสำหรับ การใช้งานภายในสองถัดไป นำหมายเลขหน้า จำนวนบรรทัดทั้งหมด และจำนวนบรรทัดต่อหน้า แล้วส่งคืนหมายเลขหน้าที่ได้รับการตรวจสอบแล้ว ประการที่สองใช้สิ่งเดียวกัน ตรวจสอบหมายเลขหน้า และกำหนด LIMIT หรือพารามิเตอร์เต็ม ( จำกัด n,m) หรือแบบสั้น (LIMIT m) หากเป็นหน้าแรกหรือไม่ได้สร้างอะไรเลย ฟังก์ชันที่สามจากพารามิเตอร์สามตัวเดียวกันและที่อยู่ของลิงก์จะสร้างแถบนำทาง ฟังก์ชันอื่นส่งคืนตัวเลขสำหรับรายการลำดับเลข

แค่นี้ก็เพียงพอแล้วสำหรับ การทำงานปกติกับ เอาต์พุตทีละหน้าข้อมูล. มาดูกันว่าเกิดอะไรขึ้นในรหัสโปรแกรม:


// จำนวนบรรทัดในหน้า

$in_page = 10 ;

// รับจำนวนบรรทัด

$amount = @mysql_result(mysql_query( "SELECT นับ (id) เป็นสินค้า_รวมจากสินค้า"), 0 );

// วาดเส้นนำทางและเขียนจุดเริ่มต้นของตาราง

พิมพ์("

" . < b >Draw_bar ($หน้า, $จำนวน, $in_page,

"goods.php?page=" ). "

\n " );

// สร้างคำขอไปยังฐานข้อมูล

$goods_result = mysql_query ( "เลือกรหัส ชื่อ คำอธิบาย ราคา จากสินค้า

เรียงตามชื่อ ราคา " .< b >get_limit ($เพจ , $amount , $in_page ));

// รับหมายเลขสำหรับรายการลำดับเลข

$นับ=< b >get_count_limit ($หน้า, $จำนวน, $in_page);

//พิมพ์เส้น

ในขณะที่ ($good_row = mysql_fetch_array ($goods_result)) (

$นับ++;

พิมพ์("

// พื้นหลังของทุกบรรทัดที่สองเป็นสีเทา

ถ้า ($count / 2 == intval ($count / 2 ))

พิมพ์(" bgcolor=#e1e1e1" );

พิมพ์ ( ">

\n" );

// ท้ายตารางและบรรทัดนำทางด้านล่าง

พิมพ์("

$นับ$(ดี_แถว)


$(ดี_แถว)

$(ดี_แถว)
" . < b >Draw_bar ($หน้า, $จำนวน,

$in_page , "goods.php?page=" ). "

\n" );

นั่นคือทั้งหมดที่คุณต้องการสำหรับเอาต์พุตเพจ! ไม่ต้องเครียดอีกต่อไป!

คำอธิบายเดียวเท่านั้น - ที่อยู่ของสคริปต์นี้พร้อมพารามิเตอร์ทั้งหมดถูกระบุเป็นพารามิเตอร์ของฟังก์ชัน Draw_bar เพื่อให้เพิ่มเฉพาะหมายเลขหน้าที่นั่นเท่านั้น หากตัวอย่างมีความซับซ้อนคุณจะต้องสร้างที่อยู่นี้ด้วยตนเอง (ท้ายที่สุดแล้วการทำให้ชีวิตง่ายขึ้นกลายเป็นญาติ: เราทำให้สิ่งหนึ่งง่ายขึ้นและทำให้อีกสิ่งหนึ่งซับซ้อน)

แถบนำทางทำในรูปแบบของหมายเลขหน้า ("1 | 2 | 3") แต่มาในรูปแบบ 0-10 | 11-20 | 21-30” ไม่ใช่ปัญหา

ตีหนึ่งครึ่งของคืน นอนไม่หลับมาหลายวัน... และทันใดนั้นฉันก็เข้าใจ - ในที่สุดฉันก็เข้าใจแล้วว่าสคริปต์ที่สุดยอดแบบไหนที่ฉันต้องใช้ในการโปรโมตเว็บไซต์ใหม่ของฉัน ไม่ช้ากว่าจะพูดเสร็จ ฉันก็นั่งลง... ไม่ อย่าเขียนสคริปต์แบบ super-duper นี้เลย :) โปรแกรมเมอร์เป็นคนเกียจคร้าน ผู้เชี่ยวชาญด้านการส่งเสริมการขาย ยิ่งกว่านั้นอีก (ด้วยเหตุนี้เครือข่ายแลกเปลี่ยนแบนเนอร์ นายทะเบียนรถยนต์ในแค็ตตาล็อก และเรื่องขี้เกียจอื่นๆ ). โดยทั่วไปฉันไปที่ Google และเริ่มค้นหา Runet อย่างเป็นระบบเพื่อค้นหาสิ่งที่ฉันต้องการ หนึ่งหรือสองชั่วโมงผ่านไป... ความสงสัยที่คลุมเครือคืบคลานเข้ามาในจิตวิญญาณของฉัน ค่อยๆ พัฒนาไปสู่ความมั่นใจว่าสคริปต์ที่ฉันต้องการไม่มีอยู่ในธรรมชาติ หรือถูกซ่อนอยู่ในโลคัลโฮสต์ที่สงวนไว้ของใครบางคนที่มีสิทธิ์การเข้าถึง 000

ฉันแบ่งงานที่ต้องเผชิญกับสคริปต์ออกเป็นองค์ประกอบต่างๆ และในเวลาประมาณ 15 นาที ฉันจะเขียนการใช้งานฟังก์ชัน (ของสคริปต์) ส่วนใหญ่ :) ฉันยินดีรับคุณลักษณะถัดไป... โดยทั่วไป คุณเพียงแค่ต้องระบุทีละหน้า - เอาท์พุทหน้าของเนื้อหา ตัวอย่างเช่นมี 60 บทความและคุณต้องแสดงบทความเหล่านี้ 10 บทความต่อหน้าและสร้างเมนูสำหรับผลลัพธ์นี้ในรูปแบบ "1 2 3 ...

ตอนนี้เป็นเวลาสี่โมงเช้าแล้ว และไม่มีอะไรจะนึกถึงได้นอกจาก "ขีดจำกัด" อันล้ำค่า และไม่ใช่ว่าฐานข้อมูลไม่เกี่ยวข้องกับสคริปต์ของฉันเลย ฉันตระหนักด้วยความขมขื่นว่าคุณสมบัติของฉันหายไป ปีที่ดีที่สุดในชีวิตของฉันสูญเปล่า และ... ฉันไปที่ Google ;)
หลังจาก... โดยทั่วไปรุ่งเช้าก็มาถึงแล้ว มาถึงตอนนี้ ฉันคุ้นเคยกับวรรณกรรมมากมายเกี่ยวกับปัญหานี้ แต่ทุกที่ที่มีการพิจารณาสถานการณ์ไม่ทางใดก็ทางหนึ่งในบริบทของการทำงานกับ SQL หรือฉันพบบทความที่ลึกซึ้งบางบทความที่ทำซ้ำกันอย่างแพร่หลายเกี่ยวกับ "การแยก อัลกอริธึมการเพจจากบริบทหรืออะไรบางอย่าง - แบบนั้น " (IMHO โค้ด 7 บรรทัดต่อไปนี้ช่วยแก้ปัญหานี้) ซึ่งฉันไม่เข้าใจสิ่งเดียว ... :(และนั่นคือตอนที่ฉันหมดหวังแล้วและตัดสินใจว่า เช้าฉลาดกว่าตอนเย็น ในฟอรั่มที่หนาแน่นและมีตะไคร่น้ำ (ที่อยู่น่าเสียดายที่จมลงสู่การลืมเลือน - อย่างน้อยฉันก็ไม่มี) ฉันบังเอิญเจอจดหมายโต้ตอบระหว่างโปรแกรมเมอร์ผู้ขอโทษชั่วนิรันดร์กับโปรแกรมเมอร์ผู้บ้าคลั่งและ ผู้ดำเนินรายการชั่วร้าย - หัวข้อการติดต่อมีวัตถุประสงค์เพื่อสร้างเมนูสำหรับแสดงทีละหน้าโดยเฉพาะ และนี่คือสิ่งที่จำเป็นจริงๆ!

โดยทั่วไปด้านล่างในข้อความที่ฉันแก้ไขความอยุติธรรม: ขณะนี้มีบทความบนอินเทอร์เน็ตเกี่ยวกับวิธีตรวจสอบการสร้างเมนูสำหรับการแบ่งหน้า! รหัสการทำงานอย่างง่ายใน PHP พร้อมความคิดเห็นโดยละเอียด ไม่มีฟังก์ชันที่ไม่จำเป็นเช่นลิงก์ "หน้าถัดไป" สิ่งนี้ทำโดยตั้งใจ - ในชีวิตฉันไม่เคยคลิก "ถัดไป" เลยถ้าฉันสามารถคลิกหมายเลขหน้าได้ - และบทความนี้เขียนขึ้นเพื่อให้เข้าใจหลักการพื้นฐานได้เช่น ยิ่งโค้ดน้อยก็ยิ่งดี (แม้ว่าปุ่ม "ถัดไป" จะถูกเพิ่มในโค้ดสามบรรทัดก็ตาม)

แบบแผนความคิดเห็นของโค้ด:

  • “บทความ” คือบล็อกข้อมูลจำนวนหนึ่ง (ไม่จำเป็นต้องเป็นข้อความ) ซึ่งแสดงหลายส่วนต่อหน้า (อาจเป็นบทความ ข่าวสาร รูปภาพ ฯลฯ)
  • "เพจ" คือเพจ :) ซึ่งมี "บทความ" จำนวนหนึ่งอยู่

บนหน้าจอเบราว์เซอร์ เราได้ข้อความประมาณว่า "1 2 3 4 5 6 7 8" และ URL (บนคอมพิวเตอร์ของฉัน โดยเลือก "เพจ" ที่สามไว้) มีลักษณะดังนี้: http://localhost/ep/ep.php?from=20- โปรดทราบว่าหมายเลขหน้า "3" สอดคล้องกับค่า จาก=20นั่นคือการนับสิ่งของที่แสดงในกรณีนี้จะดำเนินการตั้งแต่วันที่ 20

โดยทั่วไป ตามที่คุณเข้าใจแล้ว ตัวแปร $from มีบทบาทสำคัญที่นี่ มันเกี่ยวข้องกับการสร้างลิงค์ไปยังแต่ละหน้า (ถ้าแน่นอน คุณสามารถใส่มันแบบนั้นได้ :) และที่สำคัญที่สุด มันทำให้เราเป็นจุดเริ่มต้นในการแสดงบทความ

ตัวอย่างเช่น (และคุณอาจจะทำเช่นนี้) สามารถวางตัวชี้ไปยังบทความ (หรือตัวบทความเอง) ในอาร์เรย์ ตามด้วยการเลือกและส่งออกไปยังเบราว์เซอร์ของบทความ 10 บทความ โดยเริ่มจากค่า $from

กล่าวคืออีกครั้งหนึ่ง กล่าวอีกนัยหนึ่ง: สวนทั้งหมดถูกสร้างขึ้นจริง ๆ เพื่อให้ข้อมูลสคริปต์ว่า "หน้า" ที่ผู้เยี่ยมชมอยู่ในขณะนี้และเริ่มจากหมายเลข "บทความ" ใดตามจำนวนที่ระบุของบทความเหล่านี้ที่ควรจะแสดง บนเพจ - และนี่คือค่าของตัวแปร $from เหล่านั้น. ด้วย $from=20 ​​​​หน้าจาก 21 ถึง 30 จะปรากฏขึ้น (ซึ่งขึ้นอยู่กับการใช้งานเอาต์พุตและค่าของตัวแปร $articles_per_page)

ก่อนอื่นมีทฤษฎีเล็กน้อย จะต้องทำอะไร? ขั้นแรก คุณต้องตรวจสอบว่าได้เลือกหน้าดูหรือไม่ จากนั้นคุณจะต้องคำนวณว่าจะส่งออกบันทึกจากที่ใด ทำได้ง่ายมาก: เราคูณหน้าปัจจุบันด้วยจำนวนบันทึกต่อหน้า สุดท้าย คุณต้องสร้างแบบสอบถาม SQL ไปยังฐานข้อมูลและส่งออกผลลัพธ์ และสุดท้ายก็เขียนการนำทาง

มาเริ่มกันเลย เรียกใช้แบบสอบถาม SQL:

สร้างตาราง tbl_books (book_id int (11) ไม่เป็น NULL auto_increation, book_name varchar (50) ไม่เป็น NULL ค่าเริ่มต้น "", book_cash float ไม่เป็น NULL ค่าเริ่มต้น "0", คีย์หลัก (book_id)) TYPE=MyISAM; แทรกลงในค่า tbl_books (1, "หนังสือหมายเลข 1", "2"); แทรกลงในค่า tbl_books (2, "หนังสือหมายเลข 2", "3"); แทรกลงในค่า tbl_books (3, "หนังสือหมายเลข 3", "4"); แทรกลงในค่า tbl_books (4, "หนังสือหมายเลข 4", "5"); แทรกลงในค่า tbl_books (5, "หนังสือหมายเลข 5", "6"); แทรกลงในค่า tbl_books (6, "หนังสือหมายเลข 6", "7"); แทรกลงในค่า tbl_books (7, "หนังสือหมายเลข 7", "8"); แทรกลงในค่า tbl_books (8, "หนังสือหมายเลข 8", "9"); แทรกลงในค่า tbl_books (9, "หนังสือหมายเลข 9", "10"); แทรกลงในค่า tbl_books (10, "หนังสือหมายเลข 10", "11"); แทรกลงในค่า tbl_books (11, "หนังสือหมายเลข 11", "12"); แทรกลงในค่า tbl_books (12, "หนังสือหมายเลข 12", "13"); แทรกลงในค่า tbl_books (13, "หนังสือหมายเลข 13", "14"); แทรกลงในค่า tbl_books (14, "หนังสือหมายเลข 14", "15"); แทรกลงในค่า tbl_books (15, "หนังสือหมายเลข 15", "16");

ฉันเสนอให้ออกแบบทุกอย่างเป็นฟังก์ชันตัวจัดการ มาสร้างฟังก์ชั่น page() ที่ประมวลผลข้อมูลเกี่ยวกับหมายเลขหน้าที่ร้องขอ:

เธอกำลังทำอะไรอยู่? ตรวจสอบว่าเพจถูกเลือกหรือไม่ และหากมีตัวอักษร จะแสดงข้อความแสดงข้อผิดพลาด ต่อไป เรามาสร้างแบบสอบถาม SQL:

function sql_query($onpage, $page, $table) ( $begin = $page*$onpage; // ตำแหน่งที่จะเริ่มต้น $sql = "SELECT * FROM ".$table." LIMIT ".$begin.", ". $ onpage; $result = mysql_query($sql) หรือ die(mysql_error());

ฟังก์ชั่นการนำทาง:

ฟังก์ชั่นการนำทาง($onpage, $page, $table) ( $return = null; $count = mysql_query("SELECT COUNT(*) FROM tbl_books") or die(mysql_error()); $count = mysql_fetch_array($count); $count = $count; $pages = $count/$onpage; if($page!==0)( $prev = "<"; } else { $prev = "<"; } if($page

ครบทุกฟังก์ชั่น! วิธีการใช้งาน?

$บนเพจ = 4; // รายการต่อหน้า $table = "tbl_books"; // จากตารางใด mysql_connect("localhost", "root", "pass") หรือ die(mysql_error()); // การเชื่อมต่อกับฐานข้อมูล mysql_select_db("test"); // การเลือกฐานข้อมูล $page = page(); // กำหนดหน้า $result = sql_query($onpage, $page, $table); // sql - แบบสอบถาม while($data = mysql_fetch_array($result)) // ลูปเอาต์พุต ( // จำเป็นต้องเปลี่ยนเทมเพลตเอาต์พุต // $data["field_name"] - เนื้อหาฟิลด์ echo $data["book_id"] ” ".$data["book_name"]"
; echo $data["book_cash"]"$

"; ) $navigation = navigation($onpage, $page, $table); // กำหนดการนำทาง echo $navigation; // แสดงมัน mysql_close(); // ตัดการเชื่อมต่อจากฐานข้อมูล?>

ดีไม่ดี

    การแบ่งหน้าคืออะไร? ตัวอย่างที่ง่ายที่สุดคือเครื่องมือค้นหา คุณให้คำสั่งค้นหาเพื่อตอบสนองเซิร์ฟเวอร์ที่ส่งคืนลิงก์นับพัน (และข้อมูลอื่น ๆ...