Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Wydruk z php i mysql do pdf
kecajs
post 2.08.2015, 22:02:09
Post #1





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


Witam,
mam skrypt wyciągający dane z bazy i prezentujący je w tabeli:
  1. <body>
  2. <center><strong>PRZEGLĄD WSZYSTKICH ZLECEу DO REALIZACJI</strong></center><br><br>
  3.  
  4. <table border="1" width="90%" align=center cellpadding=2>
  5. <tr>
  6. <td width="20" class="table_small">Lp</td>
  7. <td width="130" class="table_small">Nazwa</td>
  8. <td width="40" class="table_small">Materiał</td>
  9. <td width="40" class="table_small">Norma</td>
  10. <td width="60" class="table_small">Ilość</td>
  11. <td width="40" class="table_small">Stan</td>
  12. <td width="50" class="table_small">Lokacja</td>
  13. <td width="40" class="table_small">Waga</td>
  14. <td width="40" class="table_small">Pilne</td>
  15. </tr>
  16. <?php
  17. include_once ("db_con.php");
  18. $connection = dbconn::instance();
  19. $wynik = $connection->query("SELECT m.LacznikID, m.Nazwa, m.Material, m.Norma, w.IloscZam, m.Lokacja, m.Waga, m.Stan, w.Cito FROM tb_laczniki_main AS m LEFT JOIN tb_laczniki_wyjscie AS w ON m.LacznikID=w.LacznikID WHERE w.IloscZam>0 ORDER BY LacznikID ASC");
  20. while ($r = mysql_fetch_assoc($wynik)) {
  21. echo '<tr>';
  22. echo '<td width="20" class="table_small"><a href="index.php?go=pokaz&artykul_id='.$r['LacznikID'].'">'.$r['LacznikID'].'</a></td>';
  23. echo '<td width="130" class="table_small">' . $r['Nazwa'] . '</td>';
  24. echo '<td width="40" class="table_small">' . $r['Material'] . '</td>';
  25. echo '<td width="40" class="table_small">' . $r['Norma'] . '</td>';
  26. echo '<td width="60" class="table_small">' . $r['IloscZam'] . '</td>';
  27. echo '<td width="40" class="table_small">' . $r['Stan'] . '</td>';
  28. echo '<td width="50" class="table_small">' . $r['Lokacja'] . '</td>';
  29. echo '<td width="40" class="table_small">' . $r['Waga'] . '</td>';
  30. echo '<td width="40" class="table_small">' . $r['Cito'] . '</td>';
  31. echo "</tr>";
  32. }
  33. ?>
  34. </table>
  35.  
  36.  
  37.  
  38. </body>

