Urambazaji wa ukurasa katika php na mysql. Urambazaji wa Ukurasa Kwa Kutumia PHP

rafiki Aprili 5, 2013 saa 9:12 jioni

Urambazaji wa ukurasa bila kutumia COUNT na LIMIT

  • Chumba cha mbao *

Kila mtu ambaye amekutana na uumbaji urambazaji wa ukurasa kwa kutumia mchanganyiko wa mySQL + PHP, labda umegundua kuwa sampuli huanza kupungua wakati wa kutazama meza zilizo na sehemu nyingi (kutoka 100,000). Sijapata chochote kwenye mada hii kwenye mtandao; miradi ya classic kulingana na kutumia COUNT + LIMIT. Nakala hiyo imekusudiwa wale ambao tayari wanafahamu mySQL na PHP.
Ninapendekeza mbinu tofauti kidogo ambayo itafanya iwezekanavyo kutazama kurasa zilizo na karibu idadi yoyote ya uwanja, na kwa hivyo tutajaribu kutatua shida ya meza "nzito".

Badala ya COUNT tutatumia SELECT.
Jambo la kwanza la kufanya ni kuunda safu na AUTO_INCREMENT na kuiweka juu yake Ufunguo Msingi . Niliita kama mfano kitambulisho. Hii itatupa fursa ya kuzunguka COUNT na ufikie thamani ya safu moja kwa moja, kama ifuatavyo:

$msg=20; // jumbe 20 kwa kila ukurasa $page=(int)$_GET["ukurasa"]; // pata ombi ongeza kwa ukurasa wa $q=mysql_query("CHAGUA max(id) KUTOKA jedwali_name"); //tafuta thamani ya juu safu $str=mysql_result($q,0); //matokeo katika $str $total=(int)(($str - 1) / $msg) + 1; //tafuta jumla ya idadi ya kurasa za kuonyesha katika urambazaji $start=$page * $msg - $msg; //hapa tunapata kujua kutoka kwa rekodi gani tunaanza kuonyesha ujumbe $stop=$page * $msg; //hapa hasa tunachotoa

Ifuatayo, hebu tuangalie jinsi ya kutumia sampuli bila LIMIT

$q=mysql_query("CHAGUA *KUTOKA KWA mtumiaji WAPI id > $start AND id< $stop"); //вот так всё просто while ($body=mysql_fetch_array($q)) //собсно заносим результат запроса в массив echo "

"; kwa($i=0; $i< $msg; $i++) //этот цикл выводит сообщения в диапазоне id >$anza na kitambulisho< $stop { echo "";) mwangwi"
".$body[$i]["row_name"]."".$body[$i]["row_name"]."".$body[$i]["row_name"]."
";

Kweli, basi kilichobaki ni kuongeza mishale ya urambazaji, lakini nadhani utafanya hivi mwenyewe kwa sababu kuna chaguzi nyingi kwenye Mtandao. Kama unaweza kuona, hakuna chochote ngumu, jambo pekee ambalo sijaangalia ni jinsi mbinu hii itakavyofanya wakati wa kufuta shamba kutoka kwa meza. Lakini katika kesi hii unaweza kuunda tu meza ya ziada, ambapo kaunta iliyoboreshwa itapatikana, ambayo itakuwa na thamani ya idadi ya sehemu kwenye jedwali kuu na itabadilika ipasavyo ikifutwa au kuongezwa hii inaweza kutekelezwa kwa kutumia UPDATE.

Kwa ujumla, natumaini itakuwa na manufaa kwa mtu, mimi mwenyewe nimekuwa nikitafuta kwa muda mrefu sana jinsi ya kutatua tatizo hili. Ndio, nilisahau kusema kwamba ilisemwa hapa kulingana na utumiaji wa InnoDB. Hapa kuna majaribio ya kulinganisha:

Wakati wa kuhesabu muda wa utekelezaji wa swali LIMIT, thamani ya wastani ni 0.09 s. kuna rekodi 1000000 kwenye jedwali
CHAGUA * KUTOKA kwa table_name LIMIT 999000, 20

Wakati wa kukokotoa muda wa utekelezaji wa hoja bila LIMIT, thamani ya wastani ni 0.0005 s. kuna rekodi 1000000 kwenye jedwali
CHAGUA * KUTOKA jedwali_name WAPI id > 999000 NA kitambulisho< 999020

Wakati wa kuhesabu wakati wa utekelezaji Ombi COUNT(*) thamani ya wastani 0.06 s. kuna rekodi 1000000 kwenye jedwali
CHAGUA COUNT(*) KUTOKA kwa jedwali_name

Wakati wa kuhesabu muda wa utekelezaji wa hoja bila COUNT(*), thamani ya wastani ni 0.0003 s. kuna rekodi 1000000 kwenye jedwali
CHAGUA COUNT(*) KUTOKA kwa jedwali_name

Lebo: mysql, php, pagination, LIMIT, COUNT, urambazaji wa ukurasa

