Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Automatyczne przesyłanie danych do bazy MySQL w określonym czasie.
Forum PHP.pl > Forum > Przedszkole
brzanek
Witam w jaki sposób napisać plik php aby co 30 minut automatycznie wysyłał pewne dane (dokładnie temperaturę dla danej miejscowości) do bazy danych mysql. Przy każdym nowym rekordzie musi być dodawana data w formacie 2015-03-07 18:00:00 oraz oczywiście id.
Dane nie mogą nadpisywać się.
Dane o aktualnej temperaturze pobierane są za pomocą pliku js i wyświetlane na stronie w php.
Plik js
  1. /*!
  2. e-dom Weather wtyczka do jQuery
  3. e-dom Weather jQuery plugin
  4. ver 1.0
  5.  
  6. Kod oparty na przykładach Jamesa Fleetinga i jego wtyczki 'Simple Weather'
  7. The code is based partially on the examples of James Fleeting and his 'Simple Weather' plugin
  8.  
  9. dodatkowe informacje na:
  10. more info at:
  11.  
  12. www.edom-plc.pl
  13.  
  14.  */
  15.  
  16. (function( $ ){
  17. $.extend({
  18. GetWeatherForecast: function(options) {
  19. var options = $.extend({
  20. location: 'PLXX0023',
  21. unit: 'c',
  22. success: function(data){}
  23. }, options);
  24.  
  25. $.getJSON("http://query.yahooapis.com/v1/public/yql?"+
  26. "q=select * from rss where url='"+
  27. encodeURIComponent('http://xml.weather.yahoo.com/forecastrss/'+options.location+'_'+options.unit+'.xml')+
  28. "'&format=json&diagnostics=false&callback=?",
  29. function(data){
  30. if (data != null) {
  31. if (data.query.results != null) {
  32. var forecast=new Array();
  33.  
  34. for (var i=0; i<data.query.results.item.forecast.length; i++) {
  35. forecast[i]=data.query.results.item.forecast[i];
  36. } // End FOR
  37. options.success(forecast)
  38. }
  39. }
  40. }, //End of Success Handling
  41. function(e) {
  42. alert(e.message);
  43. } //End of Error Handling
  44. ); //End of getJSON
  45. }, //End of GetWeatherForecast function
  46.  
  47. GetCurrentWeather: function(options) {
  48. var options = $.extend({
  49. location: 'PLXX0023',
  50. unit: 'c',
  51. success: function(data){}
  52. }, options);
  53.  
  54. $.getJSON("http://query.yahooapis.com/v1/public/yql?"+
  55. "q=select * from weather.forecast where location in ('"+options.location+"') and u='"+options.unit+"'"+
  56. "&format=json&diagnostics=false&callback=?",
  57. function(data){
  58. if (data != null) {
  59. if (data.query.results != null) {
  60. var result=data.query.results.channel;
  61.  
  62. var weather={
  63. city: result.location.city,
  64. wind_speed: result.wind.speed,
  65. humidity: result.atmosphere.humidity,
  66. pressure: result.atmosphere.pressure,
  67. visibility: result.atmosphere.visibility,
  68. sunrise: result.astronomy.sunrise,
  69. sunset: result.astronomy.sunset,
  70. code: result.item.condition.code,
  71. temp: result.item.condition.temp,
  72. text: result.item.condition.text,
  73. date: result.item.condition.date
  74. }
  75. var WindDirection = parseInt(result.wind.direction);
  76. if (WindDirection>=0&&WindDirection<=360) {
  77. var WindDirectionTable = ["N","NNE","NE","ENE","E","ESE", "SE", "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW","N"];
  78. weather.wind_direction = WindDirectionTable[Math.floor((WindDirection+11.25)/22.5)];
  79. };
  80. var AtmosphereRising = parseInt(result.atmosphere.rising);
  81. if (AtmosphereRising>=0&&AtmosphereRising<=2) {
  82. weather.rising = ["&rarr;", "&uarr;", "&darr;"][AtmosphereRising];
  83. }
  84.  
  85. options.success(weather)
  86. }
  87. }
  88. }, //End of Success Handling
  89. function(e) {
  90. alert(e.message);
  91. } //End of Error Handling
  92. ); //End of getJSON
  93. } //End of GetCurrentWeather function
  94.  
  95. });
  96. })( jQuery );