Zadanie jest takie, aby przygotować wydruk w pdf tych samych danych i dodatkowo dodać trzy kolumny z tabeli tb_laczniki_wyjscie: DataPrzyg, DataWyd, IloscWyd, które to będą miały puste pola - do wpisania długopisem przykładowo.
Struktura bazy:
- tb_laczniki_main (LacznikID - primary, a.i.; Nazwa; Material; Norma; DostawcaID - klucz obcy do tabeli tb_dostawcy; ProducentID - klucz obcy do tabeli tb_producent; Zdjecie; Waga; Uwagi; Lokacja; LokacjaPoz; Stan),
- tb_laczniki_wyjscie (LaczWydID - primary, a.i. ; LacznikID - klucz obcy do tabeli tb_laczniki_main; DataZam; NrZam; DokZam; IloscZam; DataPrzyg; DataWyd; NrProt; IloscWyd).
W tabeli znajdują się wyrazy z polskimi znakami diakrytycznymi.
Przy okazji - jak można zrobić automatyczną, kolejną numerację pól NrZam i NrProt?
Z góry dzięki wielkie za pochylenie się nad moim wymysłem :)
szakal
Go to the top of the page
+Quote Post
Puszy
post 3.08.2015, 14:53:19
Post #2





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Potrzebujesz gotowej klasy generującej PDF. Wydaje mi się że dla Ciebie dobre będzie TCPDF http://www.tcpdf.org/
Generujesz string zawierający HTML (css w <style> nie działa, musisz używać atrybutu: <a style="color: #FF0000;">. Jeżeli potrzebujesz dodatkowe kolumny dorzucasz do while po prostu puste <td></td>

  1. <?php
  2. include_once ("db_con.php");
  3. $connection = dbconn::instance();
  4. $wynik = $connection->query("
  5. SELECT
  6. m.LacznikID,
  7. m.Nazwa,
  8. m.Material,
  9. m.Norma,
  10. w.IloscZam,
  11. m.Lokacja,
  12. m.Waga,
  13. m.Stan,
  14. w.Cito
  15. FROM tb_laczniki_main AS m
  16. LEFT JOIN tb_laczniki_wyjscie AS w
  17. ON m.LacznikID=w.LacznikID
  18. WHERE
  19. w.IloscZam > 0
  20. ORDER BY
  21. LacznikID ASC
  22. ");
  23.  
  24. $html = '
  25. <center><strong>PRZEGLĄD WSZYSTKICH ZLECEу DO REALIZACJI</strong></center>
  26. <br /><br />
  27.  
  28. <table border="1" width="90%" align=center cellpadding=2>
  29. <tr>
  30. <th width="20" class="table_small">Lp</th>
  31. <th width="130" class="table_small">Nazwa</th>
  32. <th width="40" class="table_small">Materiał</th>
  33. <th width="40" class="table_small">Norma</th>
  34. <th width="60" class="table_small">Ilość</th>
  35. <th width="40" class="table_small">Stan</th>
  36. <th width="50" class="table_small">Lokacja</th>
  37. <th width="40" class="table_small">Waga</th>
  38. <th width="40" class="table_small">Pilne</th>
  39. <th></th>
  40. <th></th>
  41. </tr>
  42. ';
  43. while($r = mysql_fetch_assoc($wynik)){
  44.  
  45. $html.= '
  46. <tr>
  47. <td width="20" class="table_small"><a href="index.php?go=pokaz&artykul_id='.$r['LacznikID'].'">'.$r['LacznikID'].'</a></td>
  48. <td width="130" class="table_small">' . $r['Nazwa'] . '</td>
  49. <td width="40" class="table_small">' . $r['Material'] . '</td>
  50. <td width="40" class="table_small">' . $r['Norma'] . '</td>
  51. <td width="60" class="table_small">' . $r['IloscZam'] . '</td>
  52. <td width="40" class="table_small">' . $r['Stan'] . '</td>
  53. <td width="50" class="table_small">' . $r['Lokacja'] . '</td>
  54. <td width="40" class="table_small">' . $r['Waga'] . '</td>
  55. <td width="40" class="table_small">' . $r['Cito'] . '</td>
  56. <td></td>
  57. <td></td>
  58. </tr>';
  59. }
  60.  
  61. $html .= '</table>';
  62.  
  63. $TCPDF = new TCPDF('P', 'mm', 'A4');
  64. $TCPDF->setPrintFooter(false); // blokuje wyświetlanie stopki
  65. $TCPDF->setPrintHeader(false); // blokuje wyświetlanie nagłówka
  66. $TCPDF->AddPage(); // dodaje stronę
  67. $TCPDF->writeHTML($html, null, null, null, null, 'R'); // wpisuje wygenerowany HTML
  68. $TCPDF->Ln(10); // odstęp pionowy na 10 znaków
  69.  
  70.  
  71. ?>



Przy numeracji możesz np zadeklarować zmienną pomocniczą:

  1. <?php
  2.  
  3. $i = 1;
  4. while($r = mysql_fetch_assoc($wynik)){
  5. // ciało pętli
  6. // teraz zmienna $i będzie kolejno numerowana, możesz ją wstawić w komórkę tabeli
  7.  
  8. $i++;
  9. }
  10.  
  11. ?>


Ten post edytował Puszy 3.08.2015, 14:56:10
Go to the top of the page
+Quote Post
kecajs
post 3.08.2015, 20:40:29
Post #3





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


Witaj,
dzięki za odpowiedź smile.gif
Mam jeszcze takie pytanie - gdzie mam wrzucić tę klasę i plik css? Używam WebServ'a 2. Czy nie będzie problemów z obsługą polskich znaków? Czytałem w internecie, że jakieś mogą się pojawić.
Pozdrawiam,
szakal
Go to the top of the page
+Quote Post
Puszy
post 4.08.2015, 15:53:27
Post #4





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Nie zadziała Ci plik CSS. Musisz użyć atrybutów np.

  1. <span style="border: 1px;"></span>
  2. <p style="color: #FF0000;"></p>


Proponuję Ci w projekcie utworzyć folder module, w nim stworzyć folder tcpdf i wrzucić pliki. Potem robisz include:
  1. <?php
  2. include 'module/tcpdf/tcpdf.php';
  3. include 'module/tcpdf/config/lang/pol.php'; // rozwiązuje problem polskich znaków
  4. ?>


Przy założeniu że plik na którym pracujesz jest w głównym folderze projektu.

Ten post edytował Puszy 4.08.2015, 15:53:42
Go to the top of the page
+Quote Post
kecajs
post 4.08.2015, 16:23:15
Post #5





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


OK, a gdzie znajdę plik pol.php? W paczce, którą ściągnąłem z podanej strony nie ma go.
Go to the top of the page
+Quote Post
Puszy
post 4.08.2015, 18:15:27
Post #6





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Utwórz sobie i wklej:

  1. <?php
  2. //============================================================+
  3. // File name : pol.php
  4. // Begin : 2010-10-26
  5. // Last Update : 2010-10-26
  6. //
  7. // Description : Language module for TCPDF
  8. // (contains translated texts)
  9. // Polish
  10. //
  11. // Author: Nicola Asuni
  12. //
  13. // (c) Copyright:
  14. // Nicola Asuni
  15. // Tecnick.com LTD
  16. // Manor Coach House, Church Hill
  17. // Aldershot, Hants, GU12 4RQ
  18. // UK
  19. // www.tecnick.com
  20. // info@tecnick.com
  21. //============================================================+
  22.  
  23. /**
  24.  * TCPDF language file (contains translated texts).
  25.  * @package com.tecnick.tcpdf
  26.  * @brief TCPDF language file: Polish
  27.  * @author Nicola Asuni
  28.  * @since 2010-10-26
  29.  */
  30.  
  31. // Polish
  32.  
  33. global $l;
  34. $l = Array();
  35.  
  36. // PAGE META DESCRIPTORS --------------------------------------
  37.  
  38. $l['a_meta_charset'] = 'UTF-8';
  39. $l['a_meta_dir'] = 'ltr';
  40. $l['a_meta_language'] = 'pl';
  41.  
  42. // TRANSLATIONS --------------------------------------
  43. $l['w_page'] = 'strona';
  44.  
  45. //============================================================+
  46. // END OF FILE
  47. //============================================================+
  48.  
Go to the top of the page
+Quote Post
kecajs
post 4.08.2015, 21:29:41
Post #7





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


Cytat(Puszy @ 4.08.2015, 16:53:27 ) *
Proponuję Ci w projekcie utworzyć folder module, w nim stworzyć folder tcpdf i wrzucić pliki. Potem robisz include:
  1. <?php
  2. include 'module/tcpdf/tcpdf.php';
  3. include 'module/tcpdf/config/lang/pol.php'; // rozwiązuje problem polskich znaków
  4. ?>


Przy założeniu że plik na którym pracujesz jest w głównym folderze projektu.

No właśnie - tak jest. Plik zapisałem jako wydr_lacz_zam i jest w głównym folderze, jak i inne pliki. Wskazany powyżej folder jest też w głównym folderze projektu. Po wywołaniu pliku wydr_lacz_zam.php mam taki komunikat:
Warning: include(/module/tcpdf/config/lang/pol.php): failed to open stream: No such file or directory in D:\PROJEKTY WWW\MZ - magazyn\wydr_lacz_zam.php on line 15

Warning: include(): Failed opening '/module/tcpdf/config/lang/pol.php' for inclusion (include_path='.;C:\php\pear') in D:\PROJEKTY WWW\MZ - magazyn\wydr_lacz_zam.php on line 15
Sprawdzałem, folder jest na miejscu...

Ten post edytował kecajs 4.08.2015, 21:30:50
Go to the top of the page
+Quote Post
Puszy
post 4.08.2015, 23:39:24
Post #8





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Plik pol.php nie istnieje w tej ścieżce.

1. Sprawdź czy ten plik jest rzeczywiśxie tam
2. Sprawdź czy plik się przypadkiem niennazywa pol.php.txt z racji że sam go tworzyłeś, w Windowsie domyślnie rozszerzenia są ukryte

Dodam tylko że musisz czytać błędy. Jeżeli serwer zwraca Ci "No such file in..." to możesz być pewien że plik nienistnieje lub masz złą ścieżkę. Te błędy NIGDY się nie mylą (no w 99.99%, 0,01% to bugi)
Poczytaj też o ścieżce względnej i bezwzględnej

Ten post edytował Puszy 4.08.2015, 23:41:03
Go to the top of the page
+Quote Post
kecajs
post 5.08.2015, 20:45:46
Post #9





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


Posprawdzam te ścieżki, ale na 90% jest wszystko na miejscu i się odpowiednio nazywa.
Do Puszy:
A przy okazji, czy mógłbyś zerknąć na mój inny wątek: Temat: MySQLPHPPrzekazywanie zmiennych POST i podpowiedzieć mi jak rozwiązać opisane tam niedoróbki? Dla Ciebie to moment, a ja utknąłem :)
Pozdrawiam,
szakal

Cytat(Puszy @ 5.08.2015, 00:39:24 ) *
Plik pol.php nie istnieje w tej ścieżce.

1. Sprawdź czy ten plik jest rzeczywiśxie tam

Pliki rzeczywiście są w dokładnie tej ścieżce, tj. module/tcpdf/tcpdf.php i pozostałe pliki, oraz module/tcpdf/lang/pol.php.

Cytat(Puszy @ 5.08.2015, 00:39:24 ) *
2. Sprawdź czy plik się przypadkiem niennazywa pol.php.txt z racji że sam go tworzyłeś, w Windowsie domyślnie rozszerzenia są ukryte

Nie, oba pliki mają rozszerzenie php - mam wyświetlane pełne rozszerzenia, mam odznaczoną opcję ukrywania rozszerzeń znanych typów.

Cytat(Puszy @ 5.08.2015, 00:39:24 ) *
Dodam tylko że musisz czytać błędy. Jeżeli serwer zwraca Ci "No such file in..." to możesz być pewien że plik nienistnieje lub masz złą ścieżkę. Te błędy NIGDY się nie mylą (no w 99.99%, 0,01% to bugi)
Poczytaj też o ścieżce względnej i bezwzględnej

Zdaję sobie sprawę, że to mój błąd, a nie błąd programu lub kodu, tylko gdzie ten błąd popełniłem?
Struktura folderu jest następująca:
d:\PROJEKTY WWW\MZ - magazyn\wszystkie pliki z rozszerzeniem php i css, w tym index.php,
d:\PROJEKTY WWW\MZ - magazyn\module\tcpdf\wszystkie pliki z rozszerzeniem php, w tym tcpdf.php,
d:\PROJEKTY WWW\MZ - magazyn\module\tcpdf\lang\pol.php.
Gdzie tu się wkradł chochlik?
szakal

Ten post edytował kecajs 5.08.2015, 06:27:36
Go to the top of the page
+Quote Post
Puszy
post 6.08.2015, 08:57:09
Post #10





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


napisałem Ci żebyś zaincludował
module/tcpdf/config/lang/pol.php

a wg Ciebie plik jest w
module/tcpdf/lang/pol.php

Dodatkowo nie polecam używania spacji w nazwach plików i folderów.
Go to the top of the page
+Quote Post
kecajs
post 7.08.2015, 06:22:25
Post #11





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


Mój błąd :)
Mam jeszcze takie pytanie, dotyczące bezpośrednio tego projektu, jest krótkie i mam nadzieję, że Admini przymkną oko na to, że je zadam, mimo, że jest trochę otc, ale szkoda zakładać nowego wątku :)
Chodzi o to, że chcę zapisać ten dokument pdf jako kolejny protokół przygotowania. Następnie, po fizycznym uszykowaniu śrub magazynier powinien mieć możliwość ponownego otwarcia tego protokołu i uzupełnienia dwóch ostatnich kolumn (Data przygotowania i Ilość przygotowana) i wydrukować go ponownie już z tymi wartościami jako protokół wydania. Jest na tą pierwszą część mego pytania jakiś przebiegły sposób?
Na mojego nosa, to chyba najprościej byłoby zrobić, żeby przy wprowadzaniu zamówienia na poszczególne śruby (wprowadzam je pojedynczo) zaznaczyć, że jest to jedno zamówienie i wtedy w bazie zostanie automatycznie nadany numer zamówienia i przypisany będzie do wszystkich śrub z danego zamówienia. Następnie, w podglądzie zamówień miałbym ułożone zamówienia wg numeru zamówienia. Tak samo można byłoby wybierać - po numerze zamówienia - zamówienia do uzupełnienia i wydrukowania jako protokół wydania. Ma to sens? Zwłaszcza od strony zasad programowania, php i mysql? Nie mam jeszcze żadnego kodu, bo na razie szukam bardziej pomysłu...
szakal

