Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Pagination, Problem z pagination
Durkane
post 29.01.2016, 11:34:01
Post #1





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


Witam.
Próbuję zrobić pagination według tutoriala z youtube. Jednak na stronie wyskakuje mi błąd Fatal error: Unsupported operand types.
Ten problem dotyczy tego fragmentu kodu :
  1. $last = ceil($rows/$page_rows);


A tutaj przedstawiam cały kod:
  1. <?php
  2. require_once "connect.php";
  3.  
  4. if ($dbh->connect_errno !=0)
  5. {
  6. echo "Error: ". $dbh->connect_errno;
  7. }
  8. else
  9. {
  10. try
  11. {
  12. //Pierwsze zapytanie do policzenia liczby wierszy
  13. $sth=$dbh->prepare("SELECT COUNT(id) FROM Spis");
  14. $sth->execute();
  15. $row = $sth->fetchAll(PDO::FETCH_ASSOC);
  16. //Tutaj mamy wszystkie
  17. $rows = $row[0];
  18. //To jest liczba rezultatow, ktore chcemy wyswietla na stronie
  19. $page_rows = 10;
  20. //Liczba naszej ostatniej strony
  21. $last = ceil($rows/$page_rows);
  22. //Upewniamy sie,ze $last nie jest mniejszy od 1
  23. if ($last < 1)
  24. {
  25. $last = 1;
  26. }
  27. //Ustawiamy $pagenum jako zmienna
  28. $pagenum = 1;
  29. //Bierzemy pagenum z URL if jezeli jest terazniejsza, else jezeli jest 1
  30. if (isset($_GET['pn']))
  31. {
  32. $pagenum = preg_replace('#[^0-9]#','', $_GET['pn']);
  33. }
  34. //Upewniamy sie,ze numer strony nie jest nizszy niz 1 albo nie jest wiekszy niz $last
  35. if ($pagenum < 1)
  36. {
  37. $pagenum = 1;
  38. }
  39. else if ($pagenum > $last)
  40. {
  41. $pagenum = $last;
  42. }
  43. //Ustalamy zasieg wierszy do wybrania $pagenum
  44. $limit = 'LIMIT ' .($pagenum - 1) * $page_rows.',' .$page_rows;
  45. // Zapytanie biorace jedna strony wierszy
  46. $sql = $dbh->prepare("SELECT ID, Imie, Nazwisko FROM Spis");
  47. $sql->execute();
  48. //Pokazuje uzytkownikowi, na ktorej jest stronie i liczbe stron dostepnych
  49. $textline1 = "Spis ludnosci (<b>$rows</b>)";
  50. $textline2 = "Strona <b>$pagenum</b> of <b>$last</b>";
  51. // Ustawiamy $paginationCtrls jako zmienna
  52. $paginationCtrls = '';
  53. //Jezeli jest wiecej niz 1 strona rezultatow
  54. if ($last != 1)
  55. {
  56. /*Sprawdzamy czy jestesmy na 1 stronie. Jezeli tak to nie potrzebujemy "Poprzednia"
  57.   A jezeli nie jestesmy to generujemy link do pierwszej stroyn i do nastepnej.*/
  58. if ($pagenum > 1)
  59. {
  60. $previous = $pagenum -1;
  61. $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$previous.'">Poprzednia</a> &nbsp; ';
  62.  
  63. //Generujemy klikalne linki
  64. for($i = $pagenum - 4; $i < $pagenum; $i++)
  65. {
  66. if($i > 0)
  67. {
  68. $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> $nbsp; ';
  69.  
  70. }
  71. }
  72. }
  73. //Generujemy liczbę strony, na której jesteśmy bez możliwości przejścia do niej ponownie
  74. $paginationCtrls .= ''.$pagenum.' $nbsp; ';
  75. //Generujemy klikalne numery strony, ktore pojawia sie po prawej
  76. for($i = $pagenum + 1; $i <= $last; $i++)
  77. {
  78. $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'</a> &nbsp; ';
  79. if($i >= $pagenum + 4)
  80. {
  81. break;
  82. }
  83. //To samo co wyzej tylko sprawdzamy czy jestesmy na ostatniej stronie jak tak to nie generujemy next
  84. if ($pagenum != last)
  85. {
  86. $next = $pagenum + 1;
  87. $paginationCtrls .= ' &nbsp; &nbsp; <a href="'.$_SERVER['PHP_SELF'].'?pn='.$next.'">Następna</a>';
  88. }
  89. }
  90. }
  91. $list = '';
  92. while($row = $sql->fetchAll(PDO::FETCH_ASSOC))
  93. {
  94. $id = $row["ID"];
  95. $firstname = $row["Imie"];
  96. $lastname = $row["Nazwisko"];
  97. }
  98. }
  99. catch (Exception $e)
  100. {
  101. echo "Przepraszamy w tej chwili nie możemy połączyć się z bazą danych. Spróbuj ponownie później.";
  102. }
  103. $dbh=null;
  104. }
  105. ?>
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
trueblue
post 29.01.2016, 11:37:39
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


