Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Praca z PHP + MYSQL
Forum PHP.pl > Forum > Przedszkole
xenvera
Witajcie.

Mam do was kilka pytań związanych z PHP i MYSQL.

Chcę zrobić bazę danych Hotelu, czyli wszystkich klientów korzystających z wynajmu pokojów. Posiadam baze danych w której dodaję Imie, data przyjazdu itd idąc dalej nie wiem jak zrobić aby automatyczne skrypt liczył ilość dni ile dany klient przebywa w hotelu oraz mnożenie to przez kwotę noclegu (czyli. Przyjechałem 19.10.2014 do hotelu, 20.10.2014 opuszczam pokój czyli skrypt powinien odjąć(?) 20-19 = 1 * (koszt noclegu) = kwota zł.) Oraz aby wyświetlał wynik w tabeli.

Skrypt wygląda na razie tak:

  1. <?php
  2. require_once('config.php');
  3. include('index.php');
  4.  
  5. $ilosc = mysql_query("SELECT * FROM `klient`");
  6. $ilosc_klientow = mysql_num_rows($ilosc);
  7.  
  8. if($ilosc_klientow > 0)
  9. {
  10. echo '<center><font size="5">Aktualnie jest <b><font color="GREEN">'.$ilosc_klientow.'</font> </b>klientów!</font></center>';
  11. }
  12. else
  13. {
  14. echo '<center><font size="5">Aktualnie nie ma żadnych klientów!</font></center>';
  15. }
  16.  
  17. ///Dane szczegółowe
  18.  
  19. $dane = "SELECT id,imie,lozko,ilosc_dni,dzien, miesiac, rok ,data_dodania FROM `klient`";
  20. $a = 25;
  21. $wynik = mysql_query($dane);
  22. echo '<center><p>';
  23. echo '<table border="1" width="1000">';
  24. echo '<tr>';
  25. echo '<td bgcolor="orange">Identyfikator</td>';
  26. echo '<td bgcolor="orange">Imie</td>';
  27. echo '<td bgcolor="orange">Numer łóżka</td>';
  28. echo '<td bgcolor="orange">Przyjechał dnia';
  29. echo '<td bgcolor="orange">Do zapłaty</td>';
  30. echo '<td bgcolor="orange">Przenieś do archiwum!</td>';
  31. echo '</tr>';
  32.  
  33. while ($row = mysql_fetch_row($wynik))
  34. {
  35. echo '</tr>';
  36. echo '<td>'.$row[0].'</td>';
  37. echo '<td>'.$row[1].'</td>';
  38. echo '<td>'.$row[2].'</td>';
  39. echo '<td>'.$row[4].' '.$row[5].' '.$row[6].'</td>'; ///data
  40. echo '<td>KWOTA zł</td>';
  41. echo '<td><center><input type="submit" name="przenies" value="Przenieś!"></center></td>';
  42.  
  43. }
  44. echo '</table><br>';
  45. echo '<table border="1" width="600">';
  46. echo '<tr>';
  47. echo '<td>Suma</td>';
  48. echo '<td> zł</td>';
  49. echo '</table>';
  50.  
  51.  
  52. ?>






I co nikt nie wie jak to zrobić ? :<
Dejmien_85
Panowie i Panie, ogłaszam wszem i wobec, że jeśli ktoś nie weźmie się za te tutoriale z sieci uczące tak karygodnych praktyk, wtedy ja sam się za to wezmę. Zacznę niszczyć internety!

Kolego, to co tutaj poczyniłeś to przestępstwo - złamałeś jedno z ważniejszych przykazań developerów, tj. nie miesza się widoku z kodem. Proszę o natychmiastowe przemyślenie designu i oddzielenie widoku od kodu.

Najpierw niech wykona się logika, później wynik przekaż do widoku (stwórz plik .php, w którym będziesz miał tylko tą tabelkę i zmienną, która się wyświetli i na samej górze załącz pliczek z logiką).

Poza tym korzystasz z mysql_query - oj nie, tak się nie robi, to przestarzała funkcja korzystająca z przestarzałego sterownika do obsługi baz danych, przestań tego używać. To praktyki stosowane jeszcze przed 2004 rokiem! Przekształć to na PDO, albo na mysqli (z "i" na końcu).

Gdy wykonasz powyższe czynności, wtedy będzie można pogadać dalej. wink.gif
ShaggyAG
http://us1.php.net/manual/pl/datetime.diff.php
xenvera
Cytat(Dejmien_85 @ 22.10.2014, 22:03:23 ) *
Panowie i Panie, ogłaszam wszem i wobec, że jeśli ktoś nie weźmie się za te tutoriale z sieci uczące tak karygodnych praktyk, wtedy ja sam się za to wezmę. Zacznę niszczyć internety!

