Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mecze z bazy danych wyswietlane na stronie
Forum PHP.pl > Forum > Bazy danych
BienuSS
Witam
Jeśli dałby ktoś rade odpowiedzieć mi na poniższe pytania albo podesłać link do artykułu byłbym bardzo wzdzieczny.
Chce na swojej stronie dodać mecze które sam będę wpisywał do bazy danych a w html beda wyswietlane i tutaj mam pare pytań:
1. W każdym meczu będą tego samego rodzaju zmienne tzn. druzyna 1, druzyna 2, czas meczu itd. Ale kazdy mecz bedzie miał inne id, jak to ogolnie wpisac w bazie? normalnie za kolejnoscia kolejne id. czy jak?
2. Jak sie mecz skonczy chce zeby mecz był juz w innej karcie tzw. "match history", jak sie zacznie zeby zniknał z głównej strony (ale to juz chyba js)jak to ogolnie zrobic?

Tomplus
Kod
idMeczu | typ_rozgrywek | druzyna_1 | druzyna_2 | wynik_1 | wynik_2 | data_meczu | godzina_rozpoczecia | godzina_zakonczenia | status_meczu |
12345 | 1 | 123 | 456 | 3 | 0 | 2017.11.04 | 19:00 | 20:51 | 1 | -- mecz rozegrany
12346 | 1 | 456 | 123 | 0 | 1 | 2017.11.06 | 19:00 | 00:00 | 0 | -- mecz trwajacy
12347 | 2 | 789 | 345 | 0 | 0 | 2017.11.10 | 18:00 | 00:00 | 0 | -- mecz zaplanowany


123, 456, 789. 345 to ID klubów/reprezentacji
status_meczu oznacza 1 to rozegrany i trafia do match_history, a 0 to trwające lub zaplanowane. Posortowane wg daty rozpoczęcia, czyli te z datą najstarszą (czyli najbliższą daty aktualnej)
typ_rozgrywek - 1 jako mecz ligowy, 2 jako mecz np. pucharowy

I tak można rozbudowywać.

Można np. dodać kolejną tabelę gdzie będą zapisywane wydarzenia ze spotkania (kartki, gole, zmiany)
Kod
id | idMeczu | typWydarzenia | minuta | coSieWydarzylo |



BienuSS
Dzięki wielkie MORDO! Mam jeszcze tylko jedno pytanko jakbym chciał dodać tzw. strefe typera to wtedy tak:

Kod
id_użytkownika | idMeczu | typ | resultat ||

?


A jak zrobić żeby wyświetlały sie wszystkie wpisane mecze które sie nie rozpoczeły ? Bo po wpisaniu nowych meczy do bazy danych nie bede wpisywał do każdego osobnego diva id_meczu..... przynajmniej mam nadzieje.. smile.gif
Tomplus
w przypadku wyników meczu najlepiej podawać jako dwie kolumny, no chyba że zakładasz tylko że albo użytkownik trafił wynik albo nie: czyli 1:1 i 0:0 to wynik nie trafiony.

Oczywiście że nie, wystarczy stworzyć odpowiednie zapytanie,
Kod
SELECT {columny} FROM {tabele} WHERE status_meczu = 0 AND CONCAT(data_meczu,' ',godzina_rozpoczecia) < NOW()


zamiast CONCAT można też użyć:
DATEDIFF() - zwracająca ilość dni, więc np. jeżeli = 0 to mecze z dzisiaj, a 1 to mecze z jutra ( DATEDIFF(`data_meczu`, DATETIME()) ).

BienuSS
Mam jeszcze trzy pytanka

1.Każdy mecz ma inne id, i jak zrobić żeby na stronie w każdym divie wyświetlały sie te same rodzaje danych tj. typ rozgrywek, drużyna1, druzyna 2. Ale w każdym divie były one inne bo dotyczą innego id_meczu? Chodzi mi o to jak to wpisać w html/php.

2. Jak zrobić żeby na stronie wyświetlało sie tylko tyle divów ile jest meczy nadchodzących

3.Od nośnie czasu do meczu, do ogólnego skryptu do wyświetlania danych z bazy danych musze dodać polecenie żeby status meczu był 0, no okey ale nie lepiej zrobić tak żeby wypisać z tabeli dokładną godzine meczu i za pomocą JS sprawdzić ile pozostało i jeśli już trwa albo sie zakończył to wykreślić go z głównej strony i przenieść do histori?
Tomplus
1. JOIN i jego wariacje w zapytaniu SQL.

2. tworzysz odpowiednie zapytanie, a potem korzystasz z FOREACH lub WHILE w PHP.

