Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Dane z json do bazy danych
Forum PHP.pl > Forum > Przedszkole
brzanek
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
  1. $add = mysql_query("INSERT INTO nazwa_tabeli
  2. (
  3. miasto, data, tempobecna, text, ikona, code, wiatr, kierunek, cisnienie, opady, zachmurzenie,
  4. dzien, dzientempmax, dzientempmin, dzienodczuwalna, dzienmaxwind, dzienopady, dzienpogoda, dzienikona, dziencode, dzienwschod, dzienzachod,
  5. dzien1, dzien1tempmax, dzien1tempmin, dzien1odczuwalna, dzien1maxwind, dzien1opady, dzien1pogoda, dzien1ikona, dzien1wschod, dzien1zachod
  6. )
  7. VALUES(
  8. '$miasto', '$data', '$tempobecna', '$text', '$ikona', '$code', '$wiatr', '$kierunek', '$cisnienie', '$opady', '$zachmurzenie',
  9. '$dzien', '$dzientempmax', '$dzientempmin', '$dzienodczuwalna', '$dzienmaxwind', '$dzienopady', '$dzienpogoda', '$dzienikona', '$dziencode', '$dzienwschod', '$dzienzachod',
  10. '$dzien1', '$dzien1tempmax', '$dzien1tempmin', '$dzien1odczuwalna', '$dzien1maxwind', '$dzien1opady', '$dzien1pogoda', '$dzien1ikona', '$dzien1wschod', '$dzien1zachod'
  11. )");

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.
Tomplus
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.
brzanek
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.
b4rt3kk
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.
brzanek
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?
b4rt3kk
Cytat(brzanek @ 19.10.2016, 15:05:08 ) *
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):

  1. while ($wiersz !== false) {
  2. // zapis danych ogólnych dla dnia
  3. while ($wiersz_godzinowy !== false) {
  4. // zapis danych szczegółowych dla godzin
  5. }
  6. }
Tomplus
stwórz sobie pętle która będzie dodawać elementy do zapytania.

  1. foreach ($json as $key => $val) {
  2. $sql['insert'] .= "`".$key."` , ";
  3. $sql['values'] .= "'".$val.", ";
  4. }
  5. $add = mysql_query("INSERT INTO nazwa_tabeli ( ".$sql['insert']." ) VALUES( ".$sql['value'].");


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.
brzanek
Cytat(b4rt3kk @ 19.10.2016, 15:19:13 ) *
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):

  1. while ($wiersz !== false) {
  2. // zapis danych ogólnych dla dnia
  3. while ($wiersz_godzinowy !== false) {
  4. // zapis danych szczegółowych dla godzin
  5. }
  6. }

Nie bardzo wiem jak zapisać te dane w innej formie. Kombinuję coś ze znacznikami <pre></pre> ale nic nie wychodzi.

Tomplus nie bardzo rozumiem.
Tomplus
<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:

  1. echo "<pre>".print_r(json_decode($json_file))."</pre>";


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.

