Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja php
Forum PHP.pl > Forum > PHP
gandziorz
Witam,
Napisałem pewną funkcję do użycia w szablonie smarty.
Jeżeli w szablonie użyję $settings.costam to pokaże mi dane z "value" gdzie "name" to costam.

Baza sql:
  1. CREATE TABLE settings (
  2. `id` bigint(5) NOT NULL AUTO_INCREMENT,
  3. `name` text,
  4. `value` text,
  5. PRIMARY KEY (id)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Funkcja w php:
  1. <?php
  2. $settings = array();
  3. $query = "SELECT * FROM ".$DB['db_prefix']."settings";
  4. $result = @mysql_query($query);
  5. while ($row = mysql_fetch_assoc($result)) {
  6. $settings[$row['name']] = $row['value'];
  7. }
  8. $smarty->assign('settings', $settings);
  9. ?>


Chodzi o to że przy dużej ilości danych ta funkcja jest niezbyt przyjazna.
Ponieważ pobiera wszystkie dane a nie te które potrzebuję.

Jakiś pomysł ktoś ma?
wookieb
Czy ja wiem... Raz mozesz sciagnac wszystkie ustawienia. Zapisac do tablicy z odpowiednimi kluczami i potem te ustawienia odczytiwac z tablicy.
SirZooro
Możesz raz zapisać konfigurację do pliku (zaraz po jej modyfikacji) i potem je z niego czytać - poczytaj sobie o funkcjach serialize i unserialize.
luck
Cytat(gandziorz @ 24.08.2008, 20:29:38 ) *
Chodzi o to że przy dużej ilości danych ta funkcja jest niezbyt przyjazna.
Ponieważ pobiera wszystkie dane a nie te które potrzebuję.

Jakiś pomysł ktoś ma?

No to zmodyfikuj funkcję tak, by pobierała tylko wartość która jest Ci w danym momencie potrzebna (dodaj do zapytania jakiś WHERE i LIMIT 1). A już pobrane informacje zapisuj sobie np. w $_SESSION['settings']. Kiedy potrzebujesz użyć jakiejś wartości z tej tabeli, sprawdzasz najpierw czy nie ma jej w sesji. Jeśli nie ma, to odczytujesz z bazy i od razu zapamiętujesz. Kilka drobnych zmian i gotowe smile.gif
gandziorz
Zrobiłem ciutkę inaczej:

  1. <?php
  2. $settings = array();
  3. $query = "SELECT * FROM ".$DB['db_prefix']."settings";
  4. $result = @mysql_query($query);
  5. while ($row = mysql_fetch_assoc($result)) {
  6. $settings = array($row['name'] => $row['value']);
  7. }
  8. $smarty->assign('settings', $settings);
  9. ?>

Funkcja działa jakby szybciej winksmiley.jpg
wlamywacz
Dlaczego tworzysz tutaj tworzysz tablice z tablicy ? Wrzuć tablice otrzymaną z zapytania do bazy i w smarty wyświetl ją funkcją.
gandziorz
Cytat(wlamywacz @ 25.08.2008, 15:07:46 ) *
Dlaczego tworzysz tutaj tworzysz tablice z tablicy ? Wrzuć tablice otrzymaną z zapytania do bazy i w smarty wyświetl ją funkcją.

Ponieważ $settings to nie tylko dane z sql ale także dane dodawane w trakcie działania całego skryptu winksmiley.jpg
TrevorGryffits
Ale teraz za każdym przebiegiem pętli nadpisujesz zmienną $settings, czyli finalnie będzie zawierała ostatnią pobraną parę.
gandziorz
Cytat(TrevorGryffits @ 27.08.2008, 14:39:34 ) *
Ale teraz za każdym przebiegiem pętli nadpisujesz zmienną $settings, czyli finalnie będzie zawierała ostatnią pobraną parę.

Nie nadpisuję, bo tworzę tablicę.

jak w bazie mam wartości:
1 nazwa1 wartosc1
2 nazwa2 wartosc2

To stworzy tablice:
$settings = array('nazwa1' => 'wartosc1, 'nazwa2' => 'wartosc2');
I odwołuje się do niej za pomocą np. $settings['nazwa1'].
bim2
Nie nie będzie tak. Daj tak jak na początku i poprostu cachuj. Ale nie wierze, żeby jakoś opóźniałoby ci to stronę. Zalezy co trzymasz w settingach.
Driver
Po 1. nie rozumiem po co aż tyle pisać
while ($row = mysql_fetch_assoc($result)) {
$settings[$row['name']] = $row['value'];
}

wystarczy
$settings = mysl_fetch_array($result);
smile.gif

Ładowanie nawet 10 tys rekordów to ułamki sekund, więc tym nie masz się co martwić. W samym szablonie smarty wystarczy użyć {$settings.nazwa_wartosci}

Co do wybierania tylko tych potrzebnych wartości, to pozostaje zbudowanie odpowiedniego zapytania SQL smile.gif
gandziorz
Cytat(Driver @ 28.08.2008, 09:20:52 ) *
Po 1. nie rozumiem po co aż tyle pisać
while ($row = mysql_fetch_assoc($result)) {
$settings[$row['name']] = $row['value'];
}

wystarczy
$settings = mysl_fetch_array($result);
smile.gif

Ładowanie nawet 10 tys rekordów to ułamki sekund, więc tym nie masz się co martwić. W samym szablonie smarty wystarczy użyć {$settings.nazwa_wartosci}

Co do wybierania tylko tych potrzebnych wartości, to pozostaje zbudowanie odpowiedniego zapytania SQL smile.gif

Niestety nie wystarczy. Sprawdziłem.
Daron
Wykorzystaj tzw. leniwą konkretyzację - tj. zastosuj call_user_func (radzę przejsć na obiektówkę) i pobieraj dane dopiero wtedy, kiedy będą one uzywane. Coś jak działanie na eventach -dajmy na to masz studenta ktory jest zapisany na kursy. Ale dopóki nie chcesz wiedzieć ni o tych kursach (chcesz wyswietlic np. tylko jego imie) to nie pobierasz kursów. Przypisujesz tylko event onLoadCourses(), i gdy próbujesz dostać się do tablicy kursów - ona jest wcześniej wypełniana. 
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.