3. Status meczu oznacza czy mecz został rozegrany lub nie. Dzięki temu wszystkie wyniki możesz trzymać w jednej tabeli, a nie w dwóch, co jest dobre bo nie musisz robić podwójnych, albo potrójnych zapytań:
INSERT -> w nowej tabeli
DELETE -> w starej tabeli
UPDATE -> w nowej/lub starej tabeli (bo w końcu trzeba jeszcze wpisać datę zakończenia meczu)

Korzystanie z JS nie jests złym pomysłem. Ale wysyłając zapytanie, to skrypt ma odpytywać konkretny mecz, albo pulę spotkań.
Np. status 0 i dzień: DZISIAJ
BienuSS
JOIN służy ogólnie do łączenia tabel, a ja w jednej tabeli mam wszystkie dane, no chyba że nie znalazłem tego dokładnie o co ci chodziło. Jak wyświetlam rekordy za pomoca echo w głównym kodzie php to wyswietlaja sie pieknie ładnie wszytskie, natomiast jak wpisze do divów już tylko np. <?echo "$team_1"?> to wyświetla sie tylko ostatni rekord w każdym divie. Myśle teraz żeby jakoś zostosować to: mysql_fetch_array
Tomplus
Jak coś, lepiej skup się na łączeniu z bazą danych za pomocą PDO.
Funkcje mysql_ są wycofywane z PHP.

Szczerze mówiąc nie wiem do końca co robisz. Bo co to jest główny kod PHP u Ciebie?

W normalnych warunkach programowania proceduralnego to coś takiego. Oczywiście przedstawiam to w WIELKIM SKRÓCIE.
  1. <?php
  2. $string = '';
  3. $tablica = {zapytanie_mysql};
  4. foreach($tablica as $col) {
  5.  
  6. $string .= "
  7. <div class='item-match>
  8. {$col['nazwa-gospodarz']}-{$col['nazwa-gosc']} {$col['wynik-gospodarz']}-{$col['wynik-gosc']}
  9. </div>";
  10.  
  11. }
  12. ?>
  13. <html><head></head>
  14. <body>
  15.  
  16. <section id='listaSpotkan'>
  17. <?php
  18. echo $string;
  19. ?>
  20. </div>
  21. </body></html>
BienuSS
Ok spróbuje zrobić to jak pokazałeś, w moim rozumieniu główny kod php to chodziło mi o ten pierwszy kod co napisałeś ( tj. łączenie sie z bazą danych, zmienne itd.)

<?
$query="SELECT * FROM games
WHERE status = 0 AND CONCAT(date_match,' ',time_match) > NOW()
ORDER BY date_match, time_match;";

$result=mysql_query($query);
$num=mysql_num_rows($result);

$i=0;
$tablica = array();
while ($i < $num) {


$team_1=mysql_result($result,$i,"team_1");
$team_2=mysql_result($result,$i,"team_2");
$date_match=mysql_result($result,$i,"date_match");
$time_match=mysql_result($result,$i,"time_match");
$status=mysql_result($result,$i,"status");






$tablica_team_1[$i]=$team_1;
$tablica_team_2[$i]=$team_2;
$tablica_date_match[$i]=$date_match;
$tablica_time_match[$i]=$time_match;
$tablica_status[$i]=$status;





$i++;
}


i w html podstawiałem np. $tablica_team_1[0],$tablica_team_1[1]

Kumpel pomógł mi to zrobić bo nie szło mi twoim sposobem. Co uważasz żeby tak to wykorzystac?
Tomplus
1. Stosuj tagi [PHP ] dla kodu php na forum.
2. Formatuj kod, stosuj 4 spacje lub 1 tabulator.
3. Jak już mówiłem mysql_* są depracated... na nowszych wersjach np. PHP7 już nie użyjesz takich funkcji.
Dlatego stosuj PDO, jak coś możesz użyć jakąś bibliotekę upraszczającą zapytania PDO np.: https://github.com/wickyaswal/indieteq-php-...-database-class

Wtedy otrzymasz coś takiego:

  1. $db = new Db();
  2. $query="SELECT `team_1`, `team_2`, `date_match`, `time_match`, `status` FROM `games`
  3. WHERE `status` = :status AND CONCAT(`date_match`,' ',`time_match`) > NOW()
  4. ORDER BY `date_match`, `time_match`
  5. LIMIT :limit;";
  6. $games = $db->query($query, ['status' => 0, 'limit' => 20]);
  7.  
  8. foreach($games as $i => $game) {
  9. $tablica_team_1[$i] = $game['team_1'];
  10. $tablica_team_2[$i] = $game['team_2'];
  11. $tablica_date_match[$i] = $game['date_match'];
  12. $tablica_time_match[$i] = $game['time_match']
  13. $tablica_status[$i] = $game['status'];
  14. }



