Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][MSSQL][PHP]Wiele formularzy na stronie
Forum PHP.pl > Forum > Przedszkole
krzesik
Podczas wysłania danych poprzez forma w celu uzyskania dalszych informacji w kolejnych polach, wysyła mi wszystko generując plik, a tego nie chcę. W jaki sposób rozwiązać to inaczej?

  1. ........
  2.  
  3. <form name="parametry" form action="pdf.php" target="_blank" method="post">
  4. <p><input type="submit" value="Generuj PDF" onclick="submit(); window.close();" /></p>
  5.  
  6.  
  7. <b><font size="4px">Parametry wydruku </b></font><br /><br />
  8. <table width="100%" border="1">
  9. <tr>
  10. <th align="center">Czy drukować:</th>
  11. </tr>
  12. <tr>
  13. <td valign="top">
  14. <label><input type=checkbox name="okladka" value="okladka" />&nbsp;&nbsp;Strona tytułowa</b></label><br />
  15. <label><input type=checkbox name="numeracja" readonly disabled checked="checked" value="numeracja" />&nbsp;&nbsp;Numeracja stron</b></label><br />
  16. </td>
  17. </tr>
  18. <?php
  19. //tutaj wrzuciłem forma do forma, ale chyba tak nie wolno.........
  20. echo '<form name="aaaa" action="" method="post">';
  21. echo 'od: <select name="start" onchange="this.form.submit()">';
  22. echo '<tr><td>';
  23.  
  24. for($i = $od; $i <= $max; $i++) {
  25. echo '<option value="'.$i.'">'.$i.'</option>';
  26. }
  27. echo '</select>';
  28. echo 'do: <select name="stop">';
  29.  
  30. for($i = $od; $i <= $do && $i <= $max; $i++) {
  31. echo '<option value="'.$i.'">'.$i.'</option>';
  32. }
  33. echo '</select></td>';
  34.  
  35. ?>
  36. </tr></form>
  37. </table>
  38. </form>

zastanawiałem się nad użyciem do tego java-scrip, może Ajax - ale nie wiem jak się do tego zabrać. Proszę o podpowiedź.
ilidir
Jak rozumiem chcesz aby po zaznaczeniu na przykład okładka i naciśnięciu klawisza pojawiała się nastepna część formularza z wypełnionymi jakimiś polami questionmark.gifquestionmark.gifquestionmark.gif? Jeżeli dobrze rozumiem smile.gif Ajaxem przechwytujesz wartość wyboru i przekazujesz to innej częściformularza bez przeładowywania strony.

Polecam do tego użycia Ajaxa a pozatym nie wiem czy to jest cały kod czy mi się nie rzuciło w oczy sad.gif nie widzę przechwytywania wartości które zaznaczasz questionmark.gifquestionmark.gifquestionmark.gif

pozdrawiam
krzesik
Nie to nie jest kompletny kod, wysyłane dane przechwytuję wcześniej, więc tak:

mam formularz w którym sa checkboxy, które można zaznaczyć lub nie - form jeszcze się nie wysyła
poniżej mam dwa select (od strony do strony) - to właśnie w tym miejscu w pierwszym selekcie wywołuję zdarzenie:onchange="this.form.submit()"
w wyniku którego w odpowiedni sposób wypełnia mi się drugi selekt (chodzi o to aby user nie chciał wydrukować np. od str 7 do str. 2, ani też nie mógł wydrukować więcej niż 10 stron)
po wywołaniu onchange wysyła mi się wszystko generując plik pdf, a to chciałbym aby wykonywało się wyłącznie po kliknięciu w button Generuj PDF
b4rt3kk
Cytat(krzesik @ 20.02.2015, 14:22:13 ) *
Nie to nie jest kompletny kod, wysyłane dane przechwytuję wcześniej, więc tak:

mam formularz w którym sa checkboxy, które można zaznaczyć lub nie - form jeszcze się nie wysyła
poniżej mam dwa select (od strony do strony) - to właśnie w tym miejscu w pierwszym selekcie wywołuję zdarzenie:onchange="this.form.submit()"
w wyniku którego w odpowiedni sposób wypełnia mi się drugi selekt (chodzi o to aby user nie chciał wydrukować np. od str 7 do str. 2, ani też nie mógł wydrukować więcej niż 10 stron)
po wywołaniu onchange wysyła mi się wszystko generując plik pdf, a to chciałbym aby wykonywało się wyłącznie po kliknięciu w button Generuj PDF