Plik php do wyświetlania
  1. <?php
  2. ?>
  3. <html>
  4. <head>
  5. <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  6. <title>Example Weather</title>
  7.  
  8. <link type="text/css" href="css/jquery.e-dom.css" rel="stylesheet" />
  9. <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.min.js"></script>
  10. <script type="text/javascript" src="js/jquery.e-dom.weather.js" charset="utf-8"></script>
  11.  
  12. <script type="text/javascript">
  13.  
  14. $(window).load(function(){
  15. $.GetCurrentWeather({
  16. location: 'PLXX0023',
  17. unit: 'c',
  18. success: function(weather) { //define what you do with the data obtained by the function
  19. var html = '<table><tr><td><img width="35px" style="padding-bottom:10px;" src="http://djdandi.nazwa.pl/PHP-Fusion-9.00/themes/Brzanek/pogoda2015/ikony/'+weather.code+'.png"></td>';
  20. html+='<td align="center"><p style="font-size: 14px; color: #336666; font-family: tahoma; text-shadow: rgba(250, 250, 250, 0.2) 2px 2px 0;">'+weather.temp+'&deg;C Stargard';
  21. html+='</td></tr></table>';
  22. $('#Example3Div').append(html);
  23. } //End of the success function
  24. });//End of GetCurrentWeather
  25. }); // End of Window Load
  26.  
  27. </script>
  28. </head>
  29. <body>
  30. <table border="0" cellpadding="0" cellspacing="0" align="center">
  31. <tr>
  32. <td id="Example3Div" style="width: 150px;"></td>
  33. </tr>
  34. </table>
  35. </body>
  36. </html>
  37. <?php
  38. ?>

Czy znacie na to jakieś rozwiązanie?
Aqu
1. Potrzebujesz CRONa, który będzie co pół godziny odpalał skrypt php.
2. Musisz przepisać skrypt JS na php, czyli np. w jsie masz:
getJSON(url) -> file_get_contents(url) i potem odpowiednie przetowrzenie tego i wysłanie odpowiednich informacji do bazy za pomocą INSERT.

Raczej nikt Ci tego nie napisze za darmo, spróbuj sam coś zrobić i ewnetualnie pytaj.
brzanek
Nie mam pojęcia jak zabrać się za tego cron'a nigdy tym nie bawiłem się.
Co do przerobienia pliku js na php to nie wiem czy będzie taka konieczność, bo przecież w pliku php, który odpowiada za wyświetlenie temperatury można to zrobić - chyba że się mylę.
Jak możesz to pomóż mi z tym cronem.

A jednak będzie odwrotnie większy problem mam z napisaniem odpowiedniego pliku php co połączy się z bazą i prześle do niej wartość temperatury.