Hej,
poprawiłem ścieżkę. Teraz nie pojawia się żaden komunikat, i nic się nie dzieje, tj. nie pojawia się okno wydruku. Znowu coś pomieszałem zapewne, tylko co i gdzie...
szakal
Go to the top of the page
+Quote Post
Puszy
post 7.08.2015, 10:40:00
Post #12





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Jeżeli przechowujesz dane w bazie to nie musisz przetrzymywać tego PDF, możesz zapisać kopię ot tak dla bezpieczeństwa. Ale żeby zrobić to co Ty chcesz musisz utworzyć formularz z produktami z listy i umożliwić pracownikowi wklepanie danych, zapisanie ich do bazy i ponowne wydrukowanie nowo wygenerowanego PDFa. Możesz przerobić istniejący skrypt, dorzuć te pola do bazy i je wyświetlaj, jeżeli będą puste to komórka będzie również pusta. Tylko musisz pamiętać że przy formularzach zawsze musisz założyć że użytkownik to idiota i dobrze zabezpieczyć kod. Fragmentu kodu gdzie dostajesz dane od człowieka są najbardziej narażone na błędy. Dodatkowo jężeli robisz to do pracy to pamiętaj o odpowiedzialności, źle napisany kod przez który dane będą zakłamane może sprowadzić na Ciebie problemy ze strony przełożonego. Śledzę temat więc staram Ci się pomagać w granicach mojego wolnego czasu. Jednak jeżeli chcesz możesz przedstawić sprawę dokładniej, wycenię projekt i zrobię go za Ciebie.

