Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Skrypt adpocji
Forum PHP.pl > Forum > Przedszkole
Wampir
Witam wszystkich.
Otóż jestem w trakcie pisania prostej strony, która pozwala użytkownikowi zaadoptować zwierzątko i rozwijać je.

Nie mam kompletnie pomysłu jak miałby wyglądać skrypt adopcji. Chodzi o to, że użytkownik zarejestrowany oczywiście może zadoptować maxymalnie 3 zwierzątką.

np.

1x Amstaff
1x York
1x Ratlerek

Każdy nowo zadoptowany zwierzaczek ma domyślny poziom 1.
Potem napiszę skrypt, który umożliwi dokarmianie ich.

I tu pojawia się moje pytanie jak najlepiej wykonać taki skrypt adopcji.

Jakie pola do bazy, nowa tabelka?
Od czego zacząć ten skrypt - od sprawdzenia czy jest zalogowany to na pewno. smile.gif
nospor
Cytat
Od czego zacząć ten skrypt - od sprawdzenia czy jest zalogowany to na pewno
90% pracy za tobą.... wink.gif

Tabele:
user
zwierzak
user_zwierzak - ta tabela będzie łączyć usera z adoptowanym zwierzakiem. Ma miec pola:
ID_USER
ID_ ZWIERZAK

Wampir
No to jedziemy z kolejnymi - pewnie dla Was banalnymi pytaniami.

Tabela users:
ID, Login, Hasło, Email.

Tabela adoptions:
login, zwierzak, id_login, id_zwierzak

Mniej więcej tak to miałoby wyglądać?
User u Ciebie to login u mnie.

ID_Login oraz ID_Zwierzak mają się automatycznie dodawać?
nospor
W tabeli adoptions te dwa pola:
login, zwierzak,
są totalnie zbędne.