Napisałem formularz ale nie wiem jak zrobić aby pole z temperaturą maksymalną uzupełniało się automatycznie.
Tak to wygląda http://djdandi.nazwa.pl/PHP-Fusion-9.00/th...5/choszczno.php
A tak wygląda kod formularza
  1. <?php
  2. ?>
  3. <html>
  4. <head>
  5. <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  6. <title>Example Weather</title>
  7. <link type="text/css" href="css/jquery.e-dom.css" rel="stylesheet" />
  8. <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.min.js"></script>
  9. <script type="text/javascript" src="js/jquery.e-dom.weather.js" charset="utf-8"></script>
  10.  
  11. <script type="text/javascript">
  12.  
  13. $(window).load(function(){
  14. $.GetCurrentWeather({
  15. location: 'PLXX0008',
  16. unit: 'c',
  17. success: function(weather) { //define what you do with the data obtained by the function
  18. var html = '<table><tr>';
  19. html+='<td align="center"><p style="font-size: 14px; color: #336666; font-family: tahoma; text-shadow: rgba(250, 250, 250, 0.2) 2px 2px 0;">'+weather.temp+'';
  20. html+='</td></tr></table>';
  21. $('#Example5Div').append(html);
  22. } //End of the success function
  23. });//End of GetCurrentWeather
  24. }); // End of Window Load
  25.  
  26. </script>
  27. </head>
  28. </html>
  29. <?php
  30. if(isset($_POST["submit"])) {
  31. include ("db.php");
  32.  
  33. $dzien = $_POST['dzien'];
  34. $tempmax = $_POST['tempmax'];
  35. $tempmin = $_POST['tempmin'];
  36. $temp = $_POST['temp'];
  37. $wilgotnosc = $_POST['wilgotnosc'];
  38. $add = mysql_query("INSERT INTO gorzow(dzien, tempmax, tempmin, temp, wilgotnosc) VALUES('$dzien', '$tempmax', '$tempmin','$temp','$wilgotnosc')");
  39.  
  40. if ($add) {
  41. echo '<p>Dodano do bazy</p>';
  42. } else {
  43. echo mysql_error(); echo '<p>Błąd! Spróbuj ponownie</p>';
  44. }
  45. } else {
  46. ?>
  47. <!-- kod formularza-->
  48. <form action="choszczno.php" method="post">
  49. <table>
  50. <tr>
  51. <td align="right">Data: </td>
  52. <td><input name="dzien"></td>
  53. </tr>
  54. <tr>
  55. <td align="right">Temperatura maksymalna: </td>
  56. <td><input type="text" name="tempmax" style="width:350px;" value="<?php echo "id='Example5Div'"; ?> onkeyup="suggest2(this.value);" autocomplete="on"></td>
  57. </tr>
  58. <tr>
  59. <td align="right">Temperatura minimalna: </td>
  60. <td><input name="tempmin"></td>
  61. </tr>
  62. <tr>
  63. <td align="right">Temperatura średnia: </td>
  64. <td><input name="temp"></td>
  65. </tr>
  66. <tr>
  67. <td align="right">Wilgotność: </td>
  68. <td><input name="wilgotnosc"></td>
  69. </tr>
  70. <tr>
  71. <td colspan="2" align="right">
  72. <input type="submit" name="submit" value="Zapisz" /></td>
  73. </tr>
  74. </table>
  75. </form>
  76. <?php
  77. }
  78.  
  79. echo '<table border="0" cellpadding="0" cellspacing="0" align="center">
  80. <tr>';
  81. echo "<td id='Example5Div' style='width: 160px;'></td>";
  82. echo '</tr>
  83. </table>';
  84.  
  85. ?>


Kombinuję już na wszystkie sposoby i nic nie wychodzi ma ktoś jakiś pomysł?

Coś wykombinowałem, ale teraz za szybko wysyła się, bo nawet nie zdąży uzupełnić się potrzebne pole.
  1. <?php
  2. ?>
  3. <html>
  4. <head>
  5. <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  6. <title>Example Weather</title>
  7. <link type="text/css" href="css/jquery.e-dom.css" rel="stylesheet" />
  8. <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.min.js"></script>
  9. <script type="text/javascript" src="js/jquery.e-dom.weather.js" charset="utf-8"></script>
  10.  
  11. <script type="text/javascript">
  12.  
  13. $(window).load(function(){
  14. $.GetCurrentWeather({
  15. location: 'PLXX0008',
  16. unit: 'c',
  17. success: function(weather) { //define what you do with the data obtained by the function
  18. var html = '<table><tr>';
  19. html+='<td align="center"><p style="font-size: 14px; color: #336666; font-family: tahoma; text-shadow: rgba(250, 250, 250, 0.2) 2px 2px 0;">'+weather.temp+'';
  20. html+='</td></tr></table>';
  21. $('#Example5Div').append(html);
  22. } //End of the success function
  23. });//End of GetCurrentWeather
  24. }); // End of Window Load
  25.  
  26. </script>
  27. </head>
  28. </html>
  29. <?php
  30. if(isset($_POST["submit"])) {
  31. include ("db.php");
  32.  
  33. $tempmax = $_POST['tempmax'];
  34. $add = mysql_query("INSERT INTO gorzow(dzien, tempmax) VALUES('".date('Y-m-d H:i:s')."', '$tempmax')");
  35.  
  36. if ($add) {
  37. echo '<p>Dodano do bazy</p>';
  38. } else {
  39. echo mysql_error(); echo '<p>Błąd! Spróbuj ponownie</p>';
  40. }
  41. } else {
  42.  
  43.  
  44. ?>
  45.  
  46. <!-- kod formularza-->
  47.  
  48.  
  49. <form action="choszczno.php" method="post">
  50. <table>
  51. <tr>
  52. <td align="right">Temperatura maksymalna: </td>
  53. <td><select name="tempmax">
  54. <option id="Example5Div"></option>
  55. <option value="1">Drugi</option>
  56. <option value="2">Trzeci</option>
  57. <option value="3">Czwarty</option>
  58. </select></td></tr>
  59.  
  60. <tr>
  61. <td colspan="2" align="right">
  62. <input type="submit" id="przycisk" name="submit" value="Zapisz" /></td>
  63. </tr>
  64. </table>
  65. </form>
  66. <script type="text/javascript">
  67. document.getElementById('przycisk').click()
  68. </script>
  69. <?php
  70. }
  71.  
  72. ?>