Nie wiem do końca co Twój skrypt ma wykonywać ale kojarzy mi się to z picklistą lub listą do inwentaryzacji

Co do samego kodu
  1. <?php
  2.  
  3. $TCPDF = new TCPDF('P', 'mm', 'A4');
  4. $TCPDF->setPrintFooter(false); // blokuje wyświetlanie stopki
  5. $TCPDF->setPrintHeader(false); // blokuje wyświetlanie nagłówka
  6. $TCPDF->AddPage(); // dodaje stronę
  7. $TCPDF->writeHTML($html, null, null, null, null, 'R'); // wpisuje wygenerowany HTML
  8. $TCPDF->Ln(10); // odstęp pionowy na 10 znaków
  9.  
  10. ?>


Powyższy fragment powoduje że wyświetla się PDF. Jeżeli dostajesz pustą stronę HTML to coś jest nie tak (genius tongue.gif). Jeżeli jest to pusty PDF to znaczy że zmienna $html nie zawiera HTMLa sprawdź var_dump()'em jaką zawiera wartość po skończeniu pętli. Dobrze by było gdybyś wysłał pełne drzewo projektu wtedy mógłbym Ci powiedzieć dokładnie jakie ścieżki zastosować i ewentualnie doradzić co robisz źle. Sprawdź też PDO, pozwala na bardziej humanitarną komunikację z bazą, piszesz troszkę więcej kodu ale wszystko jest logiczne i pozwala na bardziej zaawansowane operacje. Zamiast wykonywać konkretny SQL ze stringa jesteś w stanie np bindować elementy w dowolnym momencie etc. Jeszcze co do kodu w pracy. Przydałoby się to przerzucić na obiektówkę.

Ten post edytował Puszy 7.08.2015, 10:41:17
Go to the top of the page
+Quote Post
kecajs
post 7.08.2015, 11:03:00
Post #13





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


Kurczę, napisałeś tyle mądrych rzeczy, że nie wiem, za co się wziąć po kolei. Najbardziej jednak zastanawia mnie Twoje ostatnie zdanie - żeby przerzucić się na obiektówkę. Jakie rozwiązanie masz na myśli, czy bardziej myślisz o zmianie sposobu tworzenia kodu?
Co do Twojej propozycji, to podeślę n priv'a.
szakal
Go to the top of the page
+Quote Post
Puszy
post 7.08.2015, 11:05:40
Post #14





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Utworzyć sobie klasy, nawet jeżeli miałbyś programować w tak zwanym "obiektowo ale strukturalnie", to ułatwi Ci to pracę i porządkowanie skryptów. Masz więcej plików ale każdy odpowiada za konkretne zadanie, utworzyć funkcje które wykonują pojedyncze zadania a następnie je poukładać jak klocki.
Go to the top of the page
+Quote Post

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: 5.05.2025 - 05:54