Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zbyt długi czas oczekiwania i źle działająca funkcja szukania i katalog
Forum PHP.pl > Forum > Przedszkole
Rookie
Witam,
Chciałbym, aby na stronie głównej pokazywało się 5 ostatnich wpisów z tabeli, więc wykorzystałem taki kod:
  1. require('conn.php');
  2. $zapytanie="SELECT * FROM filmy";
  3. $temp=mysql_query($zapytanie) OR die("Wystąpił błąd");
  4. $ile=mysql_num_rows($temp);
  5. $sql=mysql_query("SELECT * FROM filmy ORDER BY id_filmu DESC LIMIT 5");
  6. $nr = 1;
  7. while ($nr <= $ile)
  8. {
  9. while($dane = mysql_fetch_assoc($sql)) {
  10. echo '
  11. <tr>
  12. <td valign="top" class="trescc">
  13. '.$nr.'
  14. </td>
  15. <td valign="top" class="trescc">
  16. '.$dane[tytul].'
  17. </td>
  18. <td valign="top" class="trescc">
  19. '.$dane[ilosc].'
  20. </td>
  21. <td valign="top" class="trescc">
  22. '.$dane[pochodzenie].'
  23. </td>
  24. <td valign="top" class="trescc">
  25. '.$dane[typ].'
  26. </td>
  27. <td valign="top" class="trescc">
  28. '.$dane[rodzaj].'
  29. </td>
  30. </tr>';
  31. $nr += 1;
  32. };}
  33.  

Wszystko działa normalnie, poza tym, że strona ładuje się kosmicznie długo, po czym wpisy ładnie się pokazują, a nad nimi taki komunikat:
Cytat
Fatal error: Maximum execution time of 30 seconds exceeded in C:\Documents and Settings\Moje dokumenty\HTML\FILMY\odczyt_idx.php on line 35

Tabela ma raptem 7 wpisów, więc co za problem wyświetlić od końca 5 ostatnich?
Co dopiero będzie kiedy w tabeli pojawią się wszystkie wpisy? (397)
W php.ini zmieniłem nawet na 1000 sec ale anulowałem po 10min oczekiwania.
Co mogę zrobić, aby to zapytanie było wykonywane jak trzeba? błyskawicznie.