Dałem taki formularz z takim kodem js
  1. <form action="choszczno.php" method="post" name="formularz">
  2. <table>
  3. <tr>
  4. <p>
  5.  
  6. </p>
  7. <td align="right">Temperatura maksymalna: </td>
  8. <td><select name="tempmax">
  9. <option id="Example5Div"></option>
  10. </select></td></tr>
  11.  
  12. <tr>
  13. <td colspan="2" align="right">
  14. <input type="submit" value="Zapisz" /></td>
  15. </tr>
  16. </table>
  17. <script>
  18. function GO(){
  19. setTimeout("subForm()",5000)
  20. }
  21. function subForm(){
  22. document.formularz.submit()
  23. }
  24. onload = GO
  25. </script>

Wysyła co 5sek ale żadne dane nie trafiają do bazy danych. Dlaczego tak się dzieje? Gdzie jest błąd?
robertpiaty
Nie wiwm czy masz świadomość tego że jeśli zostawisz tak jak zrobiłeś i nikogo nie będzie na stronie to nie będzie Ci nic do bazy wpadać, a jak będzie dużo osób to będziesz miał bardzo dużo insertów do bazy. Wracając do Twojego pytania spróbuj zamienić
  1. if(isset($_POST["submit"])) {

na
  1. if(isset($_POST["tempmax"])) {

Nie jestem pewien czy jeśli wysyłasz formularz za pomocą javascript to wysyła się wartość inputa submit.
brzanek
Troszkę zmieniłem kod formularza i po odświerzeniu strony wszystko wpada do bazy danych ale jak zastosowałem crona na moim hostingu nazwa.pl to nic nie dodaje się do bazy danych.
Otrzymuję takiego emaila
Wykonanie zadania: przesyłanie temperatury z choszczna


Standardowe wyjście programu:

<body>
<form method="post" action="choszczno1.php" >
<table>
<tr>
<td align="right">Temperatura maksymalna: </td>
<td><input type='text' name='tempmax' value='4.7'></td></tr>
<tr>
<td colspan="2" align="right">
<input type="submit" id="przycisk" name="submit" value="Zapisz" /></td>
</tr>
</table>
</form><script>
document.getElementById('przycisk').click()
</script>
</body>

Na wyjsciu błędów programu nie było żadnych danych.


Jak widać w value pojawia się temperatura ale dlaczego nie dodaje jej do bazy danych?
Tak wygląda kod php
  1. <?php
  2. $city="Choszczno";
  3. $country="PL"; //Two digit country code
  4. $url="http://api.openweathermap.org/data/2.5/weather?q=Choszczno,pl&units=metric";
  5. $json=file_get_contents($url);
  6. $data=json_decode($json,true);
  7. //Get current Temperature in Celsius
  8.  
  9.  
  10. if(isset($_POST["submit"])) {
  11. include ("db.php");
  12.  
  13. $tempmax = $_POST['tempmax'];
  14. $add = mysql_query("INSERT INTO gorzow(dzien, tempmax) VALUES('".date('Y-m-d H:i:s')."', '$tempmax')");
  15.  
  16. if ($add) {
  17. echo '<p>Dodano do bazy</p>';
  18. } else {
  19. echo mysql_error(); echo '<p>Błąd! Spróbuj ponownie</p>';
  20. }
  21. } else {
  22.  
  23.  
  24.  
  25. <body>
  26. <form method="post" action="choszczno1.php" >
  27.  
  28. <table>
  29. <tr>
  30. <td align="right">Temperatura maksymalna: </td>
  31. <td>';
  32.  
  33. echo "<input type='text' name='tempmax' value='".$data['main']['temp']."'>";
  34. echo '</td></tr>
  35. <tr>
  36. <td colspan="2" align="right">
  37. <input type="submit" id="przycisk" name="submit" value="Zapisz" /></td>
  38. </tr>
  39. </table>
  40. </form>';
  41. ?>
  42. <script>
  43. document.getElementById('przycisk').click()
  44. </script>
  45. <?php
  46. echo '</body>';
  47. }
  48. ?>
CuteOne
1. Jeżeli nie masz zielonego pojęcia o ustawieniach crona, sprawdź sobie tą stronkę https://www.setcronjob.com/
2. Stwórz nowy plik .php, który będzie odpowiedzialny tylko za pobranie danych z API, i ich zapis do bazy (bez html). Link do tego pliku podaj jako target dla crona
3. Stwórz nowy plik .php, który będzie odpowiedzialny tylko za wyświetlenie danych
brzanek
Cytat(CuteOne @ 9.03.2015, 19:37:25 ) *
1. Jeżeli nie masz zielonego pojęcia o ustawieniach crona, sprawdź sobie tą stronkę https://www.setcronjob.com/
2. Stwórz nowy plik .php, który będzie odpowiedzialny tylko za pobranie danych z API, i ich zapis do bazy (bez html). Link do tego pliku podaj jako target dla crona
3. Stwórz nowy plik .php, który będzie odpowiedzialny tylko za wyświetlenie danych

Masz rację nie mam pojęcia o CRONIE dlatego proszę was o pomoc.
Chciałem zrobić tak jak piszesz ale miałem problem z przesłaniem danych z API do bazy dlatego wprowadziłem formularz. HTML'a nie bardzo wiem jak pozbyć się bo jest tam
<script>
document.getElementById('przycisk').click()
</script>
Wiem że można to jakoś inaczej zapisać ale nie wiem jak. I jak mam podać linka do tego jako target dla crona?
Co do wyświetlania to http://djdandi.nazwa.pl/PHP-Fusion-9.00/po.../choszczno.html Tu na wykresie wszystko pobiera się z bazy danych i wyświetla się.
ikssde
CRON wywołuje po prostu plik PHP i nie przekazuje do niego żadnych danych w tablicy $_POST więc część twojego kodu odpowiedzialna za zapis do bazy nigdy się nie wykona. Powiel ten plik i wyrzuć warunki sprawdzające tablice $_POST.
brzanek
Cytat(ikssde @ 9.03.2015, 20:01:33 ) *
CRON wywołuje po prostu plik PHP i nie przekazuje do niego żadnych danych w tablicy $_POST więc część twojego kodu odpowiedzialna za zapis do bazy nigdy się nie wykona. Powiel ten plik i wyrzuć warunki sprawdzające tablice $_POST.

Jak wywalę
$tempmax = $_POST['tempmax'];
to z poziomu strony przesyła pusty rekord do bazy danych więc też tak nie morze być.
Pozbyłem się html ale nadal nic to nie dało.
  1. <?php
  2.  
  3. echo '<body>';
  4. $city="Choszczno";
  5. $country="PL"; //Two digit country code
  6. $url="http://api.openweathermap.org/data/2.5/weather?q=Choszczno,pl&units=metric";
  7. $json=file_get_contents($url);
  8. $data=json_decode($json,true);
  9. //Get current Temperature in Celsius
  10.  
  11. if(isset($_POST["tempmax"])) {
  12. include ("db.php");
  13.  
  14. $tempmax = $_POST['tempmax'];
  15. $add = mysql_query("INSERT INTO gorzow(dzien, tempmax) VALUES('".date('Y-m-d H:i:s')."', '$tempmax')");
  16.  
  17. if ($add) {
  18. echo '<p>Dodano do bazy</p>';
  19. } else {
  20. echo mysql_error(); echo '<p>Błąd! Spróbuj ponownie</p>';
  21. }
  22. } else {
  23. echo '<form method="post" action="choszczno1.php" >
  24.  
  25. <table>
  26. <tr>
  27. <td align="right">Temperatura maksymalna: </td>
  28. <td>';
  29.  
  30. echo "<input type='text' name='tempmax' value='".$data['main']['temp']."'>";
  31. echo '</td></tr>
  32. <tr>
  33. <td colspan="2" align="right">
  34. <input type="submit" id="przycisk" name="submit" value="Zapisz" /></td>
  35. </tr>
  36. </table>
  37. </form>';
  38. echo "<script>
  39. document.getElementById('przycisk').click()
  40. </script>";
  41. echo '</body>';
  42. }
  43. ?>
ikssde
Dlatego pisałem o tym, żebyś stworzył dwa pliki, jeden który będzie wywoływany z przeglądarki, a drugi z CRONa.

Poza tym twój kod jest trochę bez sensu. Najpierw pobierasz dane z jakiegoś API, wstawiasz je do formularza i za pomocą JS automatycznie wysyłasz ten formularz po załadowaniu strony.

Taki sam efekt osiągniesz w ten sposób:

  1.  
  2. $city="Choszczno";
  3. $country="PL"; //Two digit country code
  4. $url="http://api.openweathermap.org/data/2.5/weather?q=Choszczno,pl&units=metric";
  5. $json=file_get_contents($url);
  6. $data=json_decode($json,true);
  7.  
  8. if(isset($data['main']['temp'])) {
  9.  
  10. $tempmax = $data['main']['temp'];
  11.  
  12. include ("db.php");
  13.  
  14. $add = mysql_query("INSERT INTO gorzow(dzien, tempmax) VALUES('".date('Y-m-d H:i:s')."', '$tempmax')");
  15.  
  16. }
  17.  
brzanek
ikssde Wielkie dzięki tym kodem poszło

Napotkałem jeszcze jeden problem ale nie w kodzie a u dostawcy danych o temperaturze. Nie zawsze one działają. A więc mam zamiar zmienić serwis.
Tak wygląda kod uzyskany ze strony accuweather.com w formacie json
  1. [{"LocalObservationDateTime":"2015-03-10T14:35:00+01:00","EpochTime":1425994500,"WeatherText":"Zachmurzenie duże","WeatherIcon":6,"IsDayTime":true,"Temperature":{"Metric":{"Value":9.6,"Unit":"C","UnitType":17},"Imperial":{"Value":49.0,"Unit":"F","UnitType":18}},"MobileLink":"http://m.accuweather.com/pl/pl/choszczno/266525/current-weather/266525","Link":"http://www.accuweather.com/pl/pl/choszczno/266525/current-weather/266525"}]

Robię to na podobnej zasadzie co ty ale mam problem z wyciągnięciem temperatury.
  1. <?php
  2. $jsondata = file_get_contents("http://apidev.accuweather.com/currentconditions/v1/266525.json?language=pl&apikey=xxx");
  3. $json = json_decode($jsondata,true);
  4. echo $json['Temperature']['Metric']['Value'];
  5. ?>

Jak to powinno być odpowiednio zapisane?
ikssde
Spróbuj tak:

  1. echo $json[0]['Temperature']['Metric']['Value'];


Być może to API w jakimś konkretnym przypadku zwraca więcej niż jeden obiekt i trzeba to będzie zrobić inaczej, ale dla jednego rekordu to wystarczy.

@edit

Jakby nie było nawiasów kwadratowych w tym tekście to twój kod by działał.
Jule
Cytat(CuteOne @ 9.03.2015, 20:37:25 ) *
1. Jeżeli nie masz zielonego pojęcia o ustawieniach crona, sprawdź sobie tą stronkę https://www.setcronjob.com/


Użyłem tego cron usługi pracy: https://www.easycron.com. Uważam, że to bardzo łatwe w konfiguracji i obsługuje wiele konfiguracji.
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.