Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] pytanie odnośnie mini gry
Forum PHP.pl > Forum > Przedszkole
grzegosh
Witam.
Jestem amatorem jeśli chodzi o php i mysqla, uczę się go od kilku dni. Problemem nie jest dla mnie składnia php, bo dobrze znam składnię C++, która jest podobna, lecz ogranicza mnie wyobraźnia...

Mianowicie, chciałem zrobić sobie taką mini grę. Tzn rejestrujesz się, logujesz i masz jakąś tam postać, której możesz rozdać np 20 statystyk (np do siły, zręczności itp). Potem, wybierasz innego usera i walczysz z nim.
Stworzyłem (a raczej połączyłem 2 i przerobiłem lekko) system logowania i rejestrowania.
I tutaj zaczyna się problem.
Może po kolei. Tabela do logowania wygląda tak:
  1. CREATE TABLE `users` (
  2. `user_id` INT NOT NULL AUTO_INCREMENT ,
  3. `user_login` VARCHAR( 30 ),
  4. `user_haslo` VARCHAR( 32 ),
  5. PRIMARY KEY ( `user_id` )
  6. );


Podczas rejestracji, zapisywany jest login oraz zakodowane md5 hasło.
No i co dalej?
Myślę, że stworzyć tabelę np wojownik, w której będzie wojownik_id, user_id (z tabeli users), sila, zrecznosc etc...
I tu się już gubię... Nie wiem jak powiązać te tabele, tak, by jak ktoś zalogiuje się swoim loginem i haslem, zobaczył statystyki czyli nick, sila itp tylko swojego wojownika.
Tzn logując się by miał dostęp do swojej postaci i jej statystyk, które są zapisane w innej tabeli.
Nie wiem nawet jak wyświetlić owe statystyki przypisane do zalogowanego użytkownika.

Prosiłbym o pomoc, za którą bardzo bym podziękował.
Jeśli potrzeba, wrzucę kod wszystkich obecnych plików.
Shili
Wiesz, ogólnie trudno będzie przeprowadzić dla Ciebie cały kurs języka sql i powiązania go z php. Poucz się za pomocą jakiegoś kursu tworzyć bardziej złożone zapytania, to czasem może być fajna zabawa smile.gif
tak na szybko najprostsze zapytanie wybierające wojowników użytkownika numer 1 to:
  1. SELECT * FROM wojownik WHERE user_id = 1;

Nie wiem jak logujesz co prawda, ale pewnie do user_id gdzies tam dostęp masz. Jesli nie masz, to wyłuskaj go z zapisywanych podczas logowania danych.

Jeśli w tabeli wojownik dasz identyfikator usera, to te dwie tabele już automatycznie będą połączone ze sobą.
grzegosh
Dzięki za odpowiedź to po pierwsze.
Next to, jaki kurs byś polecał? Przerabiałem już sporo, może jakiś ominąłem.

Widzisz, zapytanie, które mi napisałeś miałem już wcześnej, ale chodzi mi o to, by php z mysqlem automatycznie łączyło statystyki z zalogowanym userem. Tzn, nie aby ręcznie podawać id, bo nie mam pojęcia przecież jakie ktoś może mieć id, tylko, że jak logujesz się np masz user_id=12, to jak wypisać dla tego usera informacje z tabeli wojownik? Aby nie ręcznie ustawiać user_id, tylko automatycznie?
Sorry, że tak nie po ludzku napisane, ale nie wiem sam dokładnie jak to wytłumaczyć.

Dzięki :-)
Shili
No właśnie - jak się logujesz masz id (pisałam o tym wcześniej, być może za mało wyraźnie). Zapisz sobie gdzieś to id (na przykład w zmiennej, w sesji, byle nie w ciastku, bo mało bezpieczne). I potem zamiast na stałe wpisywać user_id = 1 wpisz user_id = $zmienna_z_id

http://manta.univ.gda.pl/~postkurs/wyklad.html#od3 - tutaj masz co nieco, z tego co się zdążyłam zorientować dość przystępnie napisane, w tym i o złączeniach tabel
http://kursy.skryptoteka.pl/kurs.php?kurs=sql&strona=1 - tutaj masz całą możliwą składnię select
Jeszcze poczytaj sobie na wszelki wypadek o podzapytaniach.

