Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ Paginacja do wyszukiwarki strony

Napisany przez: Zenobiusz 17.05.2019, 09:15:19

Czy jest ktoś w stanie podpiać pod ten skrypt paginacje typu numerowanego 1.2.3.4.5 ?


<?php
$output = NULL;

if(isset($_POST['submit'])) {
//connect to the databse

$mysqli = NEW MySQLi ("localhost", "", ", "");
$search = $mysqli->real_escape_String($_POST['search']);


//Query the database
$resultSet = $mysqli ->query("SELECT * FROM pistolety WHERE marka LIKE '%$search%' OR pistolet LIKE '%$search%'");

if($resultSet ->num_rows > 0) {
while($rows = $resultSet ->fetch_assoc() )
{
$pistolet= $rows['pistolet'];
$marka = $rows['marka'];

$output .= "Pistolet: $pistolet<br />Marka: $marka<br /><br />";
}
}else{
$output = "No results";
}
}
?>

<form method="POST">
<input type="TEXT" name="search" />
<input type="SUBMIT" name="submit" value="Search" />
</form>

<?php echo $output; ?>

Napisany przez: dublinka 17.05.2019, 11:36:37

  1. <?php
  2.  
  3.  
  4.  
  5. function ReturnRows($ServerName, $UserName, $UserPassword, $DbName, $TableContent, $search)
  6. {
  7.  
  8. $Connection = mysqli_connect($ServerName, $UserName, $UserPassword);
  9.  
  10. if(!$Connection)
  11. {
  12.  
  13. http://www.php.net/die ('Nie można się polączyć z MySQL : ' . mysqli_connect_error());
  14.  
  15. }
  16.  
  17. $SelectDB = mysqli_select_db($Connection, $DbName);
  18.  
  19. if(!$SelectDB)
  20.  
  21. {
  22.  
  23. http://www.php.net/print 'Nie mozna polaczyc sie z baza danych ' . mysqli_connect_error();
  24.  
  25. }
  26.  
  27.  
  28.  
  29.  
  30. $sql = "SELECT marka, pistolet FROM $TableContent WHERE marka LIKE '%$search%' OR pistolet LIKE '%$search%'";
  31. $result = mysqli_query($Connection,$sql);
  32.  
  33. if (mysqli_num_rows($result) > 0)
  34. {
  35.  
  36. while($row = mysqli_fetch_assoc($result))
  37. {
  38.  
  39. $TabID[] = $row['marka'];
  40. $TabName[] = $row['pistolet'];
  41.  
  42. }
  43.  
  44.  
  45.  
  46. }
  47.  
  48. mysqli_close($Connection);
  49. $url = $_SERVER['SCRIPT_NAME'];
  50. $wyswietlaj=4;
  51. $ile_linkow=3;
  52. if(http://www.php.net/isset($TabID) && http://www.php.net/isset($TabName))
  53. {
  54. http://www.php.net/array_multisort($TabID, SORT_ASC, $TabName);
  55. }
  56. else{
  57. http://www.php.net/print 'Brak wynikow<br>';
  58. }
  59. if(http://www.php.net/empty($_GET['czytaj']))
  60. {
  61. $czytaj=0;
  62. }
  63. else{
  64. $czytaj=$_GET['czytaj'];
  65. }
  66. if(http://www.php.net/empty($_GET['dalej']))
  67. {
  68. $dalej=1;
  69. }
  70. else{
  71. $dalej=$_GET['dalej'];
  72. }
  73. if(http://www.php.net/isset($_GET['czytaj']))
  74. {
  75. $nr=$_GET['czytaj'];
  76. }
  77. if(http://www.php.net/empty($_GET['czytaj'])){
  78. $nr=0;
  79. }
  80.  
  81. $u=1;
  82. for($i=$czytaj;$i<$czytaj+$wyswietlaj;$i++)
  83. {
  84.  
  85. if(!http://www.php.net/empty($TabID[$i]))
  86. {
  87.  
  88.  
  89. http://www.php.net/print 'Marka: '.$TabID[$i].'<br>';
  90. http://www.php.net/print 'Pistolet: '.$TabName[$i].'<p>';
  91.  
  92. }
  93. }
  94. $out="";
  95. for($i=$dalej;$i<$dalej+$ile_linkow;$i++)
  96. {
  97. $k=($i-1)*$wyswietlaj;
  98. if($k<count(@$TabID))
  99. {
  100. if($k==$czytaj)
  101. {
  102. $out.=" [$i] ";
  103. }
  104. else{
  105. $out.=" <a href=\"$url?&czytaj=$k&dalej=$dalej\">[$i]</a> ";
  106. }
  107. }
  108. }
  109. if($dalej>1)
  110. {
  111. $cz=($dalej-1)*$wyswietlaj-$wyswietlaj;
  112. $dal=$dalej-$ile_linkow;
  113. http://www.php.net/print " <a href=\"$url?czytaj=$cz&dalej=$dal\"><<<</a>";
  114. }
  115. else{
  116. http://www.php.net/print " <<< ";
  117. }
  118. http://www.php.net/print $out;
  119. if($k+$wyswietlaj<count(@$TabID))
  120. {
  121. $cz=$k+$wyswietlaj;
  122. $dal=$dalej+$ile_linkow;
  123. http://www.php.net/print " <a href=\"$url?czytaj=$cz&dalej=$dal\">>>></a> ";
  124. }
  125. else{
  126. http://www.php.net/print " >>>";
  127. }
  128.  
  129.  
  130. }
  131.  
  132.  
  133.  
  134. ReturnRows('localhost', 'root', 'pwdi', 'militaria', 'giwery', 'costam');
  135. // 'server', 'user', 'pass', 'nazwa bazy', 'nazwa tabeli', 'szukana fraza')
  136.  
  137. ?>

Napisany przez: nospor 17.05.2019, 11:41:39

@dublinka czyli z tego co widze, twoim celem jest zarzniecie komus serwera? Bo teraz widze, ze pobierasz wszystkie rekordy, a dopiero potem w php je stronicujesz. Nie sadzisz ze to najgorsze z mozliwych rozwiazan? A co jesli wynik wyszukiwnia zwroci 100 tysiecy rekordow? ALbo milion? Strona wlasnie padla.

Po to sie robi poprawne stronicowanie na bazie by do takiego czarnego scenariusza nie dopuscic

Napisany przez: viking 17.05.2019, 11:46:25

https://codeshack.io/how-to-create-pagination-php-mysql/

Napisany przez: dublinka 17.05.2019, 11:49:51

Cytat(nospor @ 17.05.2019, 12:41:39 ) *
@dublinka czyli z tego co widze, twoim celem jest zarzniecie komus serwera? Bo teraz widze, ze pobierasz wszystkie rekordy, a dopiero potem w php je stronicujesz. Nie sadzisz ze to najgorsze z mozliwych rozwiazan? A co jesli wynik wyszukiwnia zwroci 100 tysiecy rekordow? ALbo milion? Strona wlasnie padla.

Po to sie robi poprawne stronicowanie na bazie by do takiego czarnego scenariusza nie dopuscic


No chyba najpierw trzeba pobrac zeby cokolwiek moc stronicowac.
Pobierem wszystkie ktore chce autor. Wrzucam w tablice i jade po 'kartkach'

Inaczej tego nie robilem.

Napisany przez: kapslokk 17.05.2019, 11:53:35

Cytat(dublinka @ 17.05.2019, 12:49:51 ) *
No chyba najpierw trzeba pobrac zeby cokolwiek moc stronicowac.
Pobierem wszystkie ktore chce autor. Wrzucam w tablice i jade po 'kartkach'

Inaczej tego nie robilem.


I jak będziesz miał 5 mln rekordów, to też tak?

Napisany przez: nospor 17.05.2019, 11:54:57

Cytat
No chyba najpierw trzeba pobrac zeby cokolwiek moc stronicowac.
Czyli generalnie o stronicowaniu malo wiesz....

Pobiera to sie i owszem, ale liczbe rekordow a nie rekordy.

Napisany przez: dublinka 17.05.2019, 11:56:43

Cytat(nospor @ 17.05.2019, 12:54:57 ) *
Czyli generalnie o stronicowaniu malo wiesz....

Pobiera to sie i owszem, ale liczbe rekordow a nie rekordy.


Byc moze malo wiem ale lepiej cos wiedziec niz nic nie wiedziec

Napisany przez: kapslokk 17.05.2019, 11:57:51

Najlepiej, to się najpierw dowiedzieć smile.gif

Napisany przez: dublinka 17.05.2019, 12:00:11

Cytat(kapslokk @ 17.05.2019, 12:57:51 ) *
Najlepiej, to się najpierw dowiedzieć smile.gif

To moze ktos mnie oświeci. Co maja ilosci rekordow do tego jak i tak trzeba pobrac dane.
W moim przykladzie pobieram tylko te ktore pasuja w zapytaniu wiec jaka jest roznica ?

Napisany przez: nospor 17.05.2019, 12:23:26

Cytat
W moim przykladzie pobieram tylko te ktore pasuja w zapytaniu wiec jaka jest roznica ?
Zrozum wkoncu, ze jesli rekordow, ktore beda pasowac, jest w bazie MILION do zajedziesz serwer. Strona poprostu padnie

To sie robi tak, ze sie pobiera LICZBE rekordfow ktore pasuja. Majac liczbe rekordow jestes w stanie zbudowac stronicowanie bo do stronicowania ci jest potrzebna tylko liczba. A rekordy pobierasz tylko dla danej strony. Wiec nawet jak pasujacych rekordow jest MILION to ty dla danej strony pobierasz ich tylko 10 - roznica, chyba dosc widoczna golym okiem, nie sadzisz?

Napisany przez: dublinka 17.05.2019, 13:39:15

Cytat(nospor @ 17.05.2019, 13:23:26 ) *
Zrozum wkoncu, ze jesli rekordow, ktore beda pasowac, jest w bazie MILION do zajedziesz serwer. Strona poprostu padnie

To sie robi tak, ze sie pobiera LICZBE rekordfow ktore pasuja. Majac liczbe rekordow jestes w stanie zbudowac stronicowanie bo do stronicowania ci jest potrzebna tylko liczba. A rekordy pobierasz tylko dla danej strony. Wiec nawet jak pasujacych rekordow jest MILION to ty dla danej strony pobierasz ich tylko 10 - roznica, chyba dosc widoczna golym okiem, nie sadzisz?


Niebardzo czaje "ze sie pobiera LICZBE rekordfow ktore pasuja"

Napisany przez: viking 17.05.2019, 13:46:28

Wchodzisz na stronę która ma mieć paginację. Pobierasz numer strony jeśli był wcześniej wysłany albo 1 jeśli nie podano. Wiesz że masz mieć np 20 wyników na stronie. Robisz zapytanie z limit i offset ustalając odpowiednie warunki. Masz to wszystko w artykule który wcześniej zalinkowałem a to pierwszy z brzegu był.

Napisany przez: nospor 17.05.2019, 13:57:18

Cytat
Niebardzo czaje "ze sie pobiera LICZBE rekordfow ktore pasuja"
A czaisz: pobranie wszystkiech rekordow ktore pasuja do zapytania wyszukiwania? To wlasnie teraz robisz. Wiec zamiast tych rekordow masz pobrac ich liczbe.

Cytat
Masz to wszystko w artykule który wcześniej zalinkowałem
@viking a przejrzales chociac co za glupoty tam wygaduja? Toz to nie jest lepsze od tego co tu dublinka nam sprezentowal

Cytat
$total_pages = $mysqli->query('SELECT * FROM students')->num_rows;

porazka jakas.

Napisany przez: viking 17.05.2019, 14:25:53

Tak tę głupotę widziałem ale reszta jest całkiem sensowna. Nawet binduje parametry.

Napisany przez: nospor 17.05.2019, 14:28:36

Co z tego ze reszta sensowna jak przez te jedna glupote zajedzie komus serwer. Lepiej nie propagowac takich artow pisanych przez poczatkujacych bo wiecej robia krzywdy jak pozytku

Jego struktura tabel tez wiele pokazuje o jego wiedzy

`id` int(11) ,
`age` tinyint(100),
`joined` varchar(255)

Napisany przez: dublinka 17.05.2019, 14:39:11

Cytat(nospor @ 17.05.2019, 14:57:18 ) *
A czaisz: pobranie wszystkiech rekordow ktore pasuja do zapytania wyszukiwania? To wlasnie teraz robisz. Wiec zamiast tych rekordow masz pobrac ich liczbe.

Wez mnie popraw ale jesli mam pobrac liczbe najpierw musze sprawdzic ich poprawnosc wzgledem tego co chce sie znalesc a co za tym idzie chyba trzeba przeleciec tabele. Calą ?

Napisany przez: nospor 17.05.2019, 14:40:10

slowo klucz w mysql: COUNT

Napisany przez: gitbejbe 17.05.2019, 17:06:56

hehe spoko temat biggrin.gif dobra akcja

czekam na dalszy ciąg tłumaczenia paginacji, a zwłaszcza na TEN moment gdy @dublinka - mam nadzieje, zrozumie o co w tym chodzi i złapie się za głowę biggrin.gif Przed nami bardzo ważny moment w jego życiu

Napisany przez: dublinka 17.05.2019, 17:20:09

Cytat(nospor @ 17.05.2019, 15:40:10 ) *
slowo klucz w mysql: COUNT

Coś w tym stylu ?

  1. $sql = "SELECT marka, pistolet, count(*) as c FROM $TableContent WHERE marka LIKE '%$search%' OR pistolet LIKE '%$search%'";

Napisany przez: gitbejbe 17.05.2019, 18:11:47

Cytat
Coś w tym stylu ? $sql = "SELECT marka, pistolet, count(*) as c FROM $TableContent WHERE marka LIKE '%$search%' OR pistolet LIKE '%$search%'";


dla paginacji pobierasz tylko liczbę

  1. $sql = "SELECT COUNT(*) FROM $TableContent WHERE marka LIKE '%$search%' OR pistolet LIKE '%$search%'";


a dla strony pobierasz tylko tyle ile potrzebujesz

  1. $sql = "SELECT * FROM $TableContent WHERE marka LIKE '%$search%' OR pistolet LIKE '%$search%' LIMIT $start , $length";



co do zliczenia ilości rekordów: autor powinien wiedzieć, że jeśli nie planuje mieć dużej bazy to to wystarczy i będzie hulało. Przy dużych bazach trzeba byłoby to lepiej przemyśleć, zoptymalizować, testować. Zliczanie po frazach, pewnie jeszcze na silniku innodb, odbije się długimi czasami.

Napisany przez: dublinka 17.05.2019, 19:48:55

Ok. Musze poczytac o tym jak zoptymalizowac wyniki w duzych zapytaniach.
Generalnie zdaje sobie sprawe ze mozna albo zajechac baze albo zapchac pamiec ładujac np zawartosc pliku ktory ma np 'nascie' mega do pamieci. Jakos o tym nie pomyslalem zreszta wczesniej nie robilem nic w ten sposob czyli z uzyciem count

Napisany przez: Zenobiusz 20.05.2019, 12:02:33

Wrzuci ktos w końcu normalny skrypt ? Bo z tego co widzę to troszkę tu namieszane.

Cytat(dublinka @ 17.05.2019, 20:48:55 ) *
Ok. Musze poczytac o tym jak zoptymalizowac wyniki w duzych zapytaniach.
Generalnie zdaje sobie sprawe ze mozna albo zajechac baze albo zapchac pamiec ładujac np zawartosc pliku ktory ma np 'nascie' mega do pamieci. Jakos o tym nie pomyslalem zreszta wczesniej nie robilem nic w ten sposob czyli z uzyciem count


Wrzucisz poprawione ?

Napisany przez: kapslokk 20.05.2019, 12:21:11

A może Ty troche wysilisz szare komórki i spróbujesz sam coś zrobić ze wszystkich wskazówek, które dostałeś? Chętnie pomożemy, jeśli utkniesz w jakimś momencie.

Napisany przez: Zenobiusz 20.05.2019, 12:36:26

Cytat(kapslokk @ 20.05.2019, 13:21:11 ) *
A może Ty troche wysilisz szare komórki i spróbujesz sam coś zrobić ze wszystkich wskazówek, które dostałeś? Chętnie pomożemy, jeśli utkniesz w jakimś momencie.


Cięzka sprawa biggrin.gif Jestem początkujący.

Napisany przez: kapslokk 20.05.2019, 12:50:32

smile.gif No dobrze, to zacznij od czegoś, jak nie będziesz mógł ruszyć dalej, to wrzuć swój kod tutaj i Cię nakierujemy.

Napisany przez: Zenobiusz 20.05.2019, 12:51:43

Cytat(kapslokk @ 20.05.2019, 13:21:11 ) *
A może Ty troche wysilisz szare komórki i spróbujesz sam coś zrobić ze wszystkich wskazówek, które dostałeś? Chętnie pomożemy, jeśli utkniesz w jakimś momencie.


Dobra. Udało mi się pare rzeczy połączyć ale jest problem bo search engine nie łapie z paginacją.

<?php
$output = NULL;

if(isset($_POST['submit'])) {
//connect to the databse

$mysqli = NEW MySQLi ("localhost", "user", "password", "user");
$search = $mysqli->real_escape_String($_POST['search']);




//Query the database
$resultSet = $mysqli ->query("SELECT * FROM pistolety WHERE marka LIKE '%$search%' OR pistolet LIKE '%$search%'");

if($resultSet ->num_rows > 0) {
while($rows = $resultSet ->fetch_assoc() )
{
$pistolet= $rows['pistolet'];
$marka = $rows['marka'];

$output .= "Pistolet: $pistolet<br />Marka: $marka<br /><br />";
}
}else{
$output = "No results";
}
}
?>

<form method="POST">
<input type="TEXT" name="search" />
<input type="SUBMIT" name="submit" value="Search" />
</form>

<?php echo $output; ?>


<?php






function ReturnRows($ServerName, $UserName, $UserPassword, $DbName, $TableContent, $search)
{

$Connection = mysqli_connect($ServerName, $UserName, $UserPassword);


if(!$Connection)
{

die ('Nie można się pol±czyć z MySQL : ' . mysqli_connect_error());

}

$SelectDB = mysqli_select_db($Connection, $DbName);

if(!$SelectDB)

{

print 'Nie mozna polaczyc sie z baza danych ' . mysqli_connect_error();

}




$sql = "SELECT COUNT(*) FROM $TableContent WHERE marka LIKE '%$search%' OR pistolet LIKE '%$search%'";
$result = mysqli_query($Connection,$sql);

if (mysqli_num_rows($result) > 0)
{

while($row = mysqli_fetch_assoc($result))
{

$TabID[] = $row['marka'];
$TabName[] = $row['pistolet'];

}



}

mysqli_close($Connection);
$url = $_SERVER['SCRIPT_NAME'];
$wyswietlaj=4;
$ile_linkow=3;
if(isset($TabID) && isset($TabName))
{
array_multisort($TabID, SORT_ASC, $TabName);
}
else{
print 'Brak wynikow<br>';
}
if(empty($_GET['czytaj']))
{
$czytaj=0;
}
else{
$czytaj=$_GET['czytaj'];
}
if(empty($_GET['dalej']))
{
$dalej=1;
}
else{
$dalej=$_GET['dalej'];
}
if(isset($_GET['czytaj']))
{
$nr=$_GET['czytaj'];
}
if(empty($_GET['czytaj'])){
$nr=0;
}

$u=1;
for($i=$czytaj;$i<$czytaj+$wyswietlaj;$i++)
{

if(!empty($TabID[$i]))
{


print 'Marka: '.$TabID[$i].'<br>';
print 'Pistolet: '.$TabName[$i].'<p>';

}
}
$out="";
for($i=$dalej;$i<$dalej+$ile_linkow;$i++)
{
$k=($i-1)*$wyswietlaj;
if($k<count(@$TabID))
{
if($k==$czytaj)
{
$out.=" [$i] ";
}
else{
$out.=" <a href=\"$url?&czytaj=$k&dalej=$dalej\">[$i]</a> ";
}
}
}
if($dalej>1)
{
$cz=($dalej-1)*$wyswietlaj-$wyswietlaj;
$dal=$dalej-$ile_linkow;
print " <a href=\"$url?czytaj=$cz&dalej=$dal\"><<<</a>";
}
else{
print " <<< ";
}
print $out;
if($k+$wyswietlaj<count(@$TabID))
{
$cz=$k+$wyswietlaj;
$dal=$dalej+$ile_linkow;
print " <a href=\"$url?czytaj=$cz&dalej=$dal\">>>></a> ";
}
else{
print " >>>";
}


}



ReturnRows('localhost', 'user', 'password', 'user', 'pistolety', 'marka');
// 'server', 'user', 'pass', 'nazwa bazy', 'nazwa tabeli', 'szukana fraza')

?>

Napisany przez: kapslokk 20.05.2019, 13:30:51

1. Wykonaj zapytanie z count - pobierz całkowitą ilość rekordów.
2. Pobierz informację na której stronie jesteś i przypisz sobie do zmiennej
3. Wykonaj zapytanie pobierające rekordy - bez count, z użyciem LIMIT -> Google: MySQL Limit.
Twój limit to ilość rekordów, które chcesz widzieć na stronie, Offset to (numer strony - ze zmiennej - 1) * ilość na stronę.
4. Wyświetl rekordy
5. Wyświetl paginację.

Utwórz sobie jedno połączenie do bazy - na początku skryptu i jego używaj.

Napisany przez: Zenobiusz 21.05.2019, 11:09:12

Cytat(kapslokk @ 20.05.2019, 14:30:51 ) *
1. Wykonaj zapytanie z count - pobierz całkowitą ilość rekordów.
2. Pobierz informację na której stronie jesteś i przypisz sobie do zmiennej
3. Wykonaj zapytanie pobierające rekordy - bez count, z użyciem LIMIT -> Google: MySQL Limit.
Twój limit to ilość rekordów, które chcesz widzieć na stronie, Offset to (numer strony - ze zmiennej - 1) * ilość na stronę.
4. Wyświetl rekordy
5. Wyświetl paginację.

Utwórz sobie jedno połączenie do bazy - na początku skryptu i jego używaj.


Po tutaj piszę i proszę o pomoc. Gdbym był taki mądry jak Twoje wyżej przedstawione punkty to bym na forum nie zaglądał.

Napisany przez: kapslokk 21.05.2019, 11:13:44

No ale chłopie, Ty nawet nie próbujesz zrobić tego co Ci piszę, tylko czekasz aż ktoś to zrobi za Ciebie. Nie uważasz, że to trochę nie fair?

Napisany przez: Zenobiusz 21.05.2019, 11:21:18

Cytat(kapslokk @ 21.05.2019, 12:13:44 ) *
No ale chłopie, Ty nawet nie próbujesz zrobić tego co Ci piszę, tylko czekasz aż ktoś to zrobi za Ciebie. Nie uważasz, że to trochę nie fair?


No może jest nie fair ale ja tego nie ogarnę. Dla mnie tego jest za dużo. Ostatnią rzecz podłączyłem.

Napisany przez: emillo91 21.05.2019, 22:23:23

To może ja postaram się pomóc:
Ad.1 https://dev.mysql.com/doc/refman/8.0/en/counting-rows.html - pierwszy opis
Ad.2 https://stackoverflow.com/questions/9725323/how-to-use-get#answer-9725410
AD.3 https://www.w3schools.com/php/php_mysql_select_limit.asp(ryzyko SQL Injection) - tutaj pod limit i offset podstawiasz dane z $_GET z tym, że musisz wykorzystać mnożenie dla pobierania kolejnych rekordów czyli:
do zapytania pobierającego dane możesz dokleić: "....LiMIT = ".(((int)$_GET['page'] > 0)? ($_GET['page']*20) : 0). " OFFSET = 20";
Ad. 4 https://www.php.net/manual/en/pdostatement.fetchall.php#116347 - podstawiasz zapytanie z Ad.3
Ad. 5:
Tutaj możesz sobie na poczatku ustawić ręcznie kilka linków powiedzmy : <a href="strona.php?page=0" /> <a href="strona.php?page=1" /> <a href="strona.php?page=2" />

Ad.6 https://www.php.net/manual/en/pdo.connections.php

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)