FETCH_ASSOC zwraca tablicę asocjacyjną, po drugie wcale nie pobrałeś z $row liczby wierszy - tablica jest inaczej zbudowana.
  1. $sth=$dbh->query("SELECT COUNT(id) FROM Spis");
  2. $rows=$sth->fetchColumn(0);



--------------------
Go to the top of the page
+Quote Post
Durkane
post 29.01.2016, 12:00:34
Post #3





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


Dobra przechodzi normalnie na stronę tylko nie wyświetla danych z bazy danych oraz nie wyświetla liczby stron :/ Trochę dodałem kodu, więc umieszczam jeszcze raz. Dodałem to wszystko w html, ponieważ nie wyświetla mi polskich znaków :/ W sumie nawet po dodaniu nie wyświetla polskich znaków na całej stronie...

  1. <!DOCTYPE html>
  2. <html lang="pl">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http=equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <meta name="Description" content="Tu wpisz opis zawartości strony" />
  8. <meta name="Keywords" content="Tu wpisz wyrazy kluczowe rozdzielone przecinkami" />
  9. <title>Internetowa Ewidencja Spisu Ludności Miasta Łapy</title>
  10. <link rel="stylesheet" type="text/css" href="css/bootstrap.css">
  11. <link rel="stylesheet" type="text/css" href="css/style.css">
  12.  
  13. <!--[if lt IE 9]>
  14. <scirpt src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
  15. <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
  16. <![endif]-->
  17. </head>
  18. <body>
  19. <?php
  20. require_once "connect.php";
  21.  
  22. if ($dbh->connect_errno !=0)
  23. {
  24. echo "Error: ". $dbh->connect_errno;
  25. }
  26. else
  27. {
  28. try
  29. {
  30. //Pierwsze zapytanie do policzenia liczby wierszy
  31. $sth=$dbh->prepare("SELECT COUNT(ID) FROM Spis");
  32. $sth->execute();
  33. $row = $sth->fetchColumn(0);
  34. //Tutaj mamy wszystkie
  35. $rows = $row[0];
  36. //To jest liczba rezultatow, ktore chcemy wyswietla na stronie
  37. $page_rows = 10;
  38. //Liczba naszej ostatniej strony
  39. $last = ceil($rows/$page_rows);
  40. //Upewniamy sie,ze $last nie jest mniejszy od 1
  41. if ($last < 1)
  42. {
  43. $last = 1;
  44. }
  45. //Ustawiamy $pagenum jako zmienna
  46. $pagenum = 1;
  47. //Bierzemy pagenum z URL if jezeli jest terazniejsza, else jezeli jest 1
  48. if (isset($_GET['pn']))
  49. {
  50. $pagenum = preg_replace('#[^0-9]#','', $_GET['pn']);
  51. }
  52. //Upewniamy sie,ze numer strony nie jest nizszy niz 1 albo nie jest wiekszy niz $last
  53. if ($pagenum < 1)
  54. {
  55. $pagenum = 1;
  56. }
  57. else if ($pagenum > $last)
  58. {
  59. $pagenum = $last;
  60. }
  61. //Ustalamy zasieg wierszy do wybrania $pagenum
  62. $limit = 'LIMIT ' .($pagenum - 1) * $page_rows.',' .$page_rows;
  63. // Zapytanie biorace jedna strone wierszy
  64. $sql = $dbh->prepare("SELECT ID, Imie, Nazwisko FROM Spis");
  65. $sql->execute();
  66. //Pokazuje uzytkownikowi, na ktorej jest stronie i liczbe stron dostepnych
  67. $textline1 = "Spis ludnosci (<b>$rows</b>)";
  68. $textline2 = "Strona <b>$pagenum</b> of <b>$last</b>";
  69. // Ustawiamy $paginationCtrls jako zmienna
  70. $paginationCtrls = '';
  71. //Jezeli jest wiecej niz 1 strona rezultatow
  72. if ($last != 1)
  73. {
  74. /*Sprawdzamy czy jestesmy na 1 stronie. Jezeli tak to nie potrzebujemy "Poprzednia"
  75.   A jezeli nie jestesmy to generujemy link do pierwszej stroyn i do nastepnej.*/
  76. if ($pagenum > 1)
  77. {
  78. $previous = $pagenum -1;
  79. $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$previous.'">Poprzednia</a>   ';
  80.  
  81. //Generujemy klikalne linki
  82. for($i = $pagenum - 4; $i < $pagenum; $i++)
  83. {
  84. if($i > 0)
  85. {
  86. $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> $nbsp; ';
  87.  
  88. }
  89. }
  90. }
  91. //Generujemy liczbę strony, na której jesteśmy bez możliwości przejścia do niej ponownie
  92. $paginationCtrls .= ''.$pagenum.' $nbsp; ';
  93. //Generujemy klikalne numery strony, ktore pojawia sie po prawej
  94. for($i = $pagenum + 1; $i <= $last; $i++)
  95. {
  96. $paginationCtrls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'</a>   ';
  97. if($i >= $pagenum + 4)
  98. {
  99. break;
  100. }
  101. //To samo co wyzej tylko sprawdzamy czy jestesmy na ostatniej stronie jak tak to nie generujemy next
  102. if ($pagenum != last)
  103. {
  104. $next = $pagenum + 1;
  105. $paginationCtrls .= '     <a href="'.$_SERVER['PHP_SELF'].'?pn='.$next.'">Następna</a>';
  106. }
  107. }
  108. }
  109. $list = '';
  110. while($row = $sql->fetchAll(PDO::FETCH_ASSOC))
  111. {
  112. $id = $row["ID"];
  113. $firstname = $row["Imie"];
  114. $lastname = $row["Nazwisko"];
  115. $list .= '<p><a href="dane.php?id='.$id.'">'.$firstname.' '.$lastname.' </a> - Kliknij, aby zobaczyć pełne dane.</p>';
  116. }
  117. }
  118. catch (Exception $e)
  119. {
  120. echo "Przepraszamy w tej chwili nie możemy połączyć się z bazą danych. Spróbuj ponownie później.";
  121. }
  122. $dbh=null;
  123. }
  124. ?>
  125. </body>
  126. </html>