Nie wiem które przerobiłeś, jeśli te również, to po prostu kombinuj. I nie zapominaj o sile zmiennych w phpie, i o tym, że z bazy danych możesz wyciągnąć każdy potrzebny Ci rekord - w tym i po zalogowaniu jakiegoś usera id tego usera.

ps. Kobietą jestem ^^
Namariee
Ja wiem o co Tobie chodzi smile.gif

Ja na przykład męczyłem się jak według zalogowanego usera wyciągnąć ile ma ziemi, jedzenia, drewna itd.
Zrobiłem to tak:

  1. <?php
  2. $zapyt1 = mysql_query("SELECT * FROM users WHERE login='".$_SESSION['logowanie']."'");
  3. $odp = mysql_fetch_array($zapyt1);
  4. ?>


I tam gdzie chcesz wstawić to co się ma wyświetlać na przykład siła:

  1. <?php
  2. $odp['siła'];
  3. $odp['zycie'];
  4. ?>


Oczywiście '".$_SESSION['logowanie']."' musisz zastąpić tak jaką Ty masz zrobioną sesję. Mam nadzieję że to jakoś Tobie pomogło.
grzegosh
Shili, wybacz, nie zwróciłem uwagi na płeć. Mea culpa :-P
Btw, tych kursów nie widziałem, na pewno przestudiuję, dzięki winksmiley.jpg

Namariee, nie do końca rozumiem. Ty podałeś przykład z jedną tabelą chyba, tak?

I tak dla pewności czy wszystko jest OK (bo lekko zmieniłem system logowania z jakiegoś kursu), wstawię kod plików php i zaraz po tym zabieram się za czytanie smile.gif

index.php
  1. <?php
  2. session_register("zalogowany");
  3.  
  4. if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;
  5.  
  6. require("ustawienia.php");
  7.  
  8.  
  9.  
  10. function formularz_logowania($komunikat=""){
  11. echo "$komunikat<br>";
  12. echo "<form action='index.php' method=post>";
  13. echo "Login: <input type=text name=login><br>";
  14. echo "Hasło: <input type=password name=haslo><br>";
  15. echo "<input type=submit value='Zaloguj!'>";
  16. echo "</form>";
  17. echo "Nie masz jeszcze konta? <a href='rejestracja.php'>Zarejestruj się</a>";
  18. }
  19.  
  20. ?>
  21.  
  22. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  23. "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  24. <html xmlns="http://www.w3.org/1999/xhtml">
  25.  
  26.  
  27.  
  28. <head>
  29. <title>tytul</title>
  30. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  31.  
  32. </head>
  33. <body>
  34. <?php
  35. if($_GET["wyloguj"]=="tak")
  36. {
  37. $_SESSION["zalogowany"]=0;
  38. echo "Zostales wylogowany z serwisu";
  39. }
  40.  
  41. if($_SESSION["zalogowany"]!=1)
  42. {
  43. if(!empty($_POST["login"]) && !empty($_POST["haslo"]))
  44. {
  45. $login=$_POST["login"];
  46. $haselko=md5($_POST["haslo"]);
  47. if(mysql_num_rows(mysql_query("select * from users where user_login = '".htmlspecialchars($_POST["login"])."' AND user_haslo = '".htmlspecialchars($haselko)."'")))
  48. {
  49. echo "Zalogowano poprawnie. <a href='index.php'>Przejdź na stronę główną</a>";
  50. $_SESSION["zalogowany"]=1;
  51. }
  52. else echo formularz_logowania("Podano zle dane!!!");
  53. }
  54. else formularz_logowania();
  55. }
  56. else
  57. {
  58. echo "<script type='text/javascript'>location.href = 'main.php'</script> ";
  59. }
  60. ?>
  61. </body>
  62. </html>
  63. <?php mysql_close(); ?>


