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

question-closed PHP optymalizacja skryptu

VPS Starter Arubacloud
0 głosów
233 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,340 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,340 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 872 wizyt
pytanie zadane 30 lipca 2015 w PHP przez migacz100 Mądrala (5,410 p.)
0 głosów
1 odpowiedź 588 wizyt
pytanie zadane 24 maja 2015 w PHP przez HaKIM Szeryf (87,590 p.)
+1 głos
1 odpowiedź 160 wizyt
pytanie zadane 17 marca 2021 w PHP przez Sebastian Szyja Bywalec (2,810 p.)

93,016 zapytań

141,977 odpowiedzi

321,272 komentarzy

62,361 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...