![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 429 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam chciał bym zapisać dane z pliku json do mojej bazy danych. Problem jest w tym, że dane pod jednym id ok 270 wierszy. Wiem że mogę zrobić to na zasadzie
Ale boję się, że serwer może nie wytrzymać. Mam już zrobioną bazę danych i chcę zabrać się za kod który doda mi te dane. Czy macie jakieś inne wyjście jak to w prosty sposób zapisać. Tak wygląda plik json. http://brzanek.webd.pl/prognoza/new/choszcznonew.json Dane zmieniają się co 30 minut a więc wywołanie pliku który będzie zapisywał te dane do bazy danych MySQL będę chciał wykorzystać CRONA na serwerze. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 230 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
używając MySQLi możesz wykonać jednym zapytaniem do bazy kilka/naście/set/milionów rekordów INSERT jednocześnie.
A mówiąc szczerze, 270rekordów to drobiazg, problemem byłby gdybyś 100 i więcej razy tyle miał dodawać produktów. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 429 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem czy mnie zrozumiałeś.
Jedno id to wszystkie dane z pliku json Kolejne id zapisywane cyklicznie co 30 minut (CRON) również ze wszystkimi danymi z json który podałem w pierwszym poście. Chodzi mi o to czy jest jakaś skrócona funkcja która da możliwość zapisania wszystkich danych z pliku json czy muszę robić to na takiej zasadzie jak podałem w pierwszym poście. Ten post edytował brzanek 19.10.2016, 10:47:36 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 933 Pomógł: 460 Dołączył: 2.04.2010 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Masz fatalnie zaprojektowaną bazę danych, jeśli faktycznie wszystkie te dane json to jeden wiersz tabeli. Przez to wydłuża się czas dostępu do potrzebnego wiersza.
Zauważ, że większość tych kolumn się powtarza. Te dane które się powtarzają dla wszystkich godzin (o ile dobrze interpretuje te dane) zapisuj w jedej tabeli jako jeden wiersz, natomiast dane godzinne w osobnej tabeli, jako osobne wiersze. Przykładowo masz dwie tabelki: Kod pogoda: id (pkey), dzien, miejscowosc oraz: Kod pogoda_godzinowo: id (pkey) id_pogoda (fkey z tabeli pogoda), temperatura 1. Do tabeli pogoda wstawiamy wiersz o id = 40. 2. Do tabeli pogoda_godzinowo wstawiamy 24 wiersze, kazdy o id_pogoda = 40, reszta danych na podstawie json. -------------------- Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 429 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Z pewnością masz rację ale nie wiem jak to zapisać w pliku php.
W pliku json znajduje się prognoza godzinowa a na dole prognoza na 7 dni. W bazie danych miało by to zapisywać się w dwóch innych tabelach? Czyli dwa zapytania na raz - czy dobrze zrozumiałem? |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 933 Pomógł: 460 Dołączył: 2.04.2010 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Z pewnością masz rację ale nie wiem jak to zapisać w pliku php. W pliku json znajduje się prognoza godzinowa a na dole prognoza na 7 dni. W bazie danych miało by to zapisywać się w dwóch innych tabelach? Czyli dwa zapytania na raz - czy dobrze zrozumiałem? Możesz te dane z linku, który podałeś w pierwszym wierszu przedstawić w bardziej czytelny sposób? Tzn. odkoduj tego jsona i wyświetl pomiędzy znacznikami HTML <pre>...</pre>, ułatwi to interpretację. Dokładnie tak. Proponowałbym w ten sposób (oczywiście to tylko pseudokod):
-------------------- Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 230 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
stwórz sobie pętle która będzie dodawać elementy do zapytania.
Oczywiście to zapytanie nie jest w pełni poprawne, bo wywali błąd MySQL, bo wartości wstrzykiwane mają na końcu przecinek i albo należy dodać kolejną kolumnę np. create_date [i value=> NOW() ] z aktualnym czasem dodania rekordu, albo przerobić kod, aby ostatni przecinek nie był dodawany. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 429 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Możesz te dane z linku, który podałeś w pierwszym wierszu przedstawić w bardziej czytelny sposób? Tzn. odkoduj tego jsona i wyświetl pomiędzy znacznikami HTML <pre>...</pre>, ułatwi to interpretację. Dokładnie tak. Proponowałbym w ten sposób (oczywiście to tylko pseudokod):
Nie bardzo wiem jak zapisać te dane w innej formie. Kombinuję coś ze znacznikami <pre></pre> ale nic nie wychodzi. Tomplus nie bardzo rozumiem. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 230 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
<pre> służy tylko do interpretacji danych w sposób przejrzysty. np. jeżeli chcesz wyświetlić tablicę z print_r(). Więc możesz wyświetlić sobie cały json np. przez kod:
Następnie najlepiej dodawać rekordy do bazy zgodnie z tym układem. 1. wartości najwyższego rzędu do jednej tablicy 2. wartości niższego rzędu do innej tablicy ale z kluczem wiążącym z tablicą wcześniejszą. A do wyświetlania także wystarczy jedno zapytanie: Kod SELECT * FROM tablicaA INNER JOIN tablicaB ON tablicaA.id = tablicaB.idTablicyA WHERE [i tutaj warunki.] Potem konstruujesz odpowiednie inserty aby dodawać te dane do tablicy. Ogólnie rzecz mówiąc, tak jak napisał Ci bartek. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 429 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Zacząłem coś pisać ale zatrzymałem się na pobieraniu i zapisaniu danych do bazy z prognozami godzinowymi.
Obecne warunki jakie są na początku pliku json działają tak jak powinny ale co dalej. Tak wygląda kod.
Ten kod pobiera dane godzinowe ale teraz jak to zapisać do bazy do odpowiednich tabel w jednym rekordzie.
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 230 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
Powiedz mi proszę po co robisz kolumny o nazwie:
nameX gdzie X to wartość od 1-13? Nie lepiej aby ten X był osobną kolumną? zrób sobie tak: [przykład tabel i ich kolumn] table_hours_weather { id, latitude, longitude, time, summary, icon, precipIntensity, precipProbability, temperature, apparentTemperature, dewPoint, humidity, windSpeed, windBearing, cloudCover, pressure } table_position_weather { id, idHours, idPosition, time, summary, icon, sunriseTime, sunsetTime, moonPhase, precipIntensity, precipIntensityMax, precipProbability, temperatureMin, temperatureMax, apparentTemperatureMin, apparentTemperatureMax, dewPoint, humidity, windSpeed, windBearing, cloudCover, pressure } id - to unikatowe indeksy dla tabel z opcją AUTO INCRAMENT, element sam się generuje, a odczytujesz przez funkcję insert_id() idHours to id z tabeli hours_weather idPosition to kolejne elementy pobrane z Json 1-14 i więcej. aby sprawnie wpisywać wartości do bazy, zamiast milionów linii kodu, stosuj pętle np. foreach() Zapytanie końcowe będzie coś w stylu: Kod SELECT * FROM table_hours_weather AS w INNER JOIN table_position_weather AS p WHERE FROM_UNIXTIME(w.time, '%Y %D %M') = '".$aktualnaData."' ORDER BY p.idPosition ASC; Zapytanie wywali ci wszystko co jest z tabeli pogoda godzinowa i pogoda pozycja. Więcej na temat dat znajdziesz tutaj: http://dev.mysql.com/doc/refman/5.5/en/dat...n_from-unixtime |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 429 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Wszystko ładnie i pięknie ale będę zbierał dane dla kilku miejscowości, które będą miały identyczne tabele i kolumny.
Potem jak je przedstawić np. na mapie musiałbym kilka razy naraz łączyć się z odpowiednią bazą danych i pobierać je - chyba, że inaczej można. Zobaczę może uda mi się to zrobić tak jak piszesz ale już widzę, że będę miał trudności z pętlą i zapisem tych danych z pliku json. |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 230 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
dodaj do tablicy: table_hours_weather kolumnę miejscowość gdzie wartość jest albo stringiem albo liczbą.
Jeżeli string to nazwa miejscowości, jeżeli liczba to id miejscowości. wtedy mozesz rozszerzyć swoją bazę o kolejną tablicę: np. table_towns gdzie table_towns { id, name, name_url, region, powiat, gmina, latitude, longitude } Oczywiście wartości do tablicy miejscowości są dodawane jednorazowo, a nie przy każdym odświeżeniu. Dzięki temu łatwo możesz w późniejszym czasie stworzyć własną mapę miejscowości bez wczytywaniu setek rekordów z innej tabeli. Oczywiście do sekcji FROM dodajesz np. LEFT JOIN table_towns AS t ON w.town = t.id a do sekcji WHERE w.town = $townId lub t.name_url = $miejscowosc |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 933 Pomógł: 460 Dołączył: 2.04.2010 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Wszystko ładnie i pięknie ale będę zbierał dane dla kilku miejscowości, które będą miały identyczne tabele i kolumny. Potem jak je przedstawić np. na mapie musiałbym kilka razy naraz łączyć się z odpowiednią bazą danych i pobierać je - chyba, że inaczej można. Zobaczę może uda mi się to zrobić tak jak piszesz ale już widzę, że będę miał trudności z pętlą i zapisem tych danych z pliku json. Chyba nie mówisz, że każde miasto ma mieć osobną tabelę? Wyobraź sobie, że własnie tak zrobisz, a tu nagle zachodzi potrzeba dorzucenia kolejnych 10 miast, no i co, kolejnych 10 tabel? To bez sensu. Wyobraź sobie teraz wyszukiwanie w takiej bazie danych - chcesz pobrać pogodę dla Warszawy, Lublina i Bydgoszczy. W Twoim układzie musisz wykonać 3 zapytania (lub użyć UNION) - co jest kompletnym bezsensem. Jedna tabela dla miast, jedna dla dni, jedna dla godzin. Dzięki temu możesz wszystko obsłużyć w miarę eleganckimi zapytaniami, w o wiele krótszym czasie i z lepszym dostępem do poszczególnych danych. -------------------- Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 429 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
ok a więc mam takie tabele.
Co teraz? Ten post edytował brzanek 22.10.2016, 11:56:02 |
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 230 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
- wszystkie kolumny jako utf-8, a tabela jako latin. Popraw.
- dlaczego wszystko dałeś jako VARCHAR? - czas to liczba więc albo INT - liczby z dwoma lub więcej miejscami po przecinku to FLOAT |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 429 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Racja poprawiłem
Tak wygląda plik który dodaje rekordy do bazy danych.
Problem w tym, że ilość rekordów zgadza się ale każdy z nich jest taki sam - dlaczego? Proszę o pomoc z góry dziękuję i pozdrawiam. Ten post edytował brzanek 22.10.2016, 19:04:13 |
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 230 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
wyświetl sobie poprzez echo treść lub print_r, jeżeli to tablica i sprawdź gdzie leży błąd. Może coś podwójnie nadpisujesz?
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 429 Pomógł: 0 Dołączył: 8.11.2012 Ostrzeżenie: (0%) ![]() ![]() |
Dziwne polecenie
Działa bez problemu ale nie chcę dodawać nowych tabeli tylko aktualizować poprzednie. Jeśli dam polecenie
To nadpisuje mi rekordy ale każdy jest taki sam na każdy dzień. Gdzie jest błąd? |
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 230 Dołączył: 20.03.2005 Skąd: Będzin Ostrzeżenie: (0%) ![]() ![]() |
A po co aktualizujesz?
Nie lepiej dodać nowe rekordy? A poprzednie zachować jako archiwum? Co gdy będziesz potrzebował prognozę z dnia poprzedniego, albo roku wcześniej? Robiąc UPDATE tylko dla ID_miasto to właśnie nadpisujesz kolejne rekordy i... Mając listę: literki: [ A B C ] pętla { UPDATE x SET literki = $LITERKA WHERE id = miasto } to wynik takiego zapytania będzie że wszystkie rekordy mające id = miasto będą mieć literkę C. Więc abyś miał poprawnie, to musisz rozszerzyć zapytanie WHERE od szczegół tj. godzina? Spójrz na strukturę twojego pliku JSON: http://www.jsoneditoronline.org/?id=7fe5e4...890a08607799c6d Na najwyższym poziomie masz 3 wartości liczbowe i 1 string. Pozostałe 4 to obiekty: - aktualna pogoda - pogoda na najbliższe 49h - pogoda na najbliższe 8 dni - i flagi API Jeżeli currently to pikuś, to pozostałe zawierają tablicę DATA których klucze są od 0-48 lub 0-7. I ten klucze są informacją która powinna znaleźć się w bazie. Wtedy tworząc zapytanie UPDATE Kod UPDATE prognoza SET [...] WHERE `wid_miasto` = '{$wid_miasto}' AND `dzien` = {$key}; Dzięki temu będziesz aktualizował tylko i wyłącznie ostatnie rekordy prognozy. Ten post edytował Tomplus 23.10.2016, 11:22:49 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 6.06.2025 - 17:52 |