Swoją drogą, nie wiem co to za zmienne tj. $tablica_team_1[$i]. Ale wiem że sam kiedyś tak pisałem, naprawdę zalecam nie twórz sobie takich zmiennych, bo tylko utrudniasz sobie pracę.
Stosuj normalne tablice np. $mecz[$id][$atrybut] = $wartosc.

Już nie mówiąc że w tej chwili zmienna $games jest tablicą która zawiera wszystkie elementy które są w $tablica_*
BienuSS
Skrypt dokładnie wygląda tak i działa perfekcyjnie
  1.  
  2. <?
  3. require("Db.class.php");
  4.  
  5. $db = new Db();
  6.  
  7. $query="SELECT `id_match`,`type_match`,`team1_img`,`team_1`, `team_2`,`team2_img`,`date_match`, `time_match`, `status` FROM `games`
  8. WHERE `status` = :status AND CONCAT(`date_match`,' ',`time_match`) > NOW()
  9. ORDER BY `date_match`, `time_match`
  10. LIMIT :limit;";
  11.  
  12. $games = $db->query($query, ['status' => 0, 'limit' => 20]);
  13.  
  14. foreach($games as $i => $game) {
  15. $tablica_id_match[$i] = $game['id_match'];
  16. $tablica_type_match[$i] = $game['type_match'];
  17. $tablica_team1_img[$i] = $game['team1_img'];
  18. $tablica_team_1[$i] = $game['team_1'];
  19. $tablica_team_2[$i] = $game['team_2'];
  20. $tablica_team2_img[$i] = $game['team2_img'];
  21. $tablica_date_match[$i] = $game['date_match'];
  22. $tablica_time_match[$i] = $game['time_match'];
  23. $tablica_status[$i] = $game['status'];
  24. }
  25. ?>


"Stosuj normalne tablice np. $mecz[$id][$atrybut] = $wartosc."

A co jak id pobiera mi z bazy danych?Tak to zapisać $mecz[$id_match][$team_1] ?

I jeszcze a pro po numerowania później poszczególnych wartości (np. <?echo "$tablica_team_1[0]"?>) Będe robił pętle gdzie chce zrobić tak żeby tyle ile jest wierszy z zapytania (tyle ile meczy zwraca) tyle mi wyświetla divów. I wstawiając później te wartośći w pętli dać tak: <?echo "$tablica_team_1[$i]"?>?

A jeszcze jedno, z tyl limitem " 'limit' => 20" to chodzi o to że max 20 rekordów sie wyświetli ?
Tomplus
Tak, przecież nie ma potrzeby aby wyświetlały Ci się wszystkie mecze.

Już samym foreach() powyżej możesz rozpocząć tworzenie listy spotkań dla HTML.

  1. $listaSpotkan = '';
  2. foreach($games as $i => $game) {
  3.  
  4. $listaSpotkan .= "
  5. <div>
  6. Mecz ".$game['team_1']." vs ".$game['team_2']."
  7. <br>Rozpocznie się: {$game['date_match']} {$game['time_match']}
  8. </div>
  9. ";
  10. }
  11.  
  12. //... gdzieśtam w kodzie

Kod
<body>
<?php echo $listaSpotkan; ?>
</body>



Zalecane jest stosowanie takich znaczników: <?php niż skróconych <?

Poczytaj sobie:
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
BienuSS
Mam 2 pytanka tongue.gif :

1.A co w przypadku gdy do formularza chce id_meczu z aktualnego diva?( po kliknieciu w przycisk na tym divie wyświetla sie pop-up z formularzem) Nie wrzuce tego do całości skryptu php, bo mam tam js, i właśnie jak wyciągnąć id_meczu z aktualnego diva ? Czytałem coś o preg_match

2. Czy do zmiennej $listaSpotkan .= " moge wrzucić kod js w którym jest część html ?

3.Korzystając z PDO, jak używam takiego zapytania
Kod
$games = $db->query($query, ['status' => 0, 'limit' => 20]);
to automatycznie chronie sie przed SQL injection ?
Tomplus
Pobranie id i wykorzystanie go dalej na stronie np. wysłanie do formularza AJAX jest proste, wystarczy użyć JS, tudzież z JS z jQuery. Działający orzykład tutaj: https://jsfiddle.net/h05n75ar/

Kod HTML, przykładowy - zauważ ze do każdego DIV dodaje atrybut data-* z ID spotkania z bazy