To wywal onchange="this.form.submit()"
krzesik
ok, ale wtedy w drugim selekcie nie będę miał właściwych wartości....
b4rt3kk
Cytat(krzesik @ 20.02.2015, 14:42:21 ) *
ok, ale wtedy w drugim selekcie nie będę miał właściwych wartości....


Oczywiście najgorszym rozwiązaniem w tym przypadku będzie przechwycenie w JS submita dla tego formularza, który ma się nie submitować i po prostu zwrócić false.

Ale generalnie (wg mnie oczywiście) Twój kod jest źle pomyślany. I form w form jest bez sensu.

Przedstaw jakiś przykład użycia, krok po kroku, co user wpisuje, gdzie wpisuje, co oznacza ten select, a ten, itd. to może uda się znaleźć optymalne rozwiązanie problemu.

Jeszcze jedno. Jest to do zrealizowania bez najmniejszego problemu w czystym php. Przykład:

  1. if ($_POST['stop'] - $_POST['start'] > 10) {
  2. echo 'Blad: Zbyt duzy zakres stron!!!';
  3. // wyswietlenie ponowne formularza - najlepiej z uzupelnionymi danymi inputow, selectow, itd. nikt nie lubi jak mu caly form wyczysci jak jakis blad popelni przy wprowadzaniu danych
  4. } else {
  5. // generowanie pliku
  6. }
krzesik
OK, potzrebuję generować plik PDF, zawartość pliku nie jest skomplikowana, ale jednak podczas tworzenia wymaga tyle pamięci, że klęka mów serwer (dzierżawa u jedengo z dostawców na rynku), więc wpadłem na pomysł że jeśli nie mogę generować kompletnego pliku, to "zmuszę" usera do generowania wskazanej przezemnie maksymalnej ilości stron (wybrałem 10), chcę również unikąć sytuacji, że user źle wpisze numery drukowanych stron, stąd:
pierwszy selekt wyświetla ilość stron na których zawiera się wspomniana tabelka, user wybiera od której strony chce drukować (bo może już wcześniej coś drukował), po wyborze drugi selekt przyjmuje wartość pierwszego pokazując zarazem kolejne strony (większe o 10 lub do ostatniej), wtedy klikamy na generuj PDF.
uffff, ale tak to sobie wymyśliłem, jak coś do kitu to przyjmuję "na klatę"! ;-)
b4rt3kk
Cytat(krzesik @ 20.02.2015, 15:07:44 ) *
OK, potzrebuję generować plik PDF, zawartość pliku nie jest skomplikowana, ale jednak podczas tworzenia wymaga tyle pamięci, że klęka mów serwer (dzierżawa u jedengo z dostawców na rynku), więc wpadłem na pomysł że jeśli nie mogę generować kompletnego pliku, to "zmuszę" usera do generowania wskazanej przezemnie maksymalnej ilości stron (wybrałem 10), chcę również unikąć sytuacji, że user źle wpisze numery drukowanych stron, stąd:
pierwszy selekt wyświetla ilość stron na których zawiera się wspomniana tabelka, user wybiera od której strony chce drukować (bo może już wcześniej coś drukował), po wyborze drugi selekt przyjmuje wartość pierwszego pokazując zarazem kolejne strony (większe o 10 lub do ostatniej), wtedy klikamy na generuj PDF.
uffff, ale tak to sobie wymyśliłem, jak coś do kitu to przyjmuję "na klatę"! ;-)