Ten post edytował Durkane 29.01.2016, 12:01:13
Go to the top of the page
+Quote Post
trueblue
post 29.01.2016, 12:03:31
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Zobacz jeszcze raz kod jaki Ci podałem i porównaj z tym co masz obecnie.


--------------------
Go to the top of the page
+Quote Post
Durkane
post 29.01.2016, 12:26:10
Post #5





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


O matko najmocniej przepraszam tongue.gif Sądziłem, że wszystkie zmieniłem. Wszystko działa pięknie tylko zamiast imienia i nazwiska wyświetla mi np. K K. A chciałbym żeby wyświetlało całe imię i nazwisko.

Takie błędy mam na stronie jak otwieram.
  1. Notice: Undefined property: PDO::$connect_errno in /virtual/spisludnosci.cba.pl/Pagination.php on line 23
  2.  
  3. Warning: Illegal string offset 'ID' in /virtual/spisludnosci.cba.pl/Pagination.php on line 113
  4.  
  5. Warning: Illegal string offset 'Imie' in /virtual/spisludnosci.cba.pl/Pagination.php on line 114
  6.  
  7. Warning: Illegal string offset 'Nazwisko' in /virtual/spisludnosci.cba.pl/Pagination.php on line 115


Rozumiem, że w PDO raczej nie używa się connect_errno ? I czytam o tym Illegal string offset,ale nie wiem jak to zmienić :/ Próbowałem fetchAll(PDO::FETCH_COLUMN, 0), ale to nie działa. Robiłem też fetchColumn() bez podawania numeru, ale wtedy daje mi 1 1 itd.
Go to the top of the page
+Quote Post
nospor
post 29.01.2016, 12:39:23
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie $sql->fetchAll
a $sql->fetch

