• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed PHP optymalizacja skryptu

Object Storage Arubacloud
0 głosów
204 wizyt
pytanie zadane 2 maja 2021 w PHP przez Filipczak Gaduła (4,020 p.)
zamknięte 4 maja 2021 przez Filipczak

Cześć mam skrypt php który posiada w sobie pętle do odpytywania tabeli z bazy danych. Jednak problem pojawia się gdy w bazie danych jest o wiele więcej rekordów wtedy strona/skrypt ładuje się o wiele dłużej. Dlatego chciałbym jakkolwiek zoptymalizować czas wykonania tego skryptu jednak nie mam pomysłu jak

 

    public function checkCountryCodeList()
    {
        $sql      = "SELECT COUNT(*) FROM listFromCountryCode WHERE countryCode = :code AND status = :status";
        $array  = array(':code' => $this->countryCode, ':status' => $this->status);
        $result = $this->db->selectCount($sql, $array);

        if($result > 0){
            return true;
        }else{
            return false;
        }
    }

    public function getCountryCodeList()
    {
        $sql      = "SELECT idList
                             FROM listFromCountryCode 
                             WHERE countryCode = :code";
        $array  = array(':code' => $this->countryCode);
        $result = $this->db->select($sql, $array);  

        return $result;
    }

    public function getList()
    {
        if(!$this->checkCountryCodeList()){
            $this->countryCode = DEFAULT_COUNTRYCODE;
        }

        $countryCodeList = $this->getCountryCodeList(); 
        $data                    = array();

        foreach($countryCodeList as $row){
            $sql        = "SELECT listFrom.prefix, listFromTranslation.name 
                                 FROM listFrom, listFromTranslation
                                 WHERE listFrom.id = listFromTranslation.idList 
                                 AND listFrom.id = :id
                                 And listFromTranslation.langCode = :code";

            $array  = array(
                ':id'   => $row['idList'],
                ':code' => $this->langCode
            );
        
            $result = $this->db->select($sql, $array);


            $data[] = ['name' => $result[0]['name'], 'prefix' => $result[0]['prefix']];
        }

        return $data;
    }

 

komentarz zamknięcia: otrzymałem odpowiedź

1 odpowiedź

+2 głosów
odpowiedź 2 maja 2021 przez rafal.budzis Szeryf (85,260 p.)
wybrane 4 maja 2021 przez Filipczak
 
Najlepsza

Zamiast w pętli robić zapytanie w formie 

AND listFrom.id = :id

Zrób jedno zapytanie gdzie podasz listę ID (wcześniej w pętli musisz sobie takie tablice przygotować)

AND listFrom.id IN (:ids)

W sumie to trudno Ci pomóc podałeś mało szczegółów i wycinek kodu. Nie wiemy nic o bazie danych. Gdybyś pisał nieco bardziej rozbudowane pytania może bylibyśmy w stanie lepiej pomóc. Może problem nie jest w tym kodzie, a w strukturze dany bazy danych. Jeśli to nie pomoże zrób jakiegoś dumpa bazy danych. 

komentarz 2 maja 2021 przez Filipczak Gaduła (4,020 p.)
Wczorajszy post był opisany bardziej szczegółowo, zawierało pytanie o optymalizację które odnosiło się do tego skryptu (wczoraj go jeszcze nie miałem zrobionego ale wołałem zapytać od razu jak zoptymalizować go ponieważ wiedziałem że będzie się długo ładować), tutaj link do wczorajszego postu: https://forum.pasja-informatyki.pl/539655/php-odpytywanie-bazydanych-w-petli-a-wydajnosc
1
komentarz 2 maja 2021 przez rafal.budzis Szeryf (85,260 p.)
Widziałem to pytanie wczoraj i nic z niego nie zrozumiałem :/ Dziś odpisałem bo mniej więcej zrozumiałem o co chodzi. Na prawdę brakowało mi przykładu po co to i dlaczego taka struktura nie inna. Dlatego pomyślałem że z przykładowymi danymi uda mi się zrozumieć.
komentarz 2 maja 2021 przez Filipczak Gaduła (4,020 p.)
Okej to postaram się wytłumaczyć co miałem na myśli w tym wszystkim.

tabele listFromCountryCode i listFromTranslation posiadają w tabeli (nie wiem jak to się fachowo nazywa więc nazwę tabelę) tabelę o nazwie idList wartość idList w tabeli jest to po prostu id z tabeli o nazwie listFrom. Aby cały skrypt działał tak jak chcę potrzebuję pobrać listę które będą różne w zależności od pochodzenia. Z tabeli o nazwie listFromTranslation pobiera język (w zależności jaki użytkownik ustawił). Przez co chcę wyświetlić select z opcjami w value będzie zawarty prefix a name będzie to wyświetlana nazwa tej opcji. Tych danych owszem nie będzie zbyt dużo (maksymalnie 20/30) jednak jeśli jestem w stanie to zoptymalizować tak aby szybciej to czemu miałbym tego nie zrobić :D
komentarz 2 maja 2021 przez Filipczak Gaduła (4,020 p.)

Mam problem z tym zapytaniem IN otóż jeśli $replaceId dam bezpośrednio w tym zapytaniu to działa poprawnie 

		$sql 	 = "SELECT listFrom.prefix, listFromTranslation.name
							FROM listFrom, listFromTranslation
							WHERE listFrom.id = listFromTranslation.idList 
							AND listFrom.id IN ($replaceId)
							AND listFromTranslation.langCode = :code";

ale jeśli zamiast tego dam (:ids) i potem w arrayu dam że ids => $replaceId to wtedy nie pokazuje mi wyników
 

		$sql 	 = "SELECT listFrom.prefix, listFromTranslation.name
							FROM listFrom, listFromTranslation
							WHERE listFrom.id = listFromTranslation.idList 
							AND listFrom.id IN (:ids)
							AND listFromTranslation.langCode = :code";

		$array = array(
			':ids'  => $replaceId,
			':code' => $this->langCode
		);

 

Podobne pytania

0 głosów
3 odpowiedzi 691 wizyt
pytanie zadane 30 lipca 2015 w PHP przez migacz100 Mądrala (5,410 p.)
0 głosów
1 odpowiedź 429 wizyt
pytanie zadane 24 maja 2015 w PHP przez HaKIM Szeryf (87,590 p.)
+1 głos
1 odpowiedź 147 wizyt
pytanie zadane 17 marca 2021 w PHP przez Sebastian Szyja Bywalec (2,810 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...