rejestracja.php
  1. <?
  2. require("ustawienia.php");
  3.  
  4. function pokaz_formularz($komunikat=""){ //funkcja wyświetlająca formularz rejestracyjny
  5.  
  6.  
  7. echo "$komunikat<br>";
  8. echo "<form action='rejestracja.php' method=post>";
  9. echo "Login: <input type=text name=login><br>";
  10. echo "Hasło: <input type=password name=haslo><br>";
  11. echo "Potwierdź hasło: <input type=password name=pothaslo><br>";
  12. echo "Email: <input type=text name=email><br>";
  13. echo "<input type=hidden value='1' name=send>";
  14. echo "<input type=submit value='Zarejestruj mnie'>";
  15. echo "</form>";
  16.  
  17. }
  18. ?>
  19.  
  20.  
  21. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  22. "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  23. <html xmlns="http://www.w3.org/1999/xhtml">
  24.  
  25. <head>
  26. <title>Formularz rejestracyjny</title>
  27. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  28. </head>
  29. <body>
  30. <?php
  31. if($_POST["send"]==1){ //sprawdzanie czy formularz został wysłany
  32. if(!empty($_POST["login"]) && !empty($_POST["haslo"])){ //oraz czy uzupełniono wszystkie dane
  33. $zap='"select * from users where user_login=`".htmlspecialchars($_POST["login"]."`';
  34. if(@mysql_num_rows($zap))
  35. pokaz_formularz("Użytkownik o podanym loginie już istnieje!!!"); // sprawdzanie czy użytkownik o podanej nazwie już istnieje
  36. else
  37. {
  38. $haslo=md5($_POST["haslo"]);
  39. mysql_query("insert into users values(NULL, '".htmlspecialchars($_POST["login"])."', '".htmlspecialchars($haslo)."')"); // zapisywanie rekordu do bazy
  40. echo "Rejestracja przebiegła pomyślnie. Możesz teraz przejść do <a href='index.php'>strony głównej</a> i się zalogować.";
  41. }
  42. }
  43. else pokaz_formularz("Nie uzupełniono wszystkich pól!!!");
  44. }
  45. else pokaz_formularz();
  46. mysql_close(); //zamykanie połączenia z bazą
  47. ?>
  48. </body>
  49. </html>


ustawienia.php
  1. <?
  2. $db="localhost";
  3. $db_u="***";
  4. $db_p="***";
  5. $db_w="test";
  6. mysql_connect("$db", "$db_u", "$db_p")or die("Nie można nawiązać połączenia z bazą");
  7. mysql_select_db("$db_w")or die("Wystąpił błąd podczas wybierania bazy danych");
  8. ?>


sprawdz.php
  1. <?php
  2. ?>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  4. "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <?php
  7. if($_SESSION["zalogowany"]==0){echo "nie masz dostępu do tej części witryny. <a href='index.php'>Zaloguj się</a></body></html>;"; exit();}
  8. ?>


main.php
  1. <?php require("sprawdz.php"); ?>
  2.  
  3. <head>
  4. <title>tytul</title>
  5. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  6. </head>
  7. Tutaj będą informacje o zalogowanym wojowniku
  8. <br><a href='index.php?wyloguj=tak'>wyloguj się</a>
  9. </body>
  10. </html>


Btw, przydała by się na forum opcja ukrywania i pokazywania części postu, po kliknięciu w button. smile.gif
Chciałem też przeprosić, jeśli coś powinienem załapać, a nie załapałem tongue.gif
Namariee
Tak podałem przykład z jedną tabelą, ale to chyba nie problem zrobić takie coś z dwoma tabelami winksmiley.jpg
Jeśli masz sesje według loginu to tym bardziej jest łatwo to zrobić.
Masz tak jak napisałeś tabele users
  1. CREATE TABLE`users` (
  2. `user_id` INT NOT NULL AUTO_INCREMENT ,
  3. `user_login` VARCHAR( 30 ),
  4. `user_haslo` VARCHAR( 32 ),
  5. PRIMARY KEY ( `user_id` )
  6. );


Robisz drugą tabelę na przykład wojownik
  1. CREATE TABLE`wojownik` (
  2. `user_id` INT NOT NULL AUTO_INCREMENT ,
  3. `user_login` VARCHAR( 30 ),
  4. `user_sila` VARCHAR( 32 ),
  5. `user_zycie` VARCHAR( 32 ),
  6. PRIMARY KEY ( `user_id` )
  7. );


Wtedy podczas rejestracji musisz dodać kolejne zapytanie aby dodał Tobie w tabeli wojownik user_id i user_login takie same dane jak w tabeli users smile.gif no i domyślne wartości dla user_sila i user_zycie.

I robisz tamte zapytanie co jest podane wyżej
  1. <?php
  2. require('ustawienia.php'); // łączenie z Twoją bazą
  3. $wynik2 = mysql_query("SELECT * FROM wojownik WHERE login='".$_SESSION['logowanie']."'");
  4. // pobieranie rekordów z tabeli wojownik według zalogowanego użytkownika
  5. $dane2 = mysql_fetch_array($wynik2);
  6. ?>


