Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: losowe wybieranie rekordów w połączeniu ze sprawdzaniem plików
Forum PHP.pl > Forum > Bazy danych
Arek00
mam tabelę w której pierwsza kolumna to identyfikatory. w jednym z folderów są pliki o nazwach takich jak te identyfikatory, z tym że nie dla każdego wpisu w bazie jest taki plik. chciałbym terez wybierać losowo 3 wpisy dla których istnieje ten plik, na razie przyszło mi do głowy coś takiego (kod na razie tylko teoretyczny, nie sprawdzałem go)
  1. <?php
  2. $zapytanie = db_query("SELECT * FROM tabela ORDER BY rand()");
  3.  while ($zapytanie2 = db_fetch_array($zapytanie) && $i<=3){
  4. $zdjecie = "fotki/" . $zapytanie2['indeks'] . ".jpg";
  5. if (file_exists($zdjecie)){
  6.  echo $zapytanie2['nazwa'] . "<br>";
  7.  echo $zapytanie2['opis'] . "<br>";
  8.  echo "<img src=" . $zdjecie . "><br><br>";
  9.  $i++;
  10. }
  11.  }
  12. ?>

tutaj najpierw wybieram wszystkie rekordy i potem dopiero sprawdzam po kolei czy istnieje plik. czy da się to zrobić jakoś prościej tak żeby nie wykonywać tylu pętli?
nospor
Cytat
żeby nie wykonywać tylu pętli?
petle wykonujesz tylko jedna anie "tyle" smile.gif
No niestety skoro masz taka strukture, ze to co w bazie nie zgadza sie z tym co w katalogu no to nie ma bata, musisz robic tak jak robisz.
kszychu
A może zrobić jedną tablicę z plikami, drugą z danymi z bazy i znaleźć część wspólną?
Arek00
Cytat(kszychu @ 5.06.2006, 12:38 ) *
A może zrobić jedną tablicę z plikami, drugą z danymi z bazy i znaleźć część wspólną?

rozumiem że chodzi ci o jedną tablicę z indeksem a drugą z indeksem, nazwą i opisem?
w tej chwili wpisów w tabeli jest ok 1800 a fotek ok 1300 więc wydaje mi się że takie rozwiązanie będzie mniej efektywne od mojego no i myślę że to będzie bardziej skomplikowane. mój skrypt nie musi zawsze przerabiać tyle danych i w najlepszym przypadku może zakończyć działanie już po trzecim wykonaniu pętli

(co wcale nie znaczy że mam rację bo niekoniecznie się na tym znam)
nospor
a czy nie moglbys zsynchronizowac tych danych? napisz skrypt co przeleci po bazie, sprawdzi czy sa dane pliki i jak nie ma to kasuje wpis z bazy lub ustawia odpowiednie pole na null. a potem do losowania to juz tylko po bazie lecisz. Wydaje sie, ze w tej chwili jest sytuacja troche nie teges, ze ci sie dane tak roznia i tak raczej byc nie powinno
Arek00
Cytat(nospor @ 5.06.2006, 13:16 ) *
a czy nie moglbys zsynchronizowac tych danych? napisz skrypt co przeleci po bazie, sprawdzi czy sa dane pliki i jak nie ma to kasuje wpis z bazy lub ustawia odpowiednie pole na null. a potem do losowania to juz tylko po bazie lecisz. Wydaje sie, ze w tej chwili jest sytuacja troche nie teges, ze ci sie dane tak roznia i tak raczej byc nie powinno

nie rozpisując się i nie wnikając w szczegóły: powinno być tak jak teraz
nospor
jesli bys znalazl chwilke to moglbys sie rozpisac, ja sie nie pogniewam smile.gif powaznie mowie, interesuje mnie sytuacja, w ktorej powinna byc nie spojnosc danych. chcialbym to zrozumiec, bo teraz tego nie rozumiem.
Skoro nie ma jakiegos pliku, a baza wskazuje ze powinien byc, to w bazie powinno byc jakies pole, ktore mowi ze jednak tego pliku nie ma, badz tez poprostu powinien byc null w nazwie pliku.
Arek00
plikiem jest fotka. w bazie mam wpisany cennik i w innej tabeli są opisy produktów. jeżeli fotka o danym indeksie istnieje to na stronie w opisie produktu jest wyświetlana a jak nie to nie. w tej chwili chciałbym sobie wyświetlić losowo trzy produkty ale spośród tych które posiadają fotki
nospor
ok. a wiec moim zdaniem masz zle zaprojektowany system do zarzadzania. W jaki sposob zapodajesz fotki dla produktu? Recznie wrzucasz na serwer? Bo wyglada ze tak. Bo gdyby to bylo robione z poziomu aplikacji, to aplikacja by wiedziala czy jest fotka czy nie. Bo to przez nia bys wowczas uploadowal fotke dla produktu, badz tez usuwal. Na tej podstawie aplikacja by zaznaczala dla produktu czy jest fotka czy nie. a potem wyswietlanie losowych zdjec ograniczylo by sie tylko do bazy i znacznie by przyspieszylo proces
Arek00
rozpisując się dalej: w opisie produktów mam kolumnę z adresami fotek ale tylko jeśli pobierane są z zewnętrznego serwera. najpierw sprawdzam czy fotka ma być z innego serwera, jeśli nie to sprawdzam czy mam ją u siebie a jeśli nie to nie wyświetlam jej. w tej chwili pomyślałem że jeśli fotkę mam u siebie to wpisuję ją w miejsce tej z serwera ale znów będę miał dwa rodzaje wpisów (jeden to sam indeks (typu KOMP1234) gdy fotka jest u mnie a drugi to np. serwer.com/komputery/komputer.jpg). identyfikacja wpisu nie byłaby problemem ale w ten sposób ładowałbym dane do bazy a staram się to ograniczać. muszę się jeszcze nad tym zastanowić.