Kolego, to co tutaj poczyniłeś to przestępstwo - złamałeś jedno z ważniejszych przykazań developerów, tj. nie miesza się widoku z kodem. Proszę o natychmiastowe przemyślenie designu i oddzielenie widoku od kodu.

Najpierw niech wykona się logika, później wynik przekaż do widoku (stwórz plik .php, w którym będziesz miał tylko tą tabelkę i zmienną, która się wyświetli i na samej górze załącz pliczek z logiką).

Poza tym korzystasz z mysql_query - oj nie, tak się nie robi, to przestarzała funkcja korzystająca z przestarzałego sterownika do obsługi baz danych, przestań tego używać. To praktyki stosowane jeszcze przed 2004 rokiem! Przekształć to na PDO, albo na mysqli (z "i" na końcu).

Gdy wykonasz powyższe czynności, wtedy będzie można pogadać dalej. wink.gif


Zamiast się tak rozpisywać i udawać super programistę odpowiedziałbyś na temat a nie atakował początkującego smile.gif

Cytat(ShaggyAG @ 22.10.2014, 23:53:48 ) *


Dzięki!
Boshi
To nie atak, to porada. Choć wg mnie powiedziec początkującemu by nie mieszał widoku z kodem wykonawczym to jak samobójstwo. Ktoś kto się dopiero uczy składni itd nie będzie zaprzątał sobie głowy czy html ma być w kodzie czy nie. Myslę, że z czasem przychodzi pora na pisanie coraz bardziej ludzkich skryptów.

A jeżeli chodzi o poradniki w necie, to jest tego od groma tyle, że 95% jest przestarzałych do kości.

xenvera
Ostatnie pytanie na szybko związane ze skryptem, chcę zaksięgować wpłatę klienta jednak po dodaniu do bazy wynik jest 0, dlaczego?

  1. while ($row = mysql_fetch_array($wynik))
  2. {
  3. echo '</tr>';
  4. echo ''; //Tutaj było ID
  5. echo '<td>'.$row['imie'].'</td>';
  6. echo '<td>'.$row['lozko'].'</td>';
  7. echo '<td>'.$row['dzien'].' - '.$row['miesiac'].' - '.$row['rok'].'</td>'; ///data
  8. echo '<td>'.$row['data_dodania'].'</td>';
  9. $data_dodania = $row['data_dodania'];
  10. $date1 = strtotime($data_dodania); ///Data dodania mysql
  11. $date2 = time(); ///Aktualny czas
  12. $subTime = $date2 - $date1; ///Obliczenie ilosc dni
  13. $d = ($subTime/(60*60*24))%365; ///
  14. $oblicz = $d * $koszt;
  15. echo '<td><center>'.$oblicz.' zł</center></td>';
  16. echo '<td><center><input type="checkbox" name="zaplacil[]" value="'.$row['id'].'"/></center></td>';
  17. echo '<td><center><input type="checkbox" name="delete[]" value="'.$row['id'].'"></center></td>';



  1. if (isset($_GET['zaplacil']))
  2. {
  3. $zaplacil = $_GET['zaplacil'];
  4. $kwotadb = mysql_query('UPDATE `klient` SET kwota = '.$oblicz.' WHERE id IN ('.implode(',', $_GET['zaplacil']).')');
  5. if($kwotadb)
  6. {
  7. echo '<font color="green"><b>Klient zapłacił!!!</b></font>';
  8. }
  9. else
  10. {
  11. echo 'Blad '.mysql_error();
  12. echo '</table></br>';
  13. }
  14. }

nospor
Bo nigdzie przed UPDATE nie wyliczasz $oblicz? To ze gdzies na innej stronie wyliczyles w liscie, nie znaczy, ze ta zmienna w magiczny sposob sie przeniesie.
xenvera
Cytat(nospor @ 23.10.2014, 19:20:50 ) *
Bo nigdzie przed UPDATE nie wyliczasz $oblicz? To ze gdzies na innej stronie wyliczyles w liscie, nie znaczy, ze ta zmienna w magiczny sposob sie przeniesie.


To jest wszystko w jednym pliku....

Jak zamiast $oblicz daje np $koszt to w bazie normalnie wyswietla np. 25. Ale wyniku z oblicz juz nie dodaje...
Boshi
A jaką wartość ma zmienna koszt?
  1. $koszt
? albo nie widzę, albo matematyka podpowiada, że wartość * 0 =0
xenvera
  1. $data_dodania = $row['data_dodania'];
  2. $date1 = strtotime($data_dodania); ///Data dodania mysql
  3. $date2 = time(); ///Aktualny czas
  4. $subTime = $date2 - $date1; ///Obliczenie ilosc dni
  5. $d = ($subTime/(60*60*24))%365; ///
  6. $koszt = 25;
  7. $oblicz = $d * $koszt;
  8.  
  9.  
  10. echo '<td><center>'.$oblicz.' zł</center></td>';
  11.  
  12. echo '<td><center><input type="checkbox" name="zaplacil[]" value="'.$row['id'].'"/></center></td>';
  13. echo '<td><center><input type="checkbox" name="delete[]" value="'.$row['id'].'"></center></td>';
  14. echo '</tr>';
  15.  
  16. }
  17. echo '</table><br>';
  18. echo '<center><input type="submit" value="Wykonaj"</center>';
  19. echo '</form>';
  20.  
  21. ///Zaplata
  22. if (isset($_GET['zaplacil']))
  23. {
  24. $zaplacil = $_GET['zaplacil'];
  25.  
  26.  
  27. $kwotadb = mysql_query('UPDATE `klient` SET kwota = '.$oblicz.' WHERE id IN ('.implode(',', $_GET['zaplacil']).')');
  28.  
  29. if($kwotadb)
  30. {
  31. echo 'ZAPLACIŁ';
  32. }
  33. else
  34. {
  35. echo 'BLAD';
  36. }
  37. }
