Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam
Mam kilka pytań dot PHP i MySQL
1. Chciałbym zrobić sobie formularz i skrypt w jednym pliku. Załóżmy że pobieramy dane z formularza, skrypt cos oblicza i zwraca na tej samej stronie pod formularzem wynik. Nie chce jednak robić tego w czystym php wywołując formularz funkcja echo albo here doc. Chciałbym żeby php bylo tylko dodatkiem do HTML'a.
2. Jaka jest pojemnosc bazy danych MySQL? Ile moge utworzyć tabel w pojedynczej bazie i ile mogę utworzyć kolumn i wierszy w jednej tabeli? Czy są ogólnodostępne schematy blokowe relacji baz danych np. forum PunBB?
3. Gdzie mogę znaleźć najprostszy skrypt logowania i jakie są sposoby logowania uzytkowników? Dokumentacja PHP nie trafia do mojego chłopskiego rozumu.
4. Jak to jest z tymi zmiennymi przekazywanymi do przeglądarki. Czy zawsze trzeba pobierać je poprzez zmienne $_POST[] i $_GET[]? Jeśli da się to robić inaczej to czy ten inny sposób działa niezawodnie?
Z góry dzięki za pomoc
Pozdrawiam :)
Offline
Ad. 1. Nic nie stoi na przeszkodzie, html można mieszać z php:
<html>
<body>
<?php
if(...) // dobrze sprawdzić czy zmienne są przesłane z formularza, np. przy pomocy isset, można by dodać jakaś walidacje wartości
{
$obliczenia = ... // wynik Twoich obliczeń
}
echo $obliczenia;
?>
<form name="formularz" action="ten_sam_skrypt.php" method="post">
... (pola formularza, przycisk do wysłania zmiennych do formularz zdefiniowanego w action)
</form>
</body>
</html>
2. Pojemność bazy danych jest raczej nieograniczona niczym poza pojemnością dysku. Podobnie co do tabel, kolumn, wierszy. Schemat bazy danych możesz sobie wyświetlić w jakimś programie generującym je na podstawie kodu sql bazy. Polecam darmowego DB Designera.
3. Głupie pytanie, głupia odpowiedź ;] - http://www.google.pl/search?q=php+logowanie
4. Wskazane przez $_GET i $_POST, czemu sie nie podoba? Można używać zmiennych globalnych i sie odwoływać do wszystkiego bez tych tablic, ale to nie wskazane ze względów bezpieczeństwa i innych. To najlepsza praktyka używać tych tablic wiec nie masz wyboru czy ci sie to podoba czy nie ;] Przecież to bardzo wygodnem nie rozumiem, hmm.
Offline
1.
if(...) // dobrze sprawdzić czy zmienne są przesłane z formularza, np. przy pomocy isset, można by dodać jakaś walidacje wartości[/quote]
heeee? a po polsku :)?
2. Zamierzam założyć bazę danych w której stałe będą tylko dwie tabele. Pozostałe będą się tworzyć i usuwać dynamicznie, tzn tabela 1 uzytkownicy, tabela 2 dane tabel (ankiety), tabela 3 klucze:uzytkownicy i dane tabel = index tabeli, pozostale tabele indeksowane zgodnie z zawartością tabeli nr 3. Czyli 3 tabele a cała reszta indeksowana, tworzona modyfikowana i usuwana dynamicznie. Jak wyglada schemat encji np forum punbb?
Ma to być baza danych systemu ankietowego. Coś ala [url=http://www.ankietka.pl/]ankietka.pl[/url].
Zakładam ze uzytkowników będzie w przedziale od 0 do 10000 i kazdy bedzie miał maksymalnie 100 dynamicznych tabel.
Na pytania 3 i 4 odpowiedzi rozumiem :)
[url=https://www.youtube.com/watch?v=rNg2Dh6gPkw]Nemo sailing home...[/url]
Offline
Ad. 1. Chodzi o sprawdzenie danych, no bo ktoś może ci nic nie wpisać w formularzu, da zapisz i dostaniesz pusty wpis, a na co ci taki. No to najpierw sprawdzasz czy w ogóle zmienne istnieją, potem sprawdzasz czy są takie jak chcesz. no bo np. masz pole pesel, a ktoś ci tam wpisze nazwisko i już lipa. Dlatego walidacja, to jest właśnie walidacja, jak dane są ok to zapisujesz, jak nie dajesz komunikaty, ej koleś wpisz poprawne dane. A tak poważnie to komunikaty typu "Do wypełnienia pola użyj cyfr arabskich", albo "Maksymalna długość nazwiska to 200 znaków". Bo jak pozwolisz wpisać wiecej, a pole w bazie ma 200 to sie zapytanie wyburaczy, co za tym idzie skrypt. Przydadzą ci sie te funkcje:
http://pl2.php.net/manual-lookup.php?pattern=is_ , poza tym strlen do sprawdzania długości stringa, jak chcesz pozabezpieczać przed jakimiś hakami, typu sql injection to jescze jakieś addslhashes, striptags, co tam potrzeba. Jeśli chcesz gotowych przykłądów popatrz w sieci, np. http://www.google.pl/search?q=php+walidacja+formularzy
Ad. 2. Schemat encji to mówiłem żebyś sobie zrobił w db designerze, plik sql twrzący baze pewnie znajdziesz przy punbb jak ściągniesz. Co do tworzenia tabel i usuwania, widziałem coś takiego, tragiczne ;] Bo w sumie po co coś takiego robić. nie lepiej daj jedną tabele i wpisywać w niej dane w wierszach, te same dane z tabeli w wierszu tej zbiorczej. I zamiast wielu tabel jednowierszowych pewnie bedziesz miał jedną wielowierszową, wiersze łątwo bedziesz usuwał. No i masz 10000 użytkowników każdy 100 tabel, a nie lepiej zrobić 100 tabel i wcisnać w każdą wiersze dotyczące każdego użytkownika. No przecież klepiej jak nic, tabele można powiazywać przez klucze obce i jest wszystko pieknie.
Przy okazji, jak to jest, że ludzie nie kumający za bardzo dostaja takie zleconka? ;] Bo to jakieś zlecenia masz do zrobienia czy coś? Może ludzie kumajacy sa zbyt zajeci, hmm ;] Weź sie za php i sqla, bo bedzie porażka. No chyba że zrobisz sklejke z róznych kodów z sieci i tego co ktoś napisze na forum. Ale nie polecam.
Offline
dobrze sprawdzić czy zmienne są przesłane z formularza, np. przy pomocy isset, można by dodać jakaś walidacje wartości[/quote]
Nie zrozumiałem do końca o co Ci chodziło. Zdaje sobie sprawę z takich problemów i dziękuję za cenne wskazówki.
Dzięki za konstruktywna krytyke kamikaze. Ale to "zleconko" to jest moja praca mgr. Nie służy zarobkowi, służy rozwojowi umiejętności i poszerzeniu wiedzy potwierdzonym świstkiem z uczelni.
Jeśli uważnie przyjrzałeś się ankietka.pl to wiesz o co mi chodzi. A jeśli nie to z grubsza przedstawie problem:
Serwis do ktorego loguja sie użytkownicy i tworzą swoje ankiety. Każdy użytkownik moze stworzyć swoje ankiety w oparciu o pewien klikalny kreator.
Użytkownik: login, hasło itp. W ankiecie jest: tytuł ankiety, pytania + pewna ilość odpowiedzi w typach pola ankiety (np radiobutton). Kwestie analizy statystycznej ankiet, ich modyfikacji, wstawiania na inne strony, określania styli itp narazie mnie nie interesuja.
Wiem jak zrobić tabele uzytkownicy i powiazać ich z ich ankietami. Kwestią problematycza pozostaje relacja wiele do wielu, wiele ankiet i wiele odpowiedzi. Jak to przedstawić w tabelach bazy, jakie pola dobrać. Jak zoptymalizować zapytanie, żeby wypełniacz nie musiał czekać na wyświetlenie ankiety i wysłanie jego odpowiedzi.
Jedynym moim problemem pozostaje abstrakcyjnie określić relacje - jak poukładać te dane w sensownym porządku. Sytuacja podobna jest do forum, kwestia lekko zmodyfikować tabele, być może dodatkowo dodać jedną tabele.
Narazie potrafie czytać/zapisywać pliki, generować pętlami formularze i je przetwarzać, tworzyć funkcje, zaczynam zadawać pytania SQLowe. Znam SQL i HTML w miare dobrze. Z cookie's sobie raczej poradze.
Jak dotąd z sukcesami piszę różnego rodzaju kalkulatory, generuję strony i powoli przymierzam sie do sys. logowania.
Moim celem do końca roku jest opis instalacji i konfiguracji serwera WWW z modułami PHP i MySQL, stworzenie systemu logowania, teoretyczne określenie zawartości bazy (relacji,tabel) i część teoretyczna dotycząca ankiet jako narzędzi marketingu.
Spodziewajcie się więcej pytań ;)Ostatnio edytowany przez Zbooj (2007-11-26 13:55:06)
[url=https://www.youtube.com/watch?v=rNg2Dh6gPkw]Nemo sailing home...[/url]
Offline
[quote=Zbooj]Kwestią problematycza pozostaje relacja wiele do wielu, wiele ankiet i wiele odpowiedzi. Jak to przedstawić w tabelach bazy, jakie pola dobrać. Jak zoptymalizować zapytanie, żeby wypełniacz nie musiał czekać na wyświetlenie ankiety i wysłanie jego odpowiedzi.
Jedynym moim problemem pozostaje abstrakcyjnie określić relacje - jak poukładać te dane w sensownym porządku. Sytuacja podobna jest do forum, kwestia lekko zmodyfikować tabele, być może dodatkowo dodać jedną tabele.[/quote]
Chyba nie jest to tak skomplikowane. Robisz tabele ankiety (id, tytuł ankiety, data rozpoczecia, data zakończenia), tabela pytania (id, id ankiety, pytanie, ilosc odpowiedzi) - jedna ankieta może mieć kilka pytań i może być ich różna liczba. Odpowiedzi na pytanie danej ankiety zliczasz inkrementując pole ilosc odpowiedzi, jeśli taką odpowiedź takiej ankiety ktoś wybrał zostanie zwiekszony licznik. I nie ma wiele do wielu, bo masz jedną ankiete i wiele odpowiedzi, a każde pytanie należy do jednej ankiety. W sumie nie obchodzą cie chyba odpowiedzi tylko ich ilość. No chyba, że to inne ankiety niż myśle. Myślałem o ankiecie typu: Jaki dzisiaj dzień?: a) powniedziałek, b) wtorek, c) środa i rysowanie paseczków, która odpowiedz ma najwiecej głosów.
Offline
Jest jeszcze problem tzw. otwartej furtki czyli np.
Jakie marki papierosy palisz?
a) XX
b) YY
c) ZZ
d) inne (wpisz jakie, textfield)
Offline
To raczej nie problem, masz tabele odpowiedzi, dodasz wtedy do niej nową odpowiedź gdy ktoś wypełni to pole. Jeśli sie odpowiedź powtórzy (przydałoby się to sprawdzać) nie dodajesz jeszcze raz, tylko zwiększasz liczbę wskazania tej odpowiedzi.
Offline
[quote=kamikaze]Jeśli sie odpowiedź powtórzy (przydałoby się to sprawdzać) nie dodajesz jeszcze raz, tylko zwiększasz liczbę wskazania tej odpowiedzi.[/quote]
gorzej jeśli ktoś tą samą markę napisze inaczej. np. LM, L&M, L M, lm...
Offline
Zawsze można używać strip, strtolower by porównywać, napisać jakiś algorytm, nie wiem. Jak inaczej, w sumie to chyba nie dawać uzytkownikom takiej mozliwości ;]
Offline
Podejrzewam, że narazie konieczne będzie jedynie zapisanie wartości "otwartej furtki". Bawić się w porównania będę funkcjami tekstowymi później. Są przecież funkcje które porównują stringi. Możnaby te porównania roboczo robić w zewnetrzym pliku/tabeli bazy, sortująć odpowiedzi alfabetycznie usunąć spacje a pozniej porównywać ich podobienstwo (na to tez sa funkcje). Najskuteczniejsze byłoby jednak robienie tego siecią neuronową nauczoną słownika. Hehe ;) rozpędziłem się ;)
Ostatnio edytowany przez Zbooj (2007-11-27 13:49:33)
Offline
Pozwolę się dołączyć do tematu żeby nowego nie tworzyć.
Czy jest możliwość ponownego ponumerowanie kolumny która była auto_increment?
jaśniej: Mam kilka kolumn w tym jedną id auto_increment, powpisywałem dane utworzyły się id o jakiś tam kolejnych numerach. Następnie wywaliłem z tabeli trochę wpisów i id nie zawiera kolejnych numerów. Da się to 'po porządkować', 'odświeżyć' tak aby id było znów w kolejności numer po numerze?
Czy trzeba kolejno ręcznie skrypt zrobić?
Offline
Nie. Jeden wpis = jedno id. Możesz sobie dodać kolumnę dodatkową i tam numerować rekordy.
Offline
[quote=Wieloryb]Nie. Jeden wpis = jedno id. Możesz sobie dodać kolumnę dodatkową i tam numerować rekordy.[/quote]
Nieprawda da się tylko trzeba wiedzieć co się robi. Gdzie indziej w bazie może być odwołanie do tego id. Jak już uporządkujesz to musisz zmienić następny numer auto increment. A te zadanie nazywa się administrowanie i zarządzanie bazą danych.
Ostatnio edytowany przez djjanek (2009-07-25 11:21:41)
Offline
Ale czy jest tego sens? Czy za każdym razem kiedy usuniesz jakiś rekord bedzięsz zmieniał numerację id? Wg mnie id powinno być na stałe przypisane do jednego rekordu. Ale w sumie jest to kwestia programisty i tego czy on to zrobi umiejętnie i z głową.
Offline
No za każdym razem nie. A takie zabiegi robi się w celu optymalizacji działania bazy, ale po jakimś czasie działania. Jeśli zmieni się ilość liczb w numeracji to jest sens a jak nie to nie ma sensu.
Pytanie było czy da się wiec odpowiadam że da się. Na 100 obsłużonych baz może raz tylko takie coś robiłem.
Ostatnio edytowany przez djjanek (2009-07-25 13:11:00)
Offline
Dobra a jak to się robi? Jest na to jakaś gotowa recepta? czy trzeba swój kod pisać?
Offline
Dużo kodu, najprościej usunąć kolumnę z autonumeracją i z powrotem ją dodać.
Offline
A ja mam pytanie po co te numery ma mają być kolejne? Kolumna autoincrement rządzi się zwoimi zasadami i numery w takiej kolumnie nie będą zawsze kolejne, ale w czym problem? Czemu to przeszkadza, może jak będziemy wiedzieć, znajdziemy odpowiednie rozwiązanie.
Offline
[quote=djjanek]Jak masz id które ma 5 liczb znaczących a możesz mieć 4 to mniej pamięci oczywiście trzeba jeszcze ustawić aby tylko 4 były wykorzystywane. A tak normalnie to nie bez sensu.[/quote]
Ja bym raczej rozwinął to wyjaśnienie. Czy masz 5 liczb znaczących, czy 4 według mnie nie jest warte zachodu, aby wprowadzać zmiany.
Wyobraźmy sobie jednak tabelę, w której dane są bardzo często usuwane. Po pewnym czasie działania tabela liczy kilka tysięcy rekordów, a autoincrement nadaje indeksację na kilka milionów. W takiej sytuacji, i tylko w takiej widzę sens przeindeksowania tabeli.
Offline
Przeindeksowanie będzie bardzo trudne, jeśli tabela powiązana jest przez swój klucz główny z innymi. Trzeba by ze zmianą wartości w kolumnie klucza zmieniać wartości w kolumnach powiazanych. Masa roboty do zrobienia, no i to nie uniknione, inaczej baza straci spójność. W ogóle to wydaje mi się, że to żaden problem wydajnościowy. Co z tego, że jakaś tabela ma wysokie wartości w jakiejś kolumnie, przecież w czym to przeszkadza. Inna sprawa jak tabela ma mase wierszy, jest duża. A jakie numerki maja te wiersze to chyba sprawa mało ważna. Bo idąc w tym kierunku, można by w kolumnie z cenami, zmniejszyć wartości cen dla poprawienia wydajności ;]
Offline
A jest różnica czy masz zapamiętać 3 liczby czy 6? Tak samo jest w komputerze. Ale jak zaprojektujemy bazę że ma zapamiętywać 10 liczbowe to nie będzie różnicy.
A spójność to zadba wiedza o bazie albo zaprojektowane mechanizmy optymalizacji w systemie.
Przykład działania popatrzcie na allegro co jakiś czas powtarzają się numery aukcji a wątpię, aby gdzieś było odwzorowanie id do numeru aukcji.
Tylko pytanie na początku było czy da się to zrobić a nie czy się robi i kiedy.
Zatem da się ale rzeba wiedzieć dokładnie co się robi bo inaczej spójności bazy nie będzie.
Offline
[quote=djjanek]A jest różnica czy masz zapamiętać 3 liczby czy 6? Tak samo jest w komputerze. Ale jak zaprojektujemy bazę że ma zapamiętywać 10 liczbowe to nie będzie różnicy.[/quote]
Nie koniecznie jest róznica bo jesli nie wiesz komputery liczą w systemie dwójkowym nie w dziesiętym i rezerwują sobie pamięć na zapisanie danych. Przecież definiujesz jakiego typu ma być kolumna tabeli, typ rezerwuje pamięć na zapisanie tego numerka i nie ważne czy będzie on miał 3 czy 6 liczb. Więc definiując pole autoinkrement typu int masz przeznaczone 4 bajty pamięci i zakres od 0 do 4294967295. I po co ta rozmowa?
[quote=djjanek]A spójność to zadba wiedza o bazie albo zaprojektowane mechanizmy optymalizacji w systemie.[/quote]
A jakieś konkretne pomysły? Chodzi i naprawienie rozjechanej bazy po zastąpieniu tabeli nową z kolejnymi numerami w kolumnie z autoincrement. Wiedza o bazie powinna podpowiedzieć, mam przewalone ;] A "zaprojektowane mechanizmy optymalizacji w systemie" ?
[quote=djjanek]Przykład działania popatrzcie na allegro co jakiś czas powtarzają się numery aukcji a wątpię, aby gdzieś było odwzorowanie id do numeru aukcji.[/quote]
Skąd wiesz, że się powtarzają? Coś na to wskazuje? Po co mieliby to robić, numerków im przecież nie zabraknie.
[quote=djjanek]Tylko pytanie na początku było czy da się to zrobić a nie czy się robi i kiedy.
Zatem da się ale rzeba wiedzieć dokładnie co się robi bo inaczej spójności bazy nie będzie.[/quote]
No wiadomo, że się da. Tylko nie powinno się tego robić. Bo się nic nie zyskuje oprócz bajzlu i dodatkowej roboty. Jak ktoś jest takim pedantem, że lubi jak numerki są po kolei to niech tak robi i 3 razy dziennie. Jednak wyjdzie, że to główne zadanie, które ma przy zajmowaniu się bazą.
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00013 | SET CHARSET latin2 |
0.00012 | SET NAMES latin2 |
0.00169 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='52.15.68.97' WHERE u.id=1 |
0.00106 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '52.15.68.97', 1732537741) |
0.00068 | SELECT * FROM punbb_online WHERE logged<1732537441 |
0.00078 | SELECT topic_id FROM punbb_posts WHERE id=76731 |
0.00008 | SELECT id FROM punbb_posts WHERE topic_id=9826 ORDER BY posted |
0.00079 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=9826 AND t.moved_to IS NULL |
0.00006 | SELECT search_for, replace_with FROM punbb_censoring |
0.00200 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=9826 ORDER BY p.id LIMIT 0,25 |
0.00138 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=9826 |
Total query time: 0.00877 s |