Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie w tabeli
Forum PHP.pl > Forum > PHP
wasnia
Witajcie.

Pisze pracę - bilingi w php.
No i napotkałem taki mały problem.

Mam tabelę w MySQL:
=====================
|id | kod | wartosc |
=====================
|1 |10 | Połączenie |
|2 |25 | SMS |
|3 |75 | Roaming |
itd.....

następnie wybieram wszystko i wyświetlam

  1. <?php
  2. $result = mysql_query(&#092;"SELECT id, kod, wartosc FROM bilingi.typy_uslug\");
  3.  
  4. while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  5.    printf (&#092;"ID: %s  Nazwa: %s Wartość: %s <br/>\", $row[\"id\"], $row[\"kod\"], $row[\"wartosc\"]);
  6. ?>


Więc mam całą tebelę z MySQL w zmiennej $row.
W tym momencie pojawia mi się problem.
Chciałbym aby jakaś funkcja po podaniu jej wartości np.10 zwróciła mi wartość Połączenie z tabeli $row
analogicznie,
po podaniu jej 25 ma zwrócić SMS
75 => Roaming... itd...

Wiem też jak zrobić to od topora, wstawić funkcję while lub for... ale to ma być bardzo zoptymalizowany kod ponieważ będzie wykonywany dla około 17tyś rekordów.

Dziękuję
piotrooo89
jeśli ma być szybki to przerzuć to polecenie na serwer MySQL'a.

  1. SELECT id, kod, wartosc FROM bilingi.typy_uslug WHERE kod='$kod'


w zmiennej $kod trzymasz ten kod 10, 25 czy 75

ale nie wiem czy dobrze zrozumiałem.
wasnia
też o tym myślałem, ale za każdym razem będę musiał pytać bazę... ponad 17tyś. wierszy :/
może istnieje taka funkcja.. a my o niej nie wiemy
piotrooo89
lepiej zapytać 17k razy bazę mysql niż na paser php który przy takiej ilości danych może troszkę zgłupieć.
krowal
Możesz to trochę zoptymalizować zapisując wybrane już sety kod => wartosc do tablicy i później przed każdym zapytaniem sprawdzić czy taki set został już zapisany, jeśli tak to bierzesz z tablicy jeśli nie to wykonujesz zapytanie i dodajesz do tablicy.

edit:
Btw. 17k to wcale nie jest tak strasznie dużo, w sumie mógłbyś na początku jednym zapytaniem wczytać wszystkie dane do tablicy i potem je z niej wyciągać zamiast wykonywać x zapytań. Zobacz które rozwiązanie jest optymalniejsze.
wasnia
Jednak jest sposób bardzo prosty, już wam go przedstawiam smile.gif
  1. <?php
  2. $result = mysql_query("SELECT id, kod AS nazwa, wartosc FROM bilingi.typy_uslug");
  3.  
  4.  
  5. while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
  6.    $foo["$row[1]"] = "$row[2]";
  7.    printf ("ID: %s  Nazwa: %s Wartość: %s <br/>", $row[0], $row[1], $row[2]);  
  8. }
  9. echo $foo["25"];
  10. ?>


//PS. Sam doszedłem do tego smile.gif
piotrooo89
Cytat(krowal @ 4.01.2009, 17:45:23 ) *
edit:
Btw. 17k to wcale nie jest tak strasznie dużo, w sumie mógłbyś na początku jednym zapytaniem wczytać wszystkie dane do tablicy i potem je z niej wyciągać zamiast wykonywać x zapytań. Zobacz które rozwiązanie jest optymalniejsze.


ja tu bym wogóle zrezygnował z php z wyjątkiem tej zmiennej w której trzymałbym ten kod. a i zgadzam się ze 17k rekordów to nie jest jakieś wielkie obciążenie. no chyba że mówimy o sytuacji w której tworzysz ekstremalnie nieoptymalne zapytania do bazy. ale to nawet baza z 1k rekordow będzie kuleć.
bartg
Z wczytywaniem danych do tablicy to bym uważał. Kiedyś jak zaczynałem to wczytywałem do tablicy wszystkie dane około 1k userów. Oczywiście serwer siadał bo RAM się zapychał
krowal
Zależy jaki serwer, jakie dane i jaki limit pamięci ustawiony w php.ini smile.gif W tym przypadku to chyba nie będzie strasznie dużo. Przyjmując nawet najbardziej pesymistyczną wersję, że każdy message będzie miał 1000 znaków (~1KB) to przy 17k rekordów tablica będzie miała jakieś 17-18MB. Jednak jak widać w przykładzie od @wasnia te wiadomości są raczej krótkie, przyjmijmy ze średnio 80 znaków (co i tak jest pewnie zbyt dużą liczbą), wówczas tablica zajmie w pamięci ok 1,5MB więc chyba nie ma się czym martwić smile.gif
wasnia
Panowie, troszkę wam sprostuje moją sytuacje z tą tablicą.

Wyobraźcie sobie że jest plik bilingowy z 17k połączeń.
Każdy typ połączenia jest oznaczony kodem (przyjmijmy: 10 - Połączenie krajowe, 25- SMS, 75-Połączenie wychodzące w Roamingu, itd.).

Mamy 15k połączeń typu 10 - Połączenie krajowe.
1k połączeń typu 25 - SMS
1k połączeń typu 75 - Roaming...

I teraz tak rozwiązałem to, że aby zamienić 'typ połączenia' na 'oznaczenie słowne połączenia' wystarczy odwołać się do tej mojej skromnej tablicy w pamięci, która zostaje wczytana tylko raz przed użyciem pętli i po wszystkim.
I mam rozkodowany typ połączenia i wszyscy wiedzą jaki to był typ połączenia.

A sposobem @piotrooo89 musiłbym odwoływać się tyle razy do bazy, ile mam połączeń.
Myślę, że to już jest bardzo optymalny kod.
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.