The hati itakuruhusu kuonyesha sio tu mishale kwenye " ukurasa uliopita"Na" ukurasa unaofuata", kama ilivyo kwenye kifungu, lakini pia, ikiwa inataka, itasaidia kuonyesha orodha thabiti ya viungo kwa kurasa zote za tovuti. Unaweza kuona jinsi inavyoonekana kwenye tovuti yangu - nenda chini kwa ukurasa wa nyumbani tovuti.

Kutumia phpmyadmin (au sql), tengeneza meza (jina ni juu yako, niliita kuchagua) na sehemu mbili. Piga kitambulisho cha shamba la kwanza, str ya pili. Sehemu zote mbili lazima ziwe nazo aina ya nambari(int), toa ongezeko la kiotomatiki kwa uga wa kitambulisho. Jedwali hili itahifadhi thamani ya nambari(katika uwanja wa str), ambayo huamua idadi ya machapisho yaliyoonyeshwa kwenye ukurasa mmoja.

Kila kitu kingine ni rahisi. Tunafanya ombi na kurejesha thamani hii ya nambari, kuiweka katika kutofautiana, kwa mfano, $num . Tunabainisha jumla ya idadi ya machapisho (ujumbe) katika hifadhidata na kuingiza thamani hii katika tofauti ya machapisho ya $. Pata jumla ya idadi ya kurasa kwenye tovuti ($total) na upunguze. Tunahesabu kutoka kwa chapisho gani ni muhimu kuonyesha ujumbe (machapisho) kwenye ukurasa huu ($start). Tunafanya ombi kwa meza na machapisho na kuipunguza kwa kikomo ($ num), tunataja pia parameter ($start) ambayo matokeo ya rekodi itaanza. Sasa kinachobakia ni kupanga viungo vya kurasa husika ipasavyo na, voila, uko tayari. Zaidi maelezo ya kina hati inaweza kuonekana moja kwa moja katika kanuni.

$result77 = mysql_query("CHAGUA str FROM opt", $db); $myrow77 = mysql_fetch_array($result77); // idadi ya machapisho kwenye ukurasa mmoja $num = $myrow77["str"]; // Dondoo kutoka kwa URL ukurasa wa sasa@$page = $_GET["ukurasa"]; // Bainisha jumla ya idadi ya ujumbe katika hifadhidata $result00 = mysql_query("CHAGUA COUNT(*) KUTOKA posti"); $ temp = mysql_fetch_array ($matokeo00); $ posts = $ temp; // Pata idadi ya jumla ya kurasa $total = (($posts - 1) / $num) + 1; $total = intval($jumla); // zunguka ukurasa wa sasa $page = intval($page); // Ikiwa utofauti wa ukurasa wa $ ni chini ya 0 au tupu // kabidhi $page 1 // Na ikiwa thamani ya ukurasa wa $ ni zaidi ya $total, // kabidhi $page thamani ya $total variable if(empty($) ukurasa) au ukurasa wa $< 0) $page = 1; if($page >$ jumla) ukurasa wa $ = $ jumla; // Kuhesabu kuanzia nambari // ujumbe unapaswa kuonyeshwa $start = $page * $num - $num; // Chagua machapisho $num kuanzia nambari $start // -----MINI POSTS----- $result = mysql_query("CHAGUA * KUTOKA posti ORDER BY date DESC LIMIT $start, $num ",$db );

//Onyesha machapisho yote kwa kitanzi

// Angalia ikiwa mishale ya nyuma inahitajika ikiwa ($page != 1) $pervpage = "Kwanza Iliyotangulia"; // Angalia ikiwa mishale ya mbele inahitajika ikiwa ($page != $total) $nextpage = "Inayofuata Mwisho"; // Tafuta kurasa mbili za karibu kutoka kingo zote mbili, ikiwa zipo if($page - 2 > 0) $page2left = " ". (ukurasa wa $ - 2) ""; if($page - 1 > 0) $page1left = "". (ukurasa wa $ - 1) ""; ikiwa($ukurasa +2<=$total) $page2right = " ". ($page + 2) .""; if($page + 1 <=$total) $page1right = " ". ($page + 1) .""; // выводим ссылки echo $pervpage.$page2left.$page1left."".$ukurasa."".$ ukurasa1 kulia. $ ukurasa2 kulia. $ ukurasa unaofuata;

Faida ya urambazaji huu ni kwamba kurasa zote za tovuti zinaweza kupatikana ndani ya mibofyo 3 kutoka kwa ukurasa kuu. Kipengele hiki kinaweza kuwa muhimu, kwa mfano, wakati wa kufanya kazi na huduma ya SAPE.