nospor
Cytat
To jest wszystko w jednym pliku....
Ok.... Po raz kolejny piszę: sprawdzajcie co wkladacie. TO nie jest żaden wyczyn tylko podstawa podstaw podstawowych podstaw....

  1. var_dump($oblicz);// O TU PRZED SAMYM UPDATE NALEZY SPRAWDZIC CZY OBY NA PEWNO TA ZMIENNA ZAWIERA CO MYSLISZ ZE ZAWIERA
  2. $kwotadb = mysql_query('UPDATE `klient` SET kwota = '.$oblicz.' WHERE id IN ('.implode(',', $_GET['zaplacil']).')');
xenvera
Powiem tak, var_dump zawiera faktycznie wyniki co widać na obrazku.
Jednak jest problem, jak zaznaczam klienta który ma zapłacić 425 zł to zmienna cały czas ma w pamieci wynik 575. I zamiast 425 dodaje 575 do bazy ...

nospor
No i zgadza sie. Oblicz robisz z listy a masz robic z tego co wysylasz, wiec masz źle.
xenvera
Nie no, nie mam pojęcia ani nawet pomysłu jak to zrobić. :|
ShaggyAG
Liczysz oblicz w petli dlatego zmienna pamięta ostatni wynik. I to jego dodaje przy updacie.
Dodaj sobie w tabeli dla każdego klienta pole "do zapłaty" i przy liczeniu oblicz rób update.
a pole zapłata updatuj na true jak jest faktyczna zapłata.
xenvera
Gdzie mam wcisnąć te obliczenia, skoro do każdego potrzebuje ID klienta nie musi być do tego pętli ? Inaczej mi jakoś to nie chce iśc...
W tabeli mam "kwota" a w formularzu Do zapłaty, i przy updacie zmienia pole w tabeli "kwota" na jakąś tam kwotę wychodzącą z obliczeń.
ShaggyAG
W bazie też musisz mieć jakieś pole tyu "zapłacono" tak jak masz w formularzu.
Rozwiązań jest wiele, ja bym to zrobil tak że w tym skrypcie co masz wsadził bym sobie if() który by sprawdzał czy dla danego ID pole w "zapłacono" DB ma wartośc true. Jeżeli tak to w echo wysyłasz np "ok" a jak nie to w echo wysyłasz przycisk z przekierowaniem do fucnkcji (z parametrem z ID) z ajaxem która by zrobiła tylko update na zapłacono.
xenvera
No z ajaxem generalnie jeszcze nic nie zaczynałem, nie dało by się tego w prostszy sposób zrobić?


@Po prostu nie wiem jak dopisać $oblicz do osobnych klientów w zapytaniu..



Ktoś, coś? :S

Więc jak przed Updatem mam dodać znowu wszystkie obliczenia ?


F5
Turson
Zadaj po ludzku pytanie
xenvera
Mam problem ze skryptem którym Updatuje w bazie danych kwotę jaką zapłacił losowy Kowalski za nocleg:


Problem w tym, że zmienna obliczająca dodaje mi cały czas tylko 1 wynik do bazy. Czyli jak odznaczam "ASDASD" i wykonuje że zapłacił to Updatuje mi kwotę 575 zł która należy do "123123123~".

//W postach wyżej nospor podpowiadał mi co mam zrobić, jednak na prawdę próbowałem i nie wyszło, szukałem przykładów ale też cieżko znaleźć coś podobnego.

  1. while ($row = mysql_fetch_array($wynik))
  2. {
  3. echo '<tr>';
  4. echo ''; //Tutaj było ID
  5. echo '<td>'.$row['imie'].'</td>';
  6. echo '<td>'.$row['lozko'].'</td>';
  7. echo ''; // tutaj bylo dzien miesiac rok
  8. echo '<td>'.$row['data_dodania'].'</td>';
  9. $data_dodania = $row['data_dodania'];
  10. $date1 = strtotime($data_dodania); ///Data dodania mysql
  11. $date2 = time(); ///Aktualny czas
  12.  
  13. $subTime = $date2 - $date1; ///Obliczenie ilosc dni
  14. $y = ($subTime/(60*60*24*365));
  15. $m = ($subTime/60)%60;
  16. $d = ($subTime/(60*60*24))%365; ///
  17. $koszt = 25;
  18. $oblicz = $d * $koszt;
  19. var_dump($oblicz);
  20.  
  21. echo '<td><center>'.$oblicz.' zł</center></td>';
  22.  
  23.  
  24. if($row['kwota'] > 0)
  25. {
  26.  
  27. echo '<td><center><input type="checkbox" name="zaplacil[]" value="" disabled="disabled"/></center></td>';
  28. }
  29.  
  30. else
  31. {
  32. echo '<td><center><input type="checkbox" name="zaplacil[]" value="'.$row['id'].'"/></center></td>';
  33. }
  34.  
  35. if($row['kwota'] == 0)
  36. {
  37. echo '<td><center><b><font color="RED">NIEZAPŁACONO!</b></font></center></td>';
  38. }
  39. else
  40. {
  41. echo '<td><center><b><font color="GREEN">ZAPŁACONO!</b></font></center></td>';
  42. }
  43.  
  44. echo '<td><center><input type="checkbox" name="delete[]" value="'.$row['id'].'"></center></td>';
  45. echo '<td><a href="klienci.php?dane=edytuj&id='.$row['id'].'"/>Edytuj</a></td>';
  46. echo '</tr>';
  47.  
  48. }
  49. echo '</table><br>';
  50. echo '<center><input type="submit" value="Wykonaj"</center>';
  51. echo '</form>';
  52.  
  53. ///Zaplata
  54. if (isset($_GET['zaplacil']))
  55. {
  56. $zaplacil = $_GET['zaplacil'];
  57.  
  58. var_dump($oblicz);
  59. $kwotadb = mysql_query('UPDATE `klienci` SET kwota = '.$oblicz.' WHERE id IN ('.implode(',', $_GET['zaplacil']).')');
  60.  
  61. if($kwotadb)
  62. {
  63. echo 'ZAPLACIŁ';
  64. }
  65. else
  66. {
  67. echo 'BLAD';
  68. }
  69. }


f10

f11
borabora
masz pętlę, w niej obliczasz zmienną $oblicz. Zapamiętana zostaje ostatnio obliczona wartość. Możesz w środku pętli zrobić tablicę, gdzie kluczem będzie id usera, a wartością $oblicz i w updacie odwoływać się do niej przez id usera
xenvera
Udało mi się, jednak został mi ostatni problem.
Kiedy zaznaczę np 2 klientów którzy mają do zapłaty np. 10 i 15 zł, to w updajcie dodaje mi dla obu np. 10zł.

Co do błędu $oblicz, zrobiłem tak. Dodałem nowe zapytanie przed update w którym pobrałem id usera zaznaczonego w tabeli później obliczyłem jego kwotę do zapłaty i update.
borabora
bo masz takie zapytanie:
  1. 'UPDATE `klienci` SET kwota = '.$oblicz.' WHERE id IN ('.implode(',', $_GET['zaplacil']).')'

skrypt dodaje wartość $oblicz dla kazdego w tablicy.
możesz dać foreach dla $_GET['zaplacil'] i updatować każdego osobno
xenvera
foreach ma być w updajcie ? Bo z tego co widze to wywala błędy.
borabora
nie. update w foreach(){tutaj}
xenvera
foreach(update ....);
tak ?
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.