brzanek
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.
  1. <?php
  2. $json = 'http://brzanek.webd.pl/prognoza/new/choszcznonew.json';
  3. $json = file_get_contents($json);
  4. $response = json_decode($json, true);
  5.  
  6. if ($response != null) {
  7. $latitude = $response['latitude'];
  8. $longitude = $response['longitude'];
  9. //Current Conditions
  10. $time = $response['currently']['time'];
  11. $summary = $response['currently']['summary'];
  12. $icon = $response['currently']['icon'];
  13. $precipIntensity = $response['currently']['precipIntensity'];
  14. $precipProbability = ($response['currently']['precipProbability'])*100;
  15. $precipType = $response['currently']['precipType'];
  16. $temperature = $response['currently']['temperature'];
  17. $apparentTemperature = $response['currently']['apparentTemperature'];
  18. $dewPoint = $response['currently']['dewPoint'];
  19. $humidity = ($response['currently']['humidity'])*100;
  20. $windSpeed = $response['currently']['windSpeed'];
  21. $windBearing = $response['currently']['windBearing'];
  22. $cloudCover = ($response['currently']['cloudCover'])*100;
  23. $pressure = $response['currently']['pressure'];
  24. //Hourly Forecast
  25. $hourlySumamry = $response['hourly']['summary'];
  26. $hourlyIcon = $response['hourly']['icon'];
  27. $hourlyCond= array();
  28. foreach ($response['hourly']['data'] as $td) {
  29. $hourlyCond[] = $td;
  30. }
  31.  
  32. include ("db.php");
  33. $add = mysql_query("INSERT INTO choszczno
  34. (latitude, longitude, time, summary, icon, precipIntensity, precipProbability, temperature, apparentTemperature,
  35. dewPoint, humidity, windSpeed, windBearing, cloudCover, pressure, time1, summary1, icon1, precipIntensity1,
  36. precipProbability1, temperature1, apparentTemperature1, dewPoint1, humidity1, windSpeed1, windBearing1,
  37. cloudCover1, pressure1, time2, summary2, icon2, precipIntensity2, precipProbability2, temperature2,
  38. apparentTemperature2, dewPoint2, humidity2, windSpeed2, windBearing2, cloudCover2, pressure2, time3,
  39. summary3, icon3, precipIntensity3, precipProbability3, temperature3, apparentTemperature3, dewPoint3,
  40. humidity3, windSpeed3, windBearing3, cloudCover3, pressure3, time4, summary4, icon4, precipIntensity4,
  41. precipProbability4, temperature4, apparentTemperature4, dewPoint4, humidity4, windSpeed4, windBearing4,
  42. cloudCover4, pressure4, time5, summary5, icon5, precipIntensity5, precipProbability5, temperature5,
  43. apparentTemperature5, dewPoint5, humidity5, windSpeed5, windBearing5, cloudCover5, pressure5, time6,
  44. summary6, icon6, precipIntensity6, precipProbability6, temperature6, apparentTemperature6, dewPoint6,
  45. humidity6, windSpeed6, windBearing6, cloudCover6, pressure6, time7, summary7, icon7, precipIntensity7,
  46. precipProbability7, temperature7, apparentTemperature7, dewPoint7, humidity7, windSpeed7, windBearing7,
  47. cloudCover7, pressure7, time8, summary8, icon8, precipIntensity8, precipProbability8, temperature8,
  48. apparentTemperature8, dewPoint8, humidity8, windSpeed8, windBearing8, cloudCover8, pressure8, time9,
  49. summary9, icon9, precipIntensity9, precipProbability9, temperature9, apparentTemperature9, dewPoint9,
  50. humidity9, windSpeed9, windBearing9, cloudCover9, pressure9, time10, summary10, icon10, sunriseTime10,
  51. sunsetTime10, moonPhase10, precipIntensity10, precipIntensityMax10, precipProbability10, temperatureMin10,
  52. temperatureMax10, apparentTemperatureMin10, apparentTemperatureMax10, dewPoint10, humidity10, windSpeed10,
  53. windBearing10, cloudCover10, pressure10, time11, summary11, icon11, sunriseTime11, sunsetTime11, moonPhase11,
  54. precipIntensity11, precipIntensityMax11, precipProbability11, temperatureMin11, temperatureMax11,
  55. apparentTemperatureMin11, apparentTemperatureMax11, dewPoint11, humidity11, windSpeed11, windBearing11,
  56. cloudCover11, pressure11, time12, summary12, icon12, sunriseTime12, sunsetTime12, moonPhase12,
  57. precipIntensity12, precipIntensityMax12, precipProbability12, temperatureMin12, temperatureMax12,
  58. apparentTemperatureMin12, apparentTemperatureMax12, dewPoint12, humidity12, windSpeed12, windBearing12,
  59. cloudCover12, pressure12, time13, summary13, icon13, sunriseTime13, sunsetTime13, moonPhase13,
  60. precipIntensity13, precipIntensityMax13, precipProbability13, temperatureMin13, temperatureMax13,
  61. apparentTemperatureMin13, apparentTemperatureMax13, dewPoint13, humidity13, windSpeed13, windBearing13,
  62. cloudCover13, pressure13, time14, summary14, icon14, sunriseTime14, sunsetTime14, moonPhase14,
  63. precipIntensity14, precipIntensityMax14, precipProbability14, temperatureMin14, temperatureMax14,
  64. apparentTemperatureMin14, apparentTemperatureMax14, dewPoint14, humidity14, windSpeed14, windBearing14,
  65. cloudCover14, pressure14)
  66. VALUES(
  67. '$latitude', '$longitude', '$time', '$summary', '$icon', '$precipIntensity', '$precipProbability', '$temperature',
  68. '$apparentTemperature', '$dewPoint', '$humidity', '$windSpeed', '$windBearing', '$cloudCover', '$pressure',
  69. '$time1', '$summary1', '$icon1', '$precipIntensity1', '$precipProbability1', '$temperature1', '$apparentTemperature1',
  70. '$dewPoint1', '$humidity1', '$windSpeed1', '$windBearing1', '$cloudCover1', '$pressure1', '$time2', '$summary2',
  71. '$icon2', '$precipIntensity2', '$precipProbability2', '$temperature2', '$apparentTemperature2', '$dewPoint2',
  72. '$humidity2', '$windSpeed2', '$windBearing2', '$cloudCover2', '$pressure2', '$time3', '$summary3', '$icon3',
  73. '$precipIntensity3', '$precipProbability3', '$temperature3', '$apparentTemperature3', '$dewPoint3', '$humidity3',
  74. '$windSpeed3', '$windBearing3', '$cloudCover3', '$pressure3', '$time4', '$summary4', '$icon4', '$precipIntensity4',
  75. '$precipProbability4', '$temperature4', '$apparentTemperature4', '$dewPoint4', '$humidity4', '$windSpeed4',
  76. '$windBearing4', '$cloudCover4', '$pressure4', '$time5', '$summary5', '$icon5', '$precipIntensity5', '$precipProbability5',
  77. '$temperature5', '$apparentTemperature5', '$dewPoint5', '$humidity5', '$windSpeed5', '$windBearing5', '$cloudCover5',
  78. '$pressure5', '$time6', '$summary6', '$icon6', '$precipIntensity6', '$precipProbability6', '$temperature6',
  79. '$apparentTemperature6', '$dewPoint6', '$humidity6', '$windSpeed6', '$windBearing6', '$cloudCover6', '$pressure6',
  80. '$time7', '$summary7', '$icon7', '$precipIntensity7', '$precipProbability7', '$temperature7', '$apparentTemperature7',
  81. '$dewPoint7', '$humidity7', '$windSpeed7', '$windBearing7', '$cloudCover7', '$pressure7', '$time8', '$summary8', '$icon8',
  82. '$precipIntensity8', '$precipProbability8', '$temperature8', '$apparentTemperature8', '$dewPoint8', '$humidity8',
  83. '$windSpeed8', '$windBearing8', '$cloudCover8', '$pressure8', '$time9', '$summary9', '$icon9', '$precipIntensity9',
  84. '$precipProbability9', '$temperature9', '$apparentTemperature9', '$dewPoint9', '$humidity9', '$windSpeed9', '$windBearing9',
  85. '$cloudCover9', '$pressure9', '$summarya', '$time10', '$summary10', '$icon10', '$sunriseTime10', '$sunsetTime10',
  86. '$moonPhase10', '$precipIntensity10', '$precipIntensityMax10', '$precipProbability10', '$temperatureMin10',
  87. '$temperatureMax10', '$apparentTemperatureMin10', '$apparentTemperatureMax10', '$dewPoint10', '$humidity10',
  88. '$windSpeed10', '$windBearing10', '$cloudCover10', '$pressure10', '$time11', '$summary11', '$icon11', '$sunriseTime11',
  89. '$sunsetTime11', '$moonPhase11', '$precipIntensity11', '$precipIntensityMax11', '$precipProbability11', '$temperatureMin11',
  90. '$temperatureMax11', '$apparentTemperatureMin11', '$apparentTemperatureMax11', '$dewPoint11', '$humidity11', '$windSpeed11',
  91. '$windBearing11', '$cloudCover11', '$pressure11', '$time12', '$summary12', '$icon12', '$sunriseTime12', '$sunsetTime12',
  92. '$moonPhase12', '$precipIntensity12', '$precipIntensityMax12', '$precipProbability12', '$temperatureMin12',
  93. '$temperatureMax12', '$apparentTemperatureMin12', '$apparentTemperatureMax12', '$dewPoint12', '$humidity12',
  94. '$windSpeed12', '$windBearing12', '$cloudCover12', '$pressure12', '$time13', '$summary13', '$icon13', '$sunriseTime13',
  95. '$sunsetTime13', '$moonPhase13', '$precipIntensity13', '$precipIntensityMax13', '$precipProbability13', '$temperatureMin13',
  96. '$temperatureMax13', '$apparentTemperatureMin13', '$apparentTemperatureMax13', '$dewPoint13', '$humidity13', '$windSpeed13',
  97. '$windBearing13', '$cloudCover13', '$pressure13', '$time14', '$summary14', '$icon14', '$sunriseTime14', '$sunsetTime14',
  98. '$moonPhase14', '$precipIntensity14', '$precipIntensityMax14', '$precipProbability14', '$temperatureMin14',
  99. '$temperatureMax14', '$apparentTemperatureMin14', '$apparentTemperatureMax14', '$dewPoint14', '$humidity14',
  100. '$windSpeed14', '$windBearing14', '$cloudCover14', '$pressure14')");
  101. }
  102. ?>


Ten kod pobiera dane godzinowe ale teraz jak to zapisać do bazy do odpowiednich tabel w jednym rekordzie.
  1. //Hourly Forecast
  2. $hourlySumamry = $response['hourly']['summary'];
  3. $hourlyIcon = $response['hourly']['icon'];
  4. $hourlyCond= array();
  5. foreach ($response['hourly']['data'] as $td) {
  6. $hourlyCond[] = $td;
  7. }
Tomplus
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
brzanek
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.
Tomplus
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

b4rt3kk
Cytat(brzanek @ 20.10.2016, 11:48:21 ) *
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.
brzanek
ok a więc mam takie tabele.
  1. CREATE TABLE IF NOT EXISTS `miasta` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_miasto` varchar(100) NOT NULL,
  4. `latitude` float(10,6) NOT NULL,
  5. `longitude` float(10,6) NOT NULL,
  6. PRIMARY KEY (`id`),
  7. UNIQUE KEY `id` (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
  9.  
  10.  
  11. CREATE TABLE IF NOT EXISTS `prognoza_godzinowa` (
  12. `id_miasto` int(6) NOT NULL,
  13. `time` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  14. `summary` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  15. `icon` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  16. `precipIntensity` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  17. `precipProbability` varchar(10) NOT NULL,
  18. `temperature` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  19. `apparentTemperature` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  20. `dewPoint` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  21. `humidity` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  22. `windSpeed` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  23. `windBearing` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  24. `cloudCover` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  25. `pressure` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
  26. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  27.  
  28.  
  29. CREATE TABLE IF NOT EXISTS `prognoza` (
  30. `id_miasto` int(6) NOT NULL,
  31. `time` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  32. `summary` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  33. `icon` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  34. `sunriseTime` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  35. `sunsetTime` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  36. `moonPhase` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  37. `precipIntensity` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  38. `precipIntensityMax` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  39. `precipProbability` varchar(10) NOT NULL,
  40. `temperatureMin` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  41. `temperatureMax` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  42. `apparentTemperatureMin` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  43. `apparentTemperatureMax` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  44. `dewPoint` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  45. `humidity` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  46. `windSpeed` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  47. `windBearing` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  48. `cloudCover` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  49. `pressure` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
  50. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


Co teraz?
Tomplus
- 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

brzanek
Racja poprawiłem
  1. CREATE TABLE IF NOT EXISTS `miasta` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_miasto` varchar(100) NOT NULL,
  4. `latitude` float(10,6) NOT NULL,
  5. `longitude` float(10,6) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  8.  
  9.  
  10. CREATE TABLE IF NOT EXISTS `prognoza_godzinowa` (
  11. `id_miasto` int(11) NOT NULL,
  12. `time` int(11) NOT NULL,
  13. `summary` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  14. `icon` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  15. `precipIntensity` float(10,6) NOT NULL,
  16. `precipProbability` float(10,6) NOT NULL,
  17. `temperature` float(10,6) NOT NULL,
  18. `apparentTemperature` float(10,6) NOT NULL,
  19. `dewPoint` float(10,6) NOT NULL,
  20. `humidity` float(10,6) NOT NULL,
  21. `windSpeed` float(10,6) NOT NULL,
  22. `windBearing` float(10,6) NOT NULL,
  23. `cloudCover` float(10,6) NOT NULL,
  24. `pressure` float(10,6) NOT NULL
  25. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  26.  
  27.  
  28. CREATE TABLE IF NOT EXISTS `prognoza` (
  29. `id_miasto` int(11) NOT NULL,
  30. `time` int(11) NOT NULL,
  31. `summary` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  32. `icon` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  33. `sunriseTime` int(11) NOT NULL,
  34. `sunsetTime` int(11) NOT NULL,
  35. `moonPhase` float(10,6) NOT NULL,
  36. `precipIntensity` float(10,6) NOT NULL,
  37. `precipIntensityMax` float(10,6) NOT NULL,
  38. `precipProbability` float(10,6) NOT NULL,
  39. `temperatureMin` float(10,6) NOT NULL,
  40. `temperatureMax` float(10,6) NOT NULL,
  41. `apparentTemperatureMin` float(10,6) NOT NULL,
  42. `apparentTemperatureMax` float(10,6) NOT NULL,
  43. `dewPoint` float(10,6) NOT NULL,
  44. `humidity` float(10,6) NOT NULL,
  45. `windSpeed` float(10,6) NOT NULL,
  46. `windBearing` float(10,6) NOT NULL,
  47. `cloudCover` float(10,6) NOT NULL,
  48. `pressure` float(10,6) NOT NULL
  49. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


Tak wygląda plik który dodaje rekordy do bazy danych.
  1. <?php
  2. $json = 'http://brzanek.webd.pl/prognoza/new/choszcznonew.json';
  3. $json = file_get_contents($json);
  4. $response = json_decode($json, true);
  5.  
  6. if ($response != null) {
  7.  
  8. //Daily Forecast
  9. $dailyCond= array();
  10. foreach ($response['daily']['data'] as $d) {
  11. $dailyCond[] = $d;
  12. }
  13.  
  14. $wi = 0;
  15. $count = 0;
  16. foreach ($dailyCond as $cond) {
  17.  
  18. if ($count++ == 0) continue;
  19.  
  20. $wtime = $cond['time'];
  21. $wsummary = $cond['summary'];
  22. $wicon = $cond['icon'];
  23. $wtemperatureMax = round($cond['temperatureMax']);
  24. $wtemperatureMin = round($cond['temperatureMin']);
  25. $wprecipProbability = $cond['precipProbability']*100;
  26. $wprecipIntensity = $cond['precipIntensity'];
  27. if (isset($cond['precipType'])) {
  28. $precipType = $cond['precipType'];
  29. }
  30. $wcloudCover = $cond['cloudCover']*100;
  31. $whumidity = $cond['humidity']*100;
  32. $wwindSpeed = round($cond['windSpeed']);
  33. $wsunriseTime = $cond['sunriseTime'];
  34. $wsunsetTime = $cond['sunsetTime'];
  35. $wmoonPhase = $cond['moonPhase'];
  36. $wprecipIntensityMax = $cond['precipIntensityMax'];
  37. $wapparentTemperatureMin = $cond['apparentTemperatureMin'];
  38. $wapparentTemperatureMax = $cond['apparentTemperatureMax'];
  39. $wdewPoint = $cond['dewPoint'];
  40. $wwindBearing = $cond['windBearing'];
  41. $wpressure = $cond['pressure'];
  42. $wid_miasto = 1;
  43.  
  44. include ("db.php");
  45. $add = mysql_query("UPDATE prognoza SET time='".$wtime."', summary='".$wsummary."', icon='".$wicon."', sunriseTime='".$wsunriseTime."', sunsetTime='".$wsunsetTime."', moonPhase='".$wmoonPhase."', precipIntensity='".$wprecipIntensity."', precipIntensityMax='".$wprecipIntensityMax."',
  46. precipProbability='".$wprecipProbability."', temperatureMin='".$wtemperatureMin."', temperatureMax='".$wtemperatureMax."', apparentTemperatureMin='".$wapparentTemperatureMin."', apparentTemperatureMax='".$wapparentTemperatureMax."',
  47. dewPoint='".$wdewPoint."', humidity='".$whumidity."', windSpeed='".$wwindSpeed."', windBearing='".$wwindBearing."', cloudCover='".$wcloudCover."', pressure='".$wpressure."'");
  48.  
  49. $wi++;
  50. if ($wi%3 == 0) echo '</div><div class="row">';
  51. }
  52. }
  53. ?>


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.
Tomplus
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?
brzanek
Dziwne polecenie
  1. $add = mysql_query("INSERT INTO prognoza
  2. (wid_miasto, wtime, wsummary, wicon, wsunriseTime, wsunsetTime, wmoonPhase, wprecipIntensity, wprecipIntensityMax, wprecipProbability, wtemperatureMin, wtemperatureMax, wapparentTemperatureMin, wapparentTemperatureMax, wdewPoint, whumidity, wwindSpeed, wwindBearing, wcloudCover, wpressure)
  3. VALUES(
  4. '$wid_miasto', '$wtime', '$wsummary', '$wicon', '$wsunriseTime', '$wsunsetTime', '$wmoonPhase', '$wprecipIntensity', '$wprecipIntensityMax', '$wprecipProbability', '$wtemperatureMin', '$wtemperatureMax', '$wapparentTemperatureMin', '$wapparentTemperatureMax', '$wdewPoint', '$whumidity', '$wwindSpeed', '$wwindBearing', '$wcloudCover', '$wpressure')");

Działa bez problemu ale nie chcę dodawać nowych tabeli tylko aktualizować poprzednie.
Jeśli dam polecenie
  1. $add = mysql_query("UPDATE prognoza SET wtime='".$wtime."', wsummary='".$wsummary."', wicon='".$wicon."', wsunriseTime='".$wsunriseTime."', wsunsetTime='".$wsunsetTime."', wmoonPhase='".$wmoonPhase."', wprecipIntensity='".$wprecipIntensity."', wprecipIntensityMax='".$wprecipIntensityMax."',
  2. wprecipProbability='".$wprecipProbability."', wtemperatureMin='".$wtemperatureMin."', wtemperatureMax='".$wtemperatureMax."', wapparentTemperatureMin='".$wapparentTemperatureMin."', wapparentTemperatureMax='".$wapparentTemperatureMax."',
  3. wdewPoint='".$wdewPoint."', whumidity='".$whumidity."', wwindSpeed='".$wwindSpeed."', wwindBearing='".$wwindBearing."', wcloudCover='".$wcloudCover."', wpressure='".$wpressure."' WHERE wid_miasto='".$wid_miasto."'");

To nadpisuje mi rekordy ale każdy jest taki sam na każdy dzień.
Gdzie jest błąd?
Tomplus
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.

brzanek
Może racja a więc w tabeli prognoza będę dodawał nowe rekordy ale w prognozie_godzinowej chcę aby to się aktualizowało bo będę wywoływał ją np. co 30 minut i nie chcę zaśmiecać bazy danych. Co do obecnych warunków to też chcę aby rekordy były aktualizowane i nadpisywane.
Dzięki, że mi tłumaczysz co i jak z tym aktualizowaniem ale niestety nie wiem co i jak.
Jak możesz to podaj mi odpowiedni kod bo chyba tego nie zrozumiem.

Jeszcze jedno jak mam kilkanaście miejscowości to lepiej będzie zastosować te wszystkie zapytania do bazy w jednym pliku czy każe miasto w osobnym pliku php.
Oczywiście każde miasto to inne źródło json.
Tomplus
Wystarczy jedna funkcja gdzie parametrem jest miasto


  1. function updateDailyWeather($idCity = 1) { //idCity = 1 for 'Choszczno'
  2. $json = json_decode($file, true);
  3.  
  4. foreach($json['daily']['data'] as $day => $row) {
  5. $updateSet = '';
  6. foreach($row[$day] as $name => $value) {
  7. $updateSet .= "`{$name}` = '{$value}', "
  8. }
  9. // UPDATE `weather_daily` SET $updateSet `icon` = '{$json['daily']['icon']}', `summary` = '{$json['daily']['summary']}' WHERE `Id_city` = $IdCity AND `day` = $day;
  10. }
  11. }
  12.  
  13. //[SELECT FROM city]
  14. foreach/while { //co tam używasz
  15. updateDailyWeather($miasta['id']);
  16. } // Aktualizacja wszystkich miast które wywołaliśmy w zapytaniu. Jeżeli chcemy tylko jedno miasto, to pętla jest zbyteczna.


To tylko przykład. Nie możemy zrobić wszystkiego za Ciebie. Postaraj się pomyśleć sam.
Jak coś weź ołówek/długopis i narysuj sobie program, potem sprawdź co wywodzi się z czego. Nie musisz od razu robić UPDATE/INSERT.
Możesz drukować takie zapytania na ekranie przeglądarki. Będziesz widział wtedy jakie zapytania trafiają do bazy i czy są błędne.
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.