Mozesz uzyc $sql->fetchAll ale nie w polaczeniu z WHILE bezposrednio. Patrz troche do manuala co robia dane funkcje


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Durkane
post 29.01.2016, 12:57:06
Post #7





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


Właśnie mam włączony manual i tam nigdzie nie zauważyłem tego, że nie używa się z while smile.gif
Ale wielkie dzięki ! smile.gif Będę pamiętał, że fetchAll nie używać z while tongue.gif Pewnie z foreach racja?

A to connect_errno mogę zostawić? Nie jest to błędne? Jeszcze mam sprawę. Otóż mam np 3 strony, ale na każdej wyświetla 10 tych samych rekordów. Macie może jakiś dobry aktualny poradnik z pagination ? Ponieważ ten co znalazłem fajnie omówiony jest z 2013 roku.

EDIT: Co do tego wyświetlania rekordów to już naprawiłem smile.gif

Ten post edytował Durkane 29.01.2016, 13:08:21
Go to the top of the page
+Quote Post
lukaskolista
post 29.01.2016, 14:42:41
Post #8





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


Wywal, w komunikacie błędu masz jasno powiedziane, że taka właściwość nie istnieje. Zamiast tego użyj przechwytywania wyjątków tak, jak to jest pokazane w manualu: Errors and error handling.
Go to the top of the page
+Quote Post
Durkane
post 30.01.2016, 13:59:41
Post #9





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


Witam ponownie. Nie chce zakładać nowego tematu dla jednego pytania dlatego też zadam je tutaj. Mianowicie chodzi o to, że do BLOB wrzucam plik pdf w bazie danych i chciałbym żeby pobierało ten plik i wyświetlało jego nazwę, na którą można kliknąć i albo go pobiera albo otwiera nowe okno z nim. Czy mógłby ktoś podrzucić jakiś link, w którym mógłbym poczytać i na podstawie tego napisać kod. Jeżeli dam po prostu wyświetlanie tak jak daje dla imienia i nazwiska to wyświetla mi milion znaków zamiast tego co znajduje się w tym właśnie pdfie : /
Go to the top of the page
+Quote Post
trueblue
post 30.01.2016, 14:18:22
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Przy okazji masz nakierowanie jak przechowywać pliki: http://forum.php.pl/index.php?showtopic=247712


--------------------
Go to the top of the page
+Quote Post
Durkane
post 30.01.2016, 14:51:28
Post #11





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


Jeżeli dobrze rozumiem to dać takie coś :
  1. header('Content-Type: application/pdf');
  2. header('Content-Disposition: attachment; filename="downloaded.pdf"');
  3. readfile('original.pdf');

tylko zamiast original.pdf to dać to co wyciągnąłem z bazy danych tak?

Ten post edytował Durkane 30.01.2016, 15:13:51
Go to the top of the page
+Quote Post
trueblue
post 30.01.2016, 16:03:11
Post #12





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Zamiast readfile.


--------------------
Go to the top of the page
+Quote Post
Durkane
post 31.01.2016, 11:08:53
Post #13





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