I wstawiasz gdzieś na stronie to co chcesz wyświetlić czyli jego Siłę i życie
  1. <?php
  2. $dane2['user_sila']; // pobrana wartość z rekordu user_sila
  3. $dane2['user_zycie']; // pobrana wartość z rekordu user_zycie
  4. ?>
grzegosh
Zrobiłem tak jak mówiłeś (mam nadzieję).
Nie byłem pewny tylko co do tego "$_SESSION['logowanie']" co napisałeś, chyba chodziło Ci o stworzenie w indexie $_SESSION['login'] i przekazanie jej wartości zmiennej $login, a potem sprawdzenie:
$wynik2 = mysql_query("SELECT * FROM wojownik WHERE login='".$_SESSION['login']."'");
tak?

Stworzyłem w indexie czyli w miejscu logowania zmienną sesji o nazwie login, przypisałem jej wartość w tym miejscu:
  1. <?php
  2. if($_SESSION["zalogowany"]!=1)
  3. {
  4. if(!empty($_POST["login"]) && !empty($_POST["haslo"]))
  5. {
  6. $login=$_POST["login"];
  7. $haselko=md5($_POST["haslo"]);
  8. if(mysql_num_rows(mysql_query("select * from users where user_login = '".htmlspecialchars($_POST["login"])."' AND user_haslo = '".htmlspecialchars($haselko)."'")))
  9. {
  10. echo "Zalogowano poprawnie. <a href='index.php'>Przejdź na stronę główną</a>";
  11. $_SESSION["zalogowany"]=1;
  12. $_SESSION["login"]=$login; //  --------------  TUTAJ  ------------- 
  13. }
  14. else echo formularz_logowania("Podano zle dane!!!");
  15. }
  16. else formularz_logowania();
  17. }
  18. ?>


Moj plik main.php gdzie mają być wypisywane statystyki wygląda teraz tak:
  1. <?php require("sprawdz.php"); ?>
  2.  
  3. <head>
  4. <title>tytul</title>
  5. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  6. </head>
  7.  
  8. <?
  9.  
  10. require('ustawienia.php'); // łączenie z Twoją bazą
  11. $wynik2 = mysql_query("SELECT * FROM wojownik WHERE login='".$_SESSION['login']."'");
  12. // pobieranie rekordów z tabeli wojownik według zalogowanego użytkownika
  13. $dane2 = mysql_fetch_array($wynik2);
  14.  
  15. $dane2['user_sila']; // pobrana wartość z rekordu user_sila
  16. $dane2['user_zycie']; // pobrana wartość z rekordu user_zycie
  17. ?>
  18.  
  19. <br><a href='index.php?wyloguj=tak'>wyloguj się</a>
  20. </body>
  21. </html>

No i gdy się rejestruję (oczywiscie podczas rejestracji wysyłam do bazy dane z id, loginem, siłą i zyciem jak pisałeś) i loguję potem, próbuję wejśc na main.php i wyskakuje taki błąd:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in sciezka/main.php on line 13

Trochę się już zagmatwałem :/
Shili
Masz błędne zapytanie, sprawdź, czy nie popełniłeś jakiejś literówki, czy masz w bazie tabelę z polami o takiej nazwie, jaką zadeklarowałeś w zapytaniu.

Wypisz sobie zapytanie na ekran, na przykład przez echo (sam ciąg znaków) i spróbuj przekleić do phpMyAdmina, sprawdź czy działa. W ogóle spróbuj wyświetlić i porównaj to z tym, co chciałeś otrzymać.


@edit
  1. <?php
  2. htmlspecialchars($_POST["login"])
  3. ?>
Widać, że czytałeś sobie o bezpieczeństwie kodu, ale trzeba tutaj nadmienić, że ten wcale nie jest bezpieczny. htmlspecialchars używa się przy wyświetlaniu wyników, a przy dodawaniu do bazy o wiele lepsza jest mysql_real_escape_string.
grzegosh
Nooo smile.gif Śmiga. Wreszcie.
Na razie kończę bo mi już głowa paruje tongue.gif
Dzięki Shili oraz Namariee za pomoc.

Jak będę miał kolejne pytania odnośnie dalszej pracy nad gierką, nie omieszkam zapytać smile.gif

Miłego dnia, odezwę się potem tutaj.
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.