Kod
<div class='matchDiv' data-id-match='456'>
  <button/>
</div>
<div class='matchDiv' data-id-match='123'>
  <button/>
</div>
<div class='matchDiv' data-id-match='234'>
  <button/>
</div>


Kod JS, przykładowy - tutaj tylko pokazuję alert, ale można z tym ID robić co się chce, np. użyć funkcji .ajax()
Tako kod wystarczy aby był dodany do stopki strony, przed </body>

Kod
$('div.matchDiv button').click(function() {
  var idMatch = $(this).parent().data('idMatch');
  alert("Pobrane Id: " + idMatch)
});



3. PDO
Bibliotekę którą Ci zaproponowałem, jest oparta na PDO, więc tak chroni przed SQL Injection, nie potrzeba dodatkowych funkcji, co nie oznacza że powinieneś mieć 100% zaufanie. Po prostu musisz wiedzieć jakie wartości możesz wprowadzać, aby nie było sytuacji że dopuszczasz że to kolumny typu integer dopuszczasz możliwość dodania wartości typu string. Dlatego warto dodając do bind string należy chronić przed skażonym kodem np. gdy ktoś spróbuje wpisać kod JavaScript.

Tutaj masz krótki artykuł na temat SQL Injection z PDO: http://lukasz-socha.pl/php/niebezpieczny-kod-sql-injection/


BienuSS
A jak bym chciał to id wykorzystać poza tym divem? Konkretnie chodzi mi o to że w divie z meczem( w tym skrypcie php) jest przycisk po czym wyświetla sie okienko POP-up i do tego okienka chce to wykorzystać. Okienko jest odpowiedzialne za wysyłanie fomrularza( Liga Typera) i potrzebuje do tego właśnie id danego meczu
Tomplus
Czas trochę pouczyć się JS.

Wystarczy przeredagować:
$('div.matchDiv button') i aby odnosiło się to do przycisku twojego pop'a.
BienuSS
Wiem że pytam Cie o naprawde dużą ilość i jestem Ci z tego powody bardzo wzdzięczny ale to nie chodzi o przerobienie $('div.matchDiv button') ponieważ skrypt pobiera id z rodzica aktualnego diva, a mój pop-up jest zrobiony jako wgl osobny div.To co mi napisałeś już stestowałem. I naprawde zanim napisze coś na forum próbuje sam przez 1-2 dni coś popróbować niż truć znowu dupe o jakieś pierdoły. Spróbuje teraz zrobić to za pomocą funkcji $("#test3").closest("#test1")
viking
Pobierz to w JS. Np po kliknięciu w jakiś button w twoim okienku wybierz interesujący cię element, albo w ogóle zanim stworzysz okno przepisz gdzieś do niego albo zmiennej potrzebny id. To są podstawowe manipulacje na drzewie DOM których musisz się nauczyć jeśli chcesz coś dalej zrobić.
BienuSS
Właśnie poprzestane chyba teraz jakiegokolwiek pisania tej strony, i bede sie uczył wszystkiego po kolei w JS. Spróbuje teraz zrobić to za pomocą funkcji $("#test3").closest("#test1")
Tomplus
Zamiast się zniechęcać, to prostu nie używaj narzędzi JS które utrudniają pracę. na trudniejszych rzeczach skup się później. I tak nie zrobić interaktywnej strony, skoro nie masz wiedzy i doświadczenia w projektowaniu stron WWW.

Dlatego zamiast otwierać w okienko pop-up. Otwórz stronę w nowym oknie przeglądarki.
BienuSS
Cytat(Tomplus @ 18.11.2017, 16:30:24 ) *
Zamiast się zniechęcać, to prostu nie używaj narzędzi JS które utrudniają pracę na trudniejszych rzeczach skup się później.


Utrudniają pracę ale strona bez JS to nie strona na te czasy. Na trudniejszych rzeczach chce sie skupić właśnie teraz bo html i css ogarniam już dobrze, teraz własnie chce sie uczyć php,my sql i JS



Cytat(Tomplus @ 18.11.2017, 16:30:24 ) *
I tak nie zrobisz interaktywnej strony, skoro nie masz wiedzy i doświadczenia w projektowaniu stron WWW.


Może masz racje, ale mam nadzieje że nie! I będę dalej próbował swoich sił w moim projekcie
Doświadczenia nie mam, ale kiedyś trzeba je nabyć

Po napisaniu całej strony chciałbym żeby ktoś przejrzał cały kod i w razie czego poprowiał to co trzeba, i pytanie czy ktokolwiek by sie tego podjął i ile by kosztowała taka usługa ?
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-2024 Invision Power Services, Inc.