Drugi problem to "szukajka", mam taki kod:
  1. <form action="search.php" method="GET">
  2. <fieldset style="width: 580px;">
  3. <legend>Szukaj</legend>
  4. <tr>
  5. <td><input type="text" name="szukaj" style="width: 350px;"></td>
  6. <td><input type="submit" value="Szukaj" name="search"></td>
  7. </tr>
  8. </table>
  9. </form>
  10.  

  1. <?php
  2. IF(isset($_GET['search'])) {
  3. $szukaj=mysql_real_escape_string(trim($_GET['szukaj']));
  4. $zapytanie="SELECT * FROM filmy WHERE tytul LIKE '%$szukaj%'";
  5. $temp=mysql_query($zapytanie) OR die("Wystąpił błąd");
  6. $ile=mysql_num_rows($temp);
  7. IF ($ile > 1) {
  8. $mysql=mysql_query("SELECT * FROM `filmy` WHERE `tytul` LIKE '%$szukaj%' ORDER by `tytul` ASC") OR die (mysql_error());
  9. $nr = 1;
  10. while ($nr <= $ile) {
  11. while($szukane = mysql_fetch_assoc($mysql)) {
  12. echo '
  13. <td valign="top" class="trescc">
  14. '.$nr.'
  15. </td>
  16. <td valign="top" class="trescc">
  17. '.$szukane[tytul].'
  18. </td>
  19. <td valign="top" class="trescc">
  20. '.$szukane[ilosc].'
  21. </td>
  22. <td valign="top" class="trescc">
  23. '.$szukane[pochodzenie].'
  24. </td>
  25. <td valign="top" class="trescc">
  26. '.$szukane[typ].'
  27. </td>
  28. <td valign="top" class="trescc">
  29. '.$szukane[rodzaj].'
  30. </td>
  31. </tr>';
  32. $nr += 1;
  33. }
  34. }
  35. ?>
  36.  

No i wszystko ładnie działa, gdy wpisze się co kolwiek związanego z harrym potterem, wtedy ów film magicznie pojawia się jak trzeba,
lecz gdy wpisze się czerwony październik, bądź przedwiośnie, to nie pokazuje się tak jak zapisałem w kodzie (tutaj chyba tego nie dałem), że nie znaleziono, tylko jest tak jakbym dopiero co otworzył stronę inaczej mówiąc, to, że w adresie jest dopisek
Kod
?szukaj=czerwony&search=szukaj
nic nie powoduje.
Dlaczego z harrym działa elegancko a z resztą nie?

I trzecie pytanie podobne do drugiego, mam również katalog, oto kod:
  1. <?php $katalog = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
  2. foreach (range('A', 'Z') as $litera) {
  3. echo "<h3 style=\"display: inline\"><a href=\"katalog.php?show=$litera\">$litera</a></h3> ";
  4. }
  5. $mysql=mysql_query("SELECT * FROM `filmy` WHERE `tytul` LIKE '$show%' ORDER by `tytul`") or die (mysql_error());
  6. $nr = 1;
  7. while ($nr <= $ile) {
  8. while($katalog = mysql_fetch_assoc($mysql)) {
  9. echo '
  10. <td valign="top" class="trescc">
  11. '.$nr.'
  12. </td>
  13. <td valign="top" class="trescc">
  14. '.$katalog[tytul].'
  15. </td>
  16. <td valign="top" class="trescc">
  17. '.$katalog[ilosc].'
  18. </td>
  19. <td valign="top" class="trescc">
  20. '.$katalog[pochodzenie].'
  21. </td>
  22. <td valign="top" class="trescc">
  23. '.$katalog[typ].'
  24. </td>
  25. <td valign="top" class="trescc">
  26. '.$katalog[rodzaj].'
  27. </td>
  28. </tr>';
  29. $nr += 1;
  30. }}
  31. ?>
  32.  

I tutaj również, po kliknięciu w "H", harry potter się objawia, ale po kliknięciu w "P", przedwiośnie już się nie pokazuje, zamiast tego widoczny jest tekst "Nie ma filmów na tą literę"
Dlaczego tak się dzieje?
Co mogę zrobić aby wszystko działało poprawnie?
Proszę o pomoc.
Z góry dziękuję.
Pozdrawiam.
erix
Cytat
Wszystko działa normalnie, poza tym, że strona ładuje się kosmicznie długo, po czym wpisy ładnie się pokazują, a nad nimi taki komunikat:

A w ogóle masz indeksy w bazie?
Rookie
Wszystko w bazie jest jak należy, chyba, że te indexy to jest coś o czym nie wiem jeszcze ;p, mógłbyś mi wyjaśnić łopatologiczniej o jakie indexy chodzi?
erix
A pryszcz gdzieś wyskoczy, jeśli najpierw pogooglasz...? :|
Rookie
No więc skoro sortuję od końca po `id_filmu`:
  1. SELECT * FROM filmy ORDER BY id_filmu DESC LIMIT 5

to id_filmu zrobiłem indexem, ale nadal wczytywanie trwa kosmicznie długo, na innej podstronie mam taki sposób:
  1. SELECT * FROM filmy ORDER BY tytul

i wyświetla wszystko błyskawicznie.
A co z szukaniem i katalogiem?
thek
Co do szukania to niepotrzebnie dwa razy robisz to samo zapytanie.
  1. SELECT * FROM filmy WHERE tytul LIKE '%$szukaj%'

  1. SELECT * FROM `filmy` WHERE `tytul` LIKE '%$szukaj%' ORDER BY `tytul` ASC
robią dokładnie to samo, tyle że drugie jest posortowane, a używanie LIKE ostro po bazie Ci jedzie, co już na dzień dobry wydłuża działanie skryptu. Możesz od razu użyć drugiego. W obu skryptach jest ten niepotrzebny narzut.
Inna sprawa, że niepotrzebnie robisz dwukrotnie pętlę while. W zupełności możesz wywalić ilość rekordów jeśli nie robisz wyświetlania na kilku stronach. W Twoim wypadku dla id filmu już samo użycie:
  1. while($row = mysql_fetch_array($sql) ) {
  2. róbta tu co chceta z wyświetlaniem
  3. }
da pożądane efekty. Ale jeśli już koniecznie chcesz licznik wierszy(numeracja) to przed while wrzuć zmienną którą wewnątrz while będziesz inkrementował czyli:
  1. $licznik = 1;
  2. while($row = mysql_fetch_array($sql) ) {
  3. róbta tu co chceta z wyświetlaniem;
  4. $licznik++;
  5. }

Co do szukania to winą możesz zapewne obarczyć polskie znaki diakrytyczne. W metodzie GET mogą sprawiać problemy.
A gdy mowa o katalogu to skąd zapytanie ma rozpoznać co przechowuje zmienna $show? Nigdzie nie widać w kodzie jakiegokolwiek pobierania, czyszczenia czy przypisywania do zmiennej $show zmiennej z tablicy GET winksmiley.jpg
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.