Patrzyłeś dlaczego serwer nie wyrabia? Co jest treścią tego pliku PDF? Rekordy z bazy? Nie wyrabia dlatego, że pobierasz ich zbyt wiele na raz? Jeśli tak, to problem jest prozaiczny, bo wystarczy generować takowy plik pdf odpowiednio mniejszymi partiami, np.:

  1. $con = new stdClass(); // jakiś tam handler dla bazy danych, nie chce mi się rozpisywać wszystkiego szczegółowo
  2. $pdf = new stdClass(); // j.w.
  3. $query = "SELECT * FROM tabela LIMIT :limit, :offset;";
  4. $limit = 100;
  5. $offset = 0;
  6.  
  7. while (($data = $con->query($query, array(':limit' => $limit, ':offset' => $offset)) !== false) {
  8. $pdf->addPage($data);
  9. $offset += $limit;
  10. }


Tym sposobem mniej pamięci będziesz używał niż pobierając wszystkie wyniki.

W przypadku tych selectów nie potrzebujesz submita formularza, tylko w js wygenerować zawartość drugiego, na podstawie wybranej wartości pierwszego (bez przeładowania).
krzesik
Plik pdf generuję w poniższy sposób, ale niestety nie wiem jak zastosować to co mi napisałeś.... :-(
  1.  
  2. <?php
  3. include 'config.php';
  4. $tabelawynik = mysql_query(select * from tabela) or die('Queryproblem: '.mysql_error());
  5.  
  6. require ('mpdf/mpdf.php');
  7. $mpdf=new mPDF('', 'A4-L');
  8. $mpdf->simpleTables = true;
  9. $mpdf->allow_charset_conversion=true;
  10. $mpdf->charset_in='UTF-8';
  11. $naglowek = '
  12. <head>
  13. <style type="text/css">
  14. table
  15. {
  16. border-collapse:collapse;
  17. }
  18.  
  19. table td
  20. {
  21. border-collapse:collapse;
  22. font-size:70%;
  23. }
  24. table th
  25. {
  26. border-collapse:collapse;
  27. font-size:70%;
  28. }
  29. </style>
  30. </head>
  31. ';
  32.  
  33. $naglowek .='
  34. <p align="right"><font size="1">
  35. Strona nr: <b>'.$_SESSION[numerstrony].'</b></font></p><br />
  36.  
  37. <table width="100%" border="1">';
  38.  
  39.  
  40.  
  41. $naglowek .='
  42. <tr>
  43. <th align=center>L.p.</th>
  44. <th align=center>Imię i Nazwisko</th>
  45. <th>Numer</th>
  46. <th>Miejsce</th>
  47. <th>Data</th>
  48. <th>Podpis</th>
  49. <th>Data</th>
  50. <th colspan="3">Ilość</th>
  51. <th>Podpis</th>
  52. </tr>';
  53.  
  54. $lp = $_SESSION['rekord'];
  55.  
  56.  
  57.  
  58. while($r = mysql_fetch_array($tabelawynik) )
  59. {
  60. $lp++;
  61. $naglowek .= '
  62.  
  63. <tr>
  64. <td align="center"> '.$lp.'</td>
  65. <td align="left"> '.$r[imie_nazwisko].'</td>
  66. <td align="center"> '.$r[nr].'</td>
  67. <td align="center"> '.$r[miejsce].'</td>
  68. <td align="center"> '.$r[start].' </td>
  69. <td align="left"> '.$r[login].'</td>
  70. <td align="center"> '.$r[end].' </td>
  71. <td width="100" align="center"> '.$r[typ].'</td>
  72. <td align="center"> '.$r[ilosc].'</td>
  73. <td align="left"> '.$r[ilosc1].'</td>
  74. <td align="left"> '.$r[login].'</td>
  75. </tr>';
  76.  
  77. }
  78. $naglowek .= '
  79.  
  80. </table>';
  81.  
  82. if(!empty($okladka)){
  83.  
  84. $stronatytulowa = '
  85.  
  86. <table width="100%">
  87. <tr>
  88. <th align="center"><font size="6"><b>TABELA</b></font><br /><br /></th>
  89. </tr>
  90. <tr>
  91. <td align="center"><br /><br /><br />
  92. <font size="3"><br /></font></td></tr>
  93. <tr>
  94. <td align="center">
  95. <font size="5"><b>'.$u[nazwa].'</b></font></td>
  96. </tr>
  97. <tr><br /><br />
  98. <td align="center">
  99. <font size="4">MIEJSCE</b></font></td>
  100. </tr>
  101. <tr>
  102. <td align="left"><br /><br /><br />
  103. <font size="3">
  104. a: <b>'.$oo[zl].'</b><br /><br />
  105. b: <b>'.$oo[powiat].'</b><br /><br/>
  106. c: <b>'.$oo[nd].'</b><br /></font>
  107. <br /><br /></td></tr>
  108. <tr><br />
  109. <td align="left"><font size="3"></font>
  110. </td></tr>
  111. <tr>
  112. <td><font size="3">KOD</font></td>
  113. </tr>
  114. <tr><td align="center"><br /><br /><br /><br />
  115. ................................................................................
    ...............................................<br /><br /><br />
  116. </td>
  117. </tr>
  118. <tr><td align="center">
  119. ................................................................................
    ...............................................<br /><br /><br />
  120. </td>
  121. </tr>
  122. <tr><td align="center">
  123. ................................................................................
    ...............................................<br /><br /><br />
  124. </td>
  125. </tr>
  126. <tr><td align="center">
  127. ................................................................................
    ...............................................<br /><br /><br />
  128. </td>
  129. </tr>
  130. <tr><td align="center">
  131. ................................................................................
    ...............................................<br /><br /><br />
  132. </td>
  133. </tr>
  134. <tr><td align="center">
  135. ................................................................................
    ...............................................<br /><br /><br />
  136. </td>
  137. </tr>
  138. <tr><td align="center">
  139. ................................................................................
    ...............................................<br /><br /><br />
  140. </td>
  141. </tr>
  142.  
  143. </table><br /><br />
  144. <style type="text/css">
  145. page-break-before {always}
  146. </style>
  147. ';
  148. }
  149.  
  150.  
  151.  
  152.  
  153.  
  154. $naglowek .='
  155.  
  156. </body></html>';
  157.  
  158.  
  159.  
  160. $wynik = $stronatytulowa.$naglowek;
  161.  
  162. $mpdf->WriteHTML($wynik);
  163. $mpdf->Output('raport.pdf', 'D');
  164.  
  165. ?>
b4rt3kk
Cytat(krzesik @ 20.02.2015, 18:21:37 ) *
Plik pdf generuję w poniższy sposób, ale niestety nie wiem jak zastosować to co mi napisałeś.... :-(
  1.  
  2. <?php
  3. include 'config.php';
  4. $tabelawynik = mysql_query(select * from tabela) or die('Queryproblem: '.mysql_error());
  5.  
  6. require ('mpdf/mpdf.php');
  7. $mpdf=new mPDF('', 'A4-L');
  8. $mpdf->simpleTables = true;
  9. $mpdf->allow_charset_conversion=true;
  10. $mpdf->charset_in='UTF-8';
  11. $naglowek = '
  12. <head>
  13. <style type="text/css">
  14. table
  15. {
  16. border-collapse:collapse;
  17. }
  18.  
  19. table td
  20. {
  21. border-collapse:collapse;
  22. font-size:70%;
  23. }
  24. table th
  25. {
  26. border-collapse:collapse;
  27. font-size:70%;
  28. }
  29. </style>
  30. </head>
  31. ';
  32.  
  33. $naglowek .='
  34. <p align="right"><font size="1">
  35. Strona nr: <b>'.$_SESSION[numerstrony].'</b></font></p><br />
  36.  
  37. <table width="100%" border="1">';
  38.  
  39.  
  40.  
  41. $naglowek .='
  42. <tr>
  43. <th align=center>L.p.</th>
  44. <th align=center>Imię i Nazwisko</th>
  45. <th>Numer</th>
  46. <th>Miejsce</th>
  47. <th>Data</th>
  48. <th>Podpis</th>
  49. <th>Data</th>
  50. <th colspan="3">Ilość</th>
  51. <th>Podpis</th>
  52. </tr>';
  53.  
  54. $lp = $_SESSION['rekord'];
  55.  
  56.  
  57.  
  58. while($r = mysql_fetch_array($tabelawynik) )
  59. {
  60. $lp++;
  61. $naglowek .= '
  62.  
  63. <tr>
  64. <td align="center"> '.$lp.'</td>
  65. <td align="left"> '.$r[imie_nazwisko].'</td>
  66. <td align="center"> '.$r[nr].'</td>
  67. <td align="center"> '.$r[miejsce].'</td>
  68. <td align="center"> '.$r[start].' </td>
  69. <td align="left"> '.$r[login].'</td>
  70. <td align="center"> '.$r[end].' </td>
  71. <td width="100" align="center"> '.$r[typ].'</td>
  72. <td align="center"> '.$r[ilosc].'</td>
  73. <td align="left"> '.$r[ilosc1].'</td>
  74. <td align="left"> '.$r[login].'</td>
  75. </tr>';
  76.  
  77. }
  78. $naglowek .= '
  79.  
  80. </table>';
  81.  
  82. if(!empty($okladka)){
  83.  
  84. $stronatytulowa = '
  85.  
  86. <table width="100%">
  87. <tr>
  88. <th align="center"><font size="6"><b>TABELA</b></font><br /><br /></th>
  89. </tr>
  90. <tr>
  91. <td align="center"><br /><br /><br />
  92. <font size="3"><br /></font></td></tr>
  93. <tr>
  94. <td align="center">
  95. <font size="5"><b>'.$u[nazwa].'</b></font></td>
  96. </tr>
  97. <tr><br /><br />
  98. <td align="center">
  99. <font size="4">MIEJSCE</b></font></td>
  100. </tr>
  101. <tr>
  102. <td align="left"><br /><br /><br />
  103. <font size="3">
  104. a: <b>'.$oo[zl].'</b><br /><br />
  105. b: <b>'.$oo[powiat].'</b><br /><br/>
  106. c: <b>'.$oo[nd].'</b><br /></font>
  107. <br /><br /></td></tr>
  108. <tr><br />
  109. <td align="left"><font size="3"></font>
  110. </td></tr>
  111. <tr>
  112. <td><font size="3">KOD</font></td>
  113. </tr>
  114. <tr><td align="center"><br /><br /><br /><br />
  115. ................................................................................
    ...............................................<br /><br /><br />
  116. </td>
  117. </tr>
  118. <tr><td align="center">
  119. ................................................................................
    ...............................................<br /><br /><br />
  120. </td>
  121. </tr>
  122. <tr><td align="center">
  123. ................................................................................
    ...............................................<br /><br /><br />
  124. </td>
  125. </tr>
  126. <tr><td align="center">
  127. ................................................................................
    ...............................................<br /><br /><br />
  128. </td>
  129. </tr>
  130. <tr><td align="center">
  131. ................................................................................
    ...............................................<br /><br /><br />
  132. </td>
  133. </tr>
  134. <tr><td align="center">
  135. ................................................................................
    ...............................................<br /><br /><br />
  136. </td>
  137. </tr>
  138. <tr><td align="center">
  139. ................................................................................
    ...............................................<br /><br /><br />
  140. </td>
  141. </tr>
  142.  
  143. </table><br /><br />
  144. <style type="text/css">
  145. page-break-before {always}
  146. </style>
  147. ';
  148. }
  149.  
  150.  
  151.  
  152.  
  153.  
  154. $naglowek .='
  155.  
  156. </body></html>';
  157.  
  158.  
  159.  
  160. $wynik = $stronatytulowa.$naglowek;
  161.  
  162. $mpdf->WriteHTML($wynik);
  163. $mpdf->Output('raport.pdf', 'D');
  164.  
  165. ?>


Prosiłem, żebyś podał przyczynę przekroczenia zasobów serwera, bez tego ciężko będzie Ci pomóc. Czy wina leży po stronie zapytania, czy też kodu? Musisz to wiedzieć, zanim przystąpisz do optymalizacji. Podaj jakieś konkretne dane.

Zazwyczaj skrypt wysypuje się, bo serwer musi trzymać zbyt wiele danych w pamięci, na o prostą receptą jest podzielenie dużej tablicy na mniejszą, tak jak wskazałem Ci kilka postów wyżej i tak jak próbujesz to zrobić z podziałem na x stron.
krzesik
Cytat(b4rt3kk @ 21.02.2015, 03:01:17 ) *
Prosiłem, żebyś podał przyczynę przekroczenia zasobów serwera, bez tego ciężko będzie Ci pomóc. Czy wina leży po stronie zapytania, czy też kodu? Musisz to wiedzieć, zanim przystąpisz do optymalizacji. Podaj jakieś konkretne dane.

Zazwyczaj skrypt wysypuje się, bo serwer musi trzymać zbyt wiele danych w pamięci, na o prostą receptą jest podzielenie dużej tablicy na mniejszą, tak jak wskazałem Ci kilka postów wyżej i tak jak próbujesz to zrobić z podziałem na x stron.


Jeśli generuję PDF który ma mniej niż 12 stron to jest wszystko ok, ale jeśli ma więcej to wywala błąd HTTP 500, kontaktowałem się z hostingodawcą, sprawdzili co się dzieje i otrzymałem odpowiedź jednoznaczną, przekraczam zadane parametry serwera.
Reasumując:
Aby zmniejszyć ilość wykorzystywanej pamięci wystarczy jak podzielę całość zapytania na kilka części stosując parametr LIMIT? Później sklejam wszystkie powstałe strony do jednego PDF?
robertpiaty
Dodatkowo nie rób w zapytaniu select * ... Bo jesłi masz dużo kolumn, a korzystasz tylko z kilku, to nie ma sensu zapychać pamięci serwera pozostałą ilością danych których i tak nie potrzebujesz.
b4rt3kk
Cytat(krzesik @ 21.02.2015, 14:49:22 ) *
Jeśli generuję PDF który ma mniej niż 12 stron to jest wszystko ok, ale jeśli ma więcej to wywala błąd HTTP 500, kontaktowałem się z hostingodawcą, sprawdzili co się dzieje i otrzymałem odpowiedź jednoznaczną, przekraczam zadane parametry serwera.
Reasumując:
Aby zmniejszyć ilość wykorzystywanej pamięci wystarczy jak podzielę całość zapytania na kilka części stosując parametr LIMIT? Później sklejam wszystkie powstałe strony do jednego PDF?


Tak, powinno pomóc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.