Cytat
ID_Login oraz ID_Zwierzak mają się automatycznie dodawać?
No Twój skrypt ma je tworzyć gdy ktos będzie adoptował zwierzaka. Wówczas ty masz wygenerować rekord w tabeli adoptions
Wampir
  1. CREATE TABLE `adoptions` (
  2. `id_login` mediumint(8) NOT NULL auto_increment,
  3. `id_pet` mediumint(8) NOT NULL auto_increment,
  4. `pet_name` varchar(25) NOT NULL,
  5. PRIMARY KEY (`id_pet`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=2 ;


id_login musi być takie same jak id usera z tabelki users.
id_pet będzie tworzyło się automatycznie gdy użytkownik stworzy nowego zwierzaczka.
pet_name użytkownik będzie za pomocą formularzu nadawał imię zwierzaczkowi. Max 25 znaków.

Myślę, że dobrze zrozumiałem? wink.gif
nospor
źle...
w tabeli adoptions nie ma być żadnych autoincrement. Wartości tych pól będziesz nadawał Ty.
Kluczem głównym ma być klucz złozony (id_login, id_pet)

pet_name - ok

Cytat
id_pet będzie tworzyło się automatycznie gdy użytkownik stworzy nowego zwierzaczka.
Sądziłem, że zwierzaki już będziesz miał w bazie. Czyli masz np. w tabeli PET zwierzaki:
tygrys,
małpa
wąz
.....

A koleś wybiera z nich co adoptuje
Wampir
  1. CREATE TABLE `adoptions` (
  2. `id_login` mediumint(8) NOT NULL,
  3. `id_pet` mediumint(8) NOT NULL,
  4. `pet_name` varchar(25) NOT NULL,
  5. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=2 ;


Czy po prostu z varcharem mam to zrobić - co jak co, ale w zapytaniach jestem cieńki.

Cytat
Sądziłem, że zwierzaki, a raczej ich rodzaje/gatunki już będziesz miał w bazie. Czyli masz np. w tabeli PET zwierzaki:
tygrys,
małpa
wąz
.....

A koleś wybiera z nich co adoptuje


Hmm tym systemem staram wzorować się na skrypcie Smoki.Nightwood.net po wejściu w adopt.php użytkownik widzi 3 pola.

- Wąż
- Tygrys
- Żółw

No i wybiera sobie np. Węża i klika dalej, a potem ma puste pole, w ktorym może wpisać pet_name - czyli nazwę zwierzątka.
No i oczywiście na jednego użytkownika przypada max 3 zwierzątka.
nospor
Ok, czyli nie mamy do wyboru zwierzaków jako takich tylko rodzaj zwierzaka.
Tabela adoptions:
ID - klucz główy, autoincrement
ID_LOGIN
ID_PET_TYPE - czyli typ zwierzaka. ID z tabeli PET_TYPE
PET_NAME
Wampir
  1. CREATE TABLE `adoptions` (
  2. `id` mediumint(8) NOT NULL auto_increment,
  3. `id_login` varchar(25) NOT NULL,
  4. `pet_type` varchar(25) NOT NULL,
  5. `pet_name` varchar(25) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=2 ;


Nie jestem pewny czy tak - zaraz otworzę manual'a mysql..
nospor
id_login
pet_type

To mają być pola liczbowe a nie varchar. Te pola to ID z odpowiedających im tabel. Nie kombinuj, tylko pisz poprawnie.

I przestan dla pól liczbowych używać (8). To niczemu nie służy.
Wampir
Aa, faktycznie.
  1. CREATE TABLE `adoptions` (
  2. `id` mediumint(8) NOT NULL auto_increment,
  3. `id_login` INT (25) NOT NULL,
  4. `pet_type` INT (25) NOT NULL,
  5. `pet_name` varchar(25) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=2 ;




Tzn. 8 jest zbędna? wink.gif
nospor
INT (25)
(25) Tez jest zbędne. Każdla liczba w nawiasie dla pól liczbowych jest zbędna
http://nospor.pl/int11-kontra-int.html
Wampir
  1. CREATE TABLE `adoptions` (
  2. `id` mediumint unsigned NOT NULL auto_increment,
  3. `id_login` int unsigned NOT NULL,
  4. `pet_type` int unsigned NOT NULL,
  5. `pet_name` varchar(25) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=2 ;


Zastosowałem się do wyjaśnień z Twojej strony
nospor
A czy w tabeli LOGIN id to jest INT czy może MEDIUMINT ? Bo wcześniej pisałeś mediumint. Zdecyduj sie.

Czy typow zwierzaków będziesz miał naprawdę aż kilka miliardów, że dajesz im TYP INT? Myśle, ze tinyint z powodzeniem wystarczy.
Wampir
Nie, nie aż tak dużo to nie będzie z 3-4 typy.

  1. CREATE TABLE `adoptions` (
  2. `id` mediumint unsigned NOT NULL auto_increment,
  3. `id_login` mediumint unsigned NOT NULL,
  4. `pet_type` tinyint unsigned NOT NULL,
  5. `pet_name` varchar(25) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=2 ;
nospor
No i super.

Jedyne co mnie draźni to nazwa id_login. Toż to powinno być id_user. Masz tabele user a nie tabele login. Login to pole w tabeli user
Wampir
A, właśnie. Co z domyślnymi poziomami ? Nowo stworzony zwierzaczek powinien mieć jeden. Czyli stworzyć nową kolumnę

level i ustawić domyślnie 1 ? snitch.gif

@up
Poprawione
nospor
Cytat
Czyli stworzyć nową kolumnę

level i ustawić domyślnie 1 ?
Tak. Pole level typu tinyint unsigned - zakładam, że więcej niż 255 poziomów mieć nie będziesz. No chyba ,że będziesz, to wówczas daj większe pole
Wampir
Oj poziomów będzie dużo więcej.

  1. CREATE TABLE `adoptions` (
  2. `id` mediumint unsigned NOT NULL auto_increment,
  3. `id_user` mediumint unsigned NOT NULL,
  4. `pet_type` tinyint unsigned NOT NULL,
  5. `pet_name` varchar(25) NOT NULL,
  6. `level` mediumint unsigned NOT NULL default '1',
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8_general_ci AUTO_INCREMENT=2 ;
nospor
nie: default '1'
a: default 1
Skoro dopiero zaczynasz, to ucz się pisać poprawnie. 1 to liczba a nie tekst.

http://dev.mysql.com/doc/refman/5.0/en/integer-types.html
Cytat
MEDIUMINT 3 -8388608 8388607
0 16777215

Kurde, co to za gra, w której ktoś może dojśc do 16mln poziomów? WOW wink.gif
Wiem, czepiam się, ale nie lubie bezsensu nadmiarowych pól.

Cytat
SMALLINT 2 -32768 32767
0 65535
Czy max 65 tys nie jest już wystarczające?
Wampir
  1. // Sprawdzamy czy nazwa zwierzęcia zawiera dozwolone znaki.
  2. if (preg_match("/^[a-zA-Z0-9_ ]+$/" , $pet_name)) {
  3. else {
  4. exit("<center>Imię zwierzęcia zawiera niedozwolone znaki!</center>");
  5. }
  6. // Jeśli wszystko jest ok tworzymy rekord.
  7. else {
  8. $insert = "INSERT INTO `adoptions` ('id_user', `pet_name`, `pet_type`) VALUES ('".$id_user."','".$pet_name."', '".$pet_type."')";
  9. $result = mysql_query($insert) or die("<center>Niestety nieudało się zadoptować zwierzątka.</center>");
  10. echo "<center>Gratulacje adopcja powiodła się.</center>";
  11. }
  12. $result2 = mysql_query("SELECT `users` (`id`)");
  13. if (!$result2) {
  14. echo 'Nie można uruchomić zapytania: ' . mysql_error();
  15. }
  16. $id_user = mysql_fetch_row($result2);
  17. }


Parse error: syntax error, unexpected T_ELSE in D:\Program Files\WebServ\httpd\adopt.php on line 37

Wszystko pozamykane, a więc, albo jestem ślepy, albo coś popsułem.

questionmark.gif
vonski
Po pierwszym ifie masz od razu else smile.gif
Wampir
No tak, ale co w związku z tym?
vonski
No przecież to jest błąd składni:

  1. // Sprawdzamy czy nazwa zwierzęcia zawiera dozwolone znaki.
  2. if (preg_match("/^[a-zA-Z0-9_ ]+$/" , $pet_name)) {
  3. else {
  4. exit("<center>Imię zwierzęcia zawiera niedozwolone znaki!</center>");
  5. }


robisz if() {
// a tu od razu else - tak nie może być
Wampir
Faktycznie dzięki.

Jest teraz inny problem w kodzie mam
  1. // Sprawdzamy czy nazwa zwierzęcia zawiera dozwolone znaki.
  2. if (preg_match("/^[a-zA-Z0-9_ ]+$/" , $pet_name)) {
  3. echo ('<center>Imię zwierzęcia zawiera niedozwolone znaki!</center>');
  4. }


Po wpisaniu w pole pet_name obojętnie jakiego wyrazu - bez polskich znaków oraz znaków specjalnych wywala mi, że imię jest nieprawidłowe pomimo, że wpisuje dobre. W czym może tkwić problem?
vonski
Ten if:

  1. // Sprawdzamy czy nazwa zwierzęcia zawiera dozwolone znaki.
  2. if (preg_match("/^[a-zA-Z0-9_ ]+$/" , $pet_name)) {
  3. echo ('<center>Imię zwierzęcia zawiera niedozwolone znaki!</center>');
  4. }


oznacza mniej więcej tyle:

jeśli $pet_name będzie zawierać przynajmniej jedną literę, cyfrę, bądź znak podkreślenia to wyświetl tekst: "Imię zwierzęcia...." smile.gif
Także jeśli wpiszesz samo: "_" to też ci wywali że imię jest nieprawidłowe.
Wampir
Czyli, że musiałbym ten kod przerobić?

Nawet jeśli dam tak:
  1. if (preg_match("@^(?:http://)?([^/]+)@i" , $pet_name)) {


To też wywala.

Chcę, aby nie można było wpisywać znaków specjalnych /.,!@#$%^&*();:' lub " , a żeby litery i cyfry działały normalnie.


Hmm questionmark.gif
vonski
To spróbuj tak:

  1. // Sprawdzamy czy nazwa zwierzęcia zawiera dozwolone znaki.
  2. if (!preg_match("/^[a-z0-9]+$/i" , $pet_name)) {
  3. echo ('<center>Imię zwierzęcia zawiera niedozwolone znaki!</center>');
  4. }
gorden
Do pierwszego wyrażenia daj operator negacji !.
if(!preg...
przepuści on w $pet_name wielkie, małe litery, cyfry oraz stópkę_
Wampir
Działa dzięki piękne.

Poniższy kod ma dodawać rekord z bazy danych ten drugi ma sprawdzać czy ID usera jest takie same jak ID w tabelce users. Coś nie działa :/
  1. // Jeśli wszystko jest ok tworzymy rekord.
  2. else {
  3. $insert = "INSERT INTO `adoptions` ('id_user', `pet_name`, `pet_type`) VALUES ('".$id_user."','".$pet_name."', '".$pet_type."')";
  4. $result = mysql_query($insert) or die("<center>Niestety nieudało się zadoptować zwierzątka.</center>");
  5. echo "<center>Gratulacje adopcja powiodła się.</center>";
  6. }
  7. $result2 = mysql_query("SELECT * FROM users WHERE id = '$id_user'");
  8. if (!$result2) {
  9. echo 'Nie można uruchomić zapytania: ' . mysql_error();
  10. }
  11. $id_user = mysql_fetch_row($result2);


questionmark.gif
xxdrago
A co nie działa? co się wyświetla?

Temat: Jak poprawnie zadac pytanie

Kod
    error_reporting(E_ALL);
    ini_set('display_errors','1');


Wampir
Notice: Undefined variable: id_user in D:\Program Files\WebServ\httpd\adopt.php on line 3

  1. // Jeśli wszystko jest ok tworzymy rekord.
  2. else {
  3. $insert = "INSERT INTO `adoptions` ('id_user', `pet_name`, `pet_type`) VALUES ('".$id_user."','".$pet_name."', '".$pet_type."')";
  4. $result = mysql_query($insert) or die("<center>Niestety nieudało się zadoptować zwierzątka.</center>");
  5. echo "<center>Gratulacje adopcja powiodła się.</center>";
  6. }
  7. $result2 = mysql_query("SELECT * FROM users WHERE id = '$id_user'");
  8. if (!$result2) {
  9. echo 'Nie można uruchomić zapytania: ' . mysql_error();
  10. }
  11. $id_user = mysql_fetch_row($result2);


Powyzszy kod ma dodawać rekord z bazy danych ten drugi ma sprawdzać czy ID usera jest takie same jak ID w tabelce users. Coś nie działa :/
xxdrago
Pokaż bazę danych...

Bo skrypt , że tak powiem nie wie co to jest: id_user
Kod
Notice: Undefined variable: id_user in
Wampir
  1. CREATE TABLE `users` (
  2. `id` mediumint(8) NOT NULL auto_increment,
  3. `login` varchar(25) NOT NULL,
  4. `haslo` varchar(32) NOT NULL,
  5. `email` varchar(255) NOT NULL,
  6. `rank` tinyint(4) NOT NULL default '0',
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
  9.  
  10. CREATE TABLE `adoptions` (
  11. `id` mediumint unsigned NOT NULL auto_increment,
  12. `id_user` mediumint unsigned NOT NULL,
  13. `pet_type` tinyint unsigned NOT NULL,
  14. `pet_name` varchar(25) NOT NULL,
  15. `level` int unsigned NOT NULL default 0,
  16. PRIMARY KEY (`id`)
  17. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;


ID z tabelki users musi być takie same w tabelce adoptions.

Dlatego taki kod jest tego tworzenia adopcji. ^^
xxdrago
  1. $sql = 'INSERT INTO adoptions SET id_user="'.$id_user.'", pet_name="'.$pet_name.'", pet_type="'.$pet_type.'"';


spróbuj ten kod bo mi sie tamtego nie che poprawiać...
Wampir
Dodaje rekord, ale nie pobiera kolumna id_user jest pusta, a powinna zawierać moje id, które wyciągam z tabelki users.

No i można tworzyć konta bez podania danych pomimo, że mam zdefiniowane

  1. // Sprawdzamy czy pola zostały uzupełnione.
  2. if(empty($pet_name)) {
  3. echo ("<center>Proszę uzupełnić polę imię zwierzęcia.</center>");
  4. }
xxdrago
Zastosuj np. exit
  1. if(empty($pet_name)) {
  2. echo ("<center>Proszę uzupełnić polę imię zwierzęcia.</center>");
  3. }

albo przypisuj jakiejś zmiennej falsh:
Kod
$dane = falsh;



Albo dodaj metodę błędów...
Ps;
Porąbało mi się z niemieckim ma być
false
Wampir
Kod
<input type="radio" name="pet_type" value="Samiec"/> Samiec
<input type="radio" name="pet_type" value="Samica"/> Samica


Mam takie opcje w wyboru formularzu.

  1. $pet_type = strip_tags(mysql_escape_string($pet_type));


Tutaj flirtuje dane.

  1. $insert = 'INSERT INTO adoptions SET id_user="'.$_SESSION['id'] .'", pet_name="'.$pet_name.'", pet_type="'.$pet_type.'"';


A, tym zapytaniem dodaje rekord do bazy. No i mam problem, a mianowicie. Wszystko działa sprawnie oprócz pet_type po prostu dodaje mi do kolumny wartość 0, a powinno dodawać Samiec bądź Samica. W czym może tkwić problem?

questionmark.gif
xxdrago
sprawdz co zawiera $pet_type przed $insert
Wampir
Nic nie wyświetla, a dodałem. Lecz po wyborze - Samiec / Samica wyświetla mi dopiero po założeniu konta wynik.
Kostek.88
A skąd idzie $pet_type ? Nie powinieneś mieć tam $_POST['pet_type'] albo $_GET['pet_type'] ?

  1. $pet_type = strip_tags(mysql_escape_string($_POST['pet_type']));
Wampir
Niestety to nic nie dało.
Problem tkwił w błędnym umiejscowionym <?php. Już sobie poradziłem i skrypt działa w pełni sprawnie.
Temat do zamknięcia.
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.