w tej chwili moje zapytanie kończy się na LIMIT 20 a sama pętla jest wykonywana najczęściej 5 razy (maks było 14). generalnie gdy w szczególnym wypadku wyświetlą mi się dwa produkty zamiast trzech to nie będzie to problemem.

zarówno fotki (przez ftp) jak i opisy (przez csv) wrzucam ręcznie bo jest mi wygodniej i szybciej
nospor
No to troche inaczej to teraz wyglada. Jak ci pasuje, no to czemu nie smile.gif

Ale gdyby tak pogdybac jeszcze troche, to mozna by walnac dwa pola. jedno wskazuje na plik na zewnetrzym serwerze, drugie na lokalnym. nie musisz sie wowczas bawic w analize. ale chyba teraz tak wlasnie masz, albo nie zrozumialem dokladnie. No nic. jesli oba pola beda null, znaczy ze fotki nie ma.

Cytat
zarówno fotki (przez ftp) jak i opisy (przez csv) wrzucam ręcznie bo jest mi wygodniej i szybciej
Masz racje - wygodniej i szybciej. tylko ma to wlasnie te wade, ze jest niespojnosc danych. Ale i na to mozna zaradzic. Dopisz dodatkowy skrypt co mowilem wczesniej, niech on sprawdza czy dane sie pokrywaja i uaktualnia dane w bazie. Skrypcik ten mozesz zapuszczac po swoich recznych zmianach.

Podsumowujac: Jesli fakt niespojnosci danych nie wplywa na wydajnosc i ci to pasuje no to git. Jesli jednak do wyswietlenia 3 fotek, ty musisz mimo wszystko pobierac z bazy wszystkie dane, to troche nie tak jest. Oczywisicie Twoj sposob optymalizacji polegajacy na pobraniu 20 fotek wydaje sie dobry pod warunkiem ze faktycznie ta trafnosc bedzie taka jak mowiles.
Arek00
mam jedną kolumnę w której może być (ale nie musi) adres do fotki z zewnętrznego serwera.

pomijając chwilowo skrypt o którym mowa, wyświetlanie fotki do opisu produktu wygląda tak:

1. sprawdzam czy jest coś w tym polu, jeśli tak to wyświetlam tą fotkę
2. jeżeli to pole jest puste to sprawdzam czy mam plik na dysku i wyświetlam fotkę
3. jeśli w obu przypadkach nie mam nic to nie wyświetlam fotki

idąc twoim sposobem:

1. sprawdzam pierwsze pole - jeśli coś jest wyświetlam fotkę
2. jeżeli pierwsze pole jest puste to sprawdzam drugie pole - jeśli coś jest wyświetlam fotkę
3. jeśli w obu nic nie ma nie wyświetlam nic

jaka jest różnica pomiędzy tymi sposobami? mowa jest o fotce w opisie pojedyńczego produktu czyli to zapytanie nie jest aż tak mocno wykorzystywane. w tej chwili dla mnie różnica to dodatkowe dane w bazie danych w formie drugiej kolumny z indeksami fotek

z drugiej strony (i na to się teraz nastawiam) każdy nowy produkt który wstawiam jest już z fotką u mnie więc fotki z obcego serwera są powoli wypierane. w takim razie mógłbym zostawić jedną kolumnę i wpisywać do niej nazwy fotek lub biorąc pod uwagę że nazwa jest taka jak indeks produktu to wystarczyłoby wtedy wpisywać np. 'x' gdy produkt posiada fotkę i wtedy zrobienie skryptu którym zacząłem post było by bardzo proste. natomiast minusem tego rozwiązania było by to że gdybym sobie przypadkiem skasował jakąś fotkę (z dysku) to na stronie będzie wyświetlany jej brak (generowany przez przeglądarkę) no ale to już można okresowo sprawdzać jakimś skryptem czy 'x' z bazy pokrywa się z tym co jest na dysku. kolejnym minusem będzie to że w tej chwili gdy nie mam fotki i chce ją dodać to poprostu wrzucam ją do odpowiedniego katalogu a w tym (lub twoim) rozwiązaniu musiałbym dodatkowo pamiętać żeby wstawiać 'x' do bazy danych
póki co muszę sobie jakoś sprawdzić ile jeszcze fotek jest pobieranych z zewnętrznego serwera, jeśli niewiele to zabieram się za zmiany skryptów...
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.