Witam ponownie. Aby nie zaśmiecać kolejnym tematem to mam sprawę związaną z wyszukiwarką osób. Oczywiście daje takie coś :

  1. <?php
  2. require_once "connect.php";
  3. $search=$_POST['search'];
  4. try
  5. {
  6. $sth=$dbh->prepare("SELECT ID,Imie,Nazwisko FROM Spis WHERE Imie LIKE '%$search%' AND Nazwisko LIKE '%$search%'");
  7. $sth->execute();
  8. $result = $sth->fetchAll(PDO::FETCH_ASSOC);
  9.  
  10. if(Count($result)>0)
  11. {
  12. foreach($result as $row)
  13. {
  14. $id = $row["ID"];
  15. $firstname = $row["Imie"];
  16. $lastname = $row["Nazwisko"];
  17. echo '<div id="list">
  18. <ul id="tabelka">
  19. <li class="column">
  20. <ul>
  21. <p><a href="dane.php?id='.$id.'">'.$firstname.' '.$lastname.' </a> - Kliknij, aby zobaczyć pełne dane.</p>
  22. </ul>
  23. </li>
  24. </ul>
  25. </div>';
  26. }
  27. }
  28. }
  29. catch (Exception $e)
  30. {
  31. echo 'Connection failed: ' . $e->getMessage();
  32. }
  33. $dbh=null;
  34. ?>


I po wpisaniu np . Adam Tracikowski nic się nie dzieje, wyświetla pustą stronę. Natomiast jeżeli skasuje to AND Nazwisko LIKE '%$search%' i zostawię tylko imię i wpisuje Adam to wszystko ładnie wyszukuje. Nie mam zielonego pojęcia co może być nie tak z tym. Szukam od wczoraj wieczora rozwiązania, próbuje różnych sposobów na pisanie tego. Próbowałem też z contact_ws, ale to też nie działa.

Ten post edytował Durkane 31.01.2016, 11:10:16
Go to the top of the page
+Quote Post
viking
post 31.01.2016, 11:11:45
Post #14





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Dlaczego nie bindujesz danych POST tylko zezwalasz na SQL Injection? Może po prostu nie ma takich danych w bazie?


--------------------
Go to the top of the page
+Quote Post
trueblue
post 31.01.2016, 11:13:18
Post #15





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Myślisz, że:
  1. WHERE Imie LIKE '%Jan Kowalski%' AND Nazwisko LIKE '%Jan Kowalski%'

ma sens?


--------------------
Go to the top of the page
+Quote Post
Durkane
post 31.01.2016, 11:14:13
Post #16





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


No właśnie nad tym myślałem, że to bez sensu, ale nie wiem jak z 1 pola formularze przesyłać oddzielnie imię i nazwisko.
Go to the top of the page
+Quote Post
trueblue
post 31.01.2016, 11:15:48
Post #17





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Nie wiesz jak podzielić string?
http://php.net/manual/en/function.explode.php

A jak już podzielisz, to dojdziesz do kolejnego problemu.


--------------------
Go to the top of the page
+Quote Post
Durkane
post 31.01.2016, 11:17:31
Post #18





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


No niestety od początku mojej nauki nie było mi to potrzebne tongue.gif Dlatego też nie wiem o tym smile.gif Jestem na bardzo podstawowym poziomie z PHP smile.gif Więc bardzo dziękuje za waszą pomoc i cierpliwość smile.gif

Bardzo ślicznie dziękuje ! biggrin.gif Już działa bardzo ładnie tak jak chciałem smile.gif

Ten post edytował Durkane 31.01.2016, 11:20:19
Go to the top of the page
+Quote Post
trueblue
post 31.01.2016, 11:22:55
Post #19





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Wpisz w wyszukiwarkę: Tracikowski Adam


--------------------
Go to the top of the page
+Quote Post
Durkane
post 31.01.2016, 13:29:18
Post #20





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 28.07.2015

Ostrzeżenie: (0%)
-----


Ah... po samym nazwisku albo jak nazwisko pierwsze nie znajduje tongue.gif No nic coś pokombinuje na razie sam smile.gif

Przeskanowałem sporo tematów, sam próbowałem różnych zapisów tego co mam i niestety nic nie dało takiego efektu żeby nawet po nazwisku szukało :/
Można prosić o małą podpowiedź ?

Mógłby ktoś podpowiedzieć coś ? Bardzo proszę smile.gif

Ten post edytował Durkane 31.01.2016, 12:05:01
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 09:13