Shida ya kutekeleza urambazaji wa ukurasa mara nyingi inakabiliwa na waandaaji wa programu wa novice wa PHP. Kugawanya maandishi mengi katika kurasa tofauti hutumiwa katika programu nyingi za Wavuti, kutoka kwa vitabu vya wageni na vikao hadi saraka mbalimbali. Hebu
Hebu tutatue tatizo hili.
Kwa hivyo tunahitaji nini kutekeleza urambazaji wa ukurasa? Kwa mfano, hebu tuchukue kitabu cha wageni kilicho na jumbe mia kadhaa, ambamo ungependa kuonyesha ujumbe wa X kwenye ukurasa.
Hebu tuangalie tatizo hasa zaidi. Ujumbe wa mtumiaji huhifadhiwa kwenye hifadhidata chapisho na muundo ufuatao:

  • kitambulisho - nambari ya ujumbe,
  • maandishi - mwili wa ujumbe,
  • jina - jina la mwandishi,
  • wakati - wakati wa uumbaji.

Kama matokeo, tunahitaji kupata matokeo ya ujumbe wa X kwa ukurasa, na pia kupanga urambazaji unaofaa, kwa mfano, kama hii:

<< < ..2|3|4|5|6.. > >>

ambapo 4 ni ukurasa wa sasa. Ili kufuatilia ukurasa wa sasa, tutatumia parameter ukurasa, kupita kupitia URL. Mfano:

www.myserver.com/index.php?page=X.

Hapa X ndio nambari ya ukurasa (kwa mfano, acha X iwe sawa na 25).

Sasa, baada ya utangulizi huu mfupi, tunaweza kuanza utekelezaji halisi.

// Anzisha muunganisho kwenye hifadhidata
ni pamoja na "config.php";
// Tofauti huhifadhi idadi ya ujumbe unaoonyeshwa kwenye ukurasa
$ num = 25;
// Dondoo kutoka URL ya sasa ukurasa
$page = $_GET ["ukurasa" ];
// Amua jumla ya idadi ya ujumbe katika hifadhidata
$result = mysql_query ("CHAGUA COUNT(*) KUTOKA kwa chapisho" );
$posts = mysql_result($matokeo, 0);
// Tafuta jumla ya idadi ya kurasa
$total = intval (($posts - 1) / $num) + 1;
// Amua mwanzo wa ujumbe kwa ukurasa wa sasa
ukurasa wa $ = intval( ukurasa wa $);
// Ikiwa ukurasa wa $ ni chini ya moja au hasi
// nenda kwenye ukurasa wa kwanza
// Na ikiwa ni kubwa sana, basi nenda kwa mwisho
if(empty($page) au $page< 0 ) $page = 1 ;
if($page > $total ) $page = $total ;
// Hesabu kuanzia nambari gani
// ujumbe unapaswa kuonyeshwa
$anza = ukurasa wa $ * $num - $num ;
// Chagua ujumbe $num kuanzia nambari $start
$result = mysql_query ("CHAGUA * KUTOKA chapisho LIMIT $start , $num " );
// Katika kitanzi tunahamisha matokeo ya hoja kwenye safu ya $postrow
wakati ($postrow = mysql_fetch_array (matokeo ya $))
?>

Hii inakamilisha sehemu ya kwanza. Safu ya pande mbili postrow huhifadhi sehemu zote za jedwali la chapisho muhimu ili kuonyesha ukurasa. Huu hapa ni mfano wa jinsi unavyoweza kupanga pato la ujumbe.

mwangwi"

" ;
kwa($i = 0; $i< $num ; $i ++)
{
mwangwi"


" ;
}
mwangwi"
" . $postrow [ $i ][ "jina" ]. " " . $postrow [ $i ][ "time" ]. "
" . $postrow [ $i ][ "text" ]. "
" ;
?>

Sasa tunahitaji kupanga urambazaji. Tunaunda vipengele vya urambazaji wa siku zijazo.
Tutaweka misimbo ya mshale "hadi mwanzo" na "nyuma" kwenye variable moja, na pia tutafanya vivyo hivyo na mishale "hadi mwisho" na "mbele".

// Angalia ikiwa mishale ya nyuma inahitajika
ikiwa ($page != 1 ) $pervpage = "<<
. (ukurasa wa $ - 1) . ">< " ;
// Angalia ikiwa mishale ya mbele inahitajika
ikiwa ($page != $total ) $nextpage = " ">>
. $ jumla. ">>>" ;

// Tafuta kurasa mbili za karibu kutoka kingo zote mbili, ikiwa zipo
ikiwa($page - 2 > 0 ) $page2left = " " . ( ukurasa wa $ - 2 ) " . | " ;
ikiwa($page - 1 > 0 ) $page1left = " " . ( ukurasa wa $ - 1 ) " . | " ;
ikiwa($ukurasa +2<= $total ) $page2right = " | " . ( $ukurasa +2 ) " ." ;
ikiwa($ukurasa + 1<= $total ) $page1right = " | " . ( $ukurasa + 1 ) " ." ;

// Menyu ya kuonyesha
echo $pervpage . $ukurasa2kushoto. $ukurasa1kushoto. " " . ukurasa wa $ ."" . $page1right . $page2right . $ukurasa unaofuata ;