Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Dynamiczne tworzenie tabel
dgaleza
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


Muszę stworzyć dynamicznie kilka tabel, których nazwa będzie zależna od ID dodawanego wiersza do innej tabeli.
W warunku if dodałem zmienną
  1. <?php
  2. $sql = "CREATE TABLE $id (uczen_ID TEXT NOT NULL, oceny TEXT NOT NULL, sr TEXT NOT NULL, np TEXT NOT 
    NULL)"
    ;
  3. ?>

Poza warunkiem if dodałem instrukcję:
  1. <?php
  2. ?>

Niestety nowa tabela nie jest utworzona (IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif) . Co robię źle?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Pozdrawiam
dgaleza
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




$id to liczba? Nazwa tabeli nie moze byc liczbą.

Proponuje jednak zmiane struktury.
Jedna tabela, ktora zawiera to co kazda tabela co chcesz stworzyc, ale dodac pole identyfikujace ucznia i juz.
PO co dla kazdego walic inna tabele?
Go to the top of the page
+Quote Post
dgaleza
post
Post #3





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


Z początku też myślałem, że nazwą tabeli nie może być liczba, ale się okazało przy ręcznym tworzeniu tabeli, że jest w stanie taką właśnie tabelę stworzyć.
Zmienię $id na $przedmiot. Wtedy nazwa tabeli będzie równoznaczna z nazwą przedmiotu który obsługuje.

Nie tworzę osobnych tabel dla każdego ucznia, tylko dla kazdego przedmiotu. Przedmioty dodaje się na specjalnej liście wraz z nazwiskami nauczycieli. Chciałem, by podczas tworzenia przedmiotu tworzyła się tabela o nazwie=ID dodawanego wiersza

Spróbuję zmienić tą nazwę tabeli i opisze swoje poczynania.



Poprawiłem, ale i tak nie działa (IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif)
Wygląda to tak:
  1. <?php
  2. $sql = "CREATE TABLE ".$_POST['przedmiot']." (uczen_ID TEXT NOT NULL, oceny TEXT NOT NULL, sr TEXT NOT NULL, np TEXT NOT 
    NULL)"
    ;
  3.  $wynik = mysql_query ($query);
  4. }}
  5.  
  6. //pobierz tabele
  7. $wynik = mysql_query ("SELECT * FROM lekcje ORDER BY ob DESC;") or die ("Blad w pytaniu");
  8. print "<TABLE BORDER=1>";
  9. print "<tr><td><b>Przedmiot</b></td><td><b>Nazwisko i imię</b></td></tr>";
  10.  mysql_query ($sql);
  11. ?>
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Z początku też myślałem, że nazwą tabeli nie może być liczba, ale się okazało przy ręcznym tworzeniu tabeli, że jest w stanie taką właśnie tabelę stworzyć.
hmmm, mi nie byl w stanie tego stworzyc.

Cytat
Nie tworzę osobnych tabel dla każdego ucznia, tylko dla kazdego przedmiotu.
Chodzilo mi bardziej o idee, a nie oto czy to osobna tabela na ucznia czy na przedmiot.
Po co tworzyc osobne tabele na cos, co mozna w jednej zapisac? Tak sie nie robi.
Go to the top of the page
+Quote Post
qbatoja
post
Post #5





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 3.05.2005

Ostrzeżenie: (10%)
X----


A oplaczyles sie z baza danych i wybrales odpowiednia baze?

  1. <?php
  2. $db_host = 'localhost';
  3. $db_user = 'root';
  4. $db_password = '';
  5. $db_name = 'my_db'; //nazwa twojej tabeli
  6. $db = mysql_connect($db_host, $db_user, $db_password);
  7. if(!$db)
  8. {
  9. echo('Nie można połączyć się z bazą danych. Host: ' . $db_host);
  10. }
  11. mysql_query('USE ' . $db_name);
  12. {
  13. echo('Podana baza nie istnieje. Nazwa: ' . $db_name);
  14. }
  15. ?>


Ten post edytował qbatoja 29.09.2006, 13:24:16
Go to the top of the page
+Quote Post
dgaleza
post
Post #6





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


Łącze się z bazą danych, ponieważ dodaję rekordy do tabeli. I właśnie przy tym dodawaniu chciałem, by program tworzył dynamicznie tabele. Niestety tak się nie dzieje. Strona jest na serwerze altnet.pl
Go to the top of the page
+Quote Post
SongoQ
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Jaki blad zwraca? Trudno stwierdzic co Ci nie dziala. Jak juz ktos wile razy powtarzal nie jestesmy wrozkami zeby takie rzeczy wiedziec.
Go to the top of the page
+Quote Post
myth
post
Post #8





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 25.09.2006

Ostrzeżenie: (0%)
-----


1. Tak jak napisal nospor, liczba nie moze byc nazwa tabeli!

  1. <?php
  2. $sql = "CREATE TABLE ".$_POST['przedmiot']." (uczen_ID TEXT NOT NULL, oceny TEXT NOT NULL, sr TEXT NOT NULL, np TEXT NOT 
    NULL)"
    ;  
  3. $wynik = mysql_query ($query);
  4. ?>


2. Powinno byc:
  1. <?php
  2. $wynik = mysql_query($sql) or die(mysql_error());
  3. ?>


Naucz sie wyswietlac bledy (mysql_error() oraz error_reporting( E_ALL )), a nie bedziesz mial tylu problemow. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
dgaleza
post
Post #9





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


PANOWIE!!! Działa. Musiałem dodać mysql_query w warunku if!!!

Powracając do zapisywania danych w jednej tabeli, to powiedz w jaki sposób dynamicznie tworzyć kolumny?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Jak narazie wszystko działa!!! Wznawiam prace (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) A wszystkim dziękuję za odpowiedzi. Bardzo profesjonalne forum


Już znalazłem odpowiedź na swoje pytanie. Tylko czy tak rzeczywiście powinienem zrobić. Tzn. jedna tabela, a następnie dodawanie kolumn za pomocą polecenia. Czy będzie szybciej i prościej?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
  1. ALTER TABLE `przedmiot` ADD `pole` TEXT NOT NULL ;
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Powracając do zapisywania danych w jednej tabeli, to powiedz w jaki sposób dynamicznie tworzyć kolumny?
A kto ci kazal tworzyc dynamicznie kolumny? Kazdy nowy przedmiot to nowy rekord a nie nowa kolumna. a rekordy to przy pomocy "insert" sie wklada (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
dgaleza
post
Post #11





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


Ja myślałem o czymś takim:

+---------------+---------------+------------+
| przedmiot1| przedmiot2| uczen_ID|
+---------------+---------------+------------+
| oceny1.......|oceny2.........|35.............|
+---------------+---------------+------------+

Stąd właśnie dynamiczne tworzenie kolumn. W ten sposób będzie chyba łatwiej wyświetlić dane
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




a ja myslalem o takiej:
Kod
idUcznia | idPrzedmiotu | ocena

I kazdy rekord w tej tabeli opisuje jedna ocene dla konkretnego ucznia z konkretnego przedmiotu
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #13





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


dgaleza: poprzegladaj jakies proste przykladowe projekty poprawnych (4p (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ) baz danych, poczytaj o normalizacji -- bo to co chciales stworzyc to jest porazka (dobra droge ci nospor wskazal -- tabele: uczen, przedmiot, oceny_z_przedmiotu, itd). Kolumny TEXT do wszystkich wartosci?? po co?
Go to the top of the page
+Quote Post
dgaleza
post
Post #14





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 29.09.2006, 22:30:18 ) *
a ja myslalem o takiej:
Kod
idUcznia | idPrzedmiotu | ocena

I kazdy rekord w tej tabeli opisuje jedna ocene dla konkretnego ucznia z konkretnego przedmiotu


Ja również myślałem o tabeli tego typu, tylko czy to nie będzie marnotrawienie pamięci. Dajmy na to mamy 16 przedmiotów po 8 ocen z każdego i 35 uczniów. 16*8*35=4480!!!
Wersja z kolumnami, gdzie oceny są wpisywane po przecinku: 16*35=560

Spora różnica. Prawda??
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




No, roznica spora, ale nie zawsze o roznice chodzi (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Od biedy mozesz zrobic tak:
Kod
idUcznia | idPrzedmiotu | oceny

gdzie oceny bedzie zawieralo oceny odzielone srednikami dla danego ucznia z danego przedmiotu.
Akurat oceny w tym wypadku wydaja sie nie byc kluczowym elementem, jesli chodzi o jakies analizy czy tez wyszukiwania.
No chyba ze jednak bedziesz robil jakies statystyki na ocenach, to jednak polecam rozbice tego na oddzielne rekordy jak na poczatku zaproponowalem
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #16





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


dgaleza: roznica jest prawie 10krotna, ale i tak taka baze zmiescilbys na DYSKIETCE! a miejsca masz zapewne duzo wiecej.

Gdy bedziesz mial znormalizowana baze to
Cytat
No chyba ze jednak bedziesz robil jakies statystyki na ocenach, to jednak polecam rozbice tego na oddzielne rekordy jak na poczatku zaproponowalem

Bedzie duzo prostrze niz babranie sie z przecinkami/srednikami.
Go to the top of the page
+Quote Post
dgaleza
post
Post #17





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


To mały paradoks, ale jesteś bardziej doświadczony ode mnie i rzeczywiście ten pomysł jest bardzo dobry. Miałem zamiar dodać jeszcze jedną kolumnę o nazwie srednia, gdzie podczas dodawania oceny bylaby na biezaco obliczana srednia i nastepnie wyswietlana za pomoca txt i grafiki. Ale to juz mniejsza z tym.
Jeszcze raz dziękuję za odpowiedzi.
Go to the top of the page
+Quote Post
qbatoja
post
Post #18





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 3.05.2005

Ostrzeżenie: (10%)
X----


oni maja racje ziomus, jakbys mial wykonywac operacje na srringu z liczbami odzielonymi przecinkami, to marnujesz zasoby. mniesjza o to. powo ;]
Go to the top of the page
+Quote Post
SongoQ
post
Post #19





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Cytat
Miałem zamiar dodać jeszcze jedną kolumnę o nazwie srednia, gdzie podczas dodawania oceny bylaby na biezaco obliczana srednia i nastepnie wyswietlana za pomoca txt i grafiki. Ale to juz mniejsza z tym.

Srednia zawsze mozesz w locie obliczac
Go to the top of the page
+Quote Post
dgaleza
post
Post #20





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


Więc podsumujmy temat:
Czy lepiej tworzyć tabelę każda ocena w jednym rekordzie, czy wiele ocen w rekordzie?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Którą z wyżej wymienionych opcji będzie łatwiej edytować i wyświetlać?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Średniej nie chciałbym obliczać w locie, bo jak program zinterpretuje "5+"?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Wiecie co Panowie. Robię tabele z jedną oceną w rekordzie, a oceny będę szyfrował. Tzn: przy wysyłaniu ocena nie jest zapisywana jako 5+ tylko 5.5. Następnie przy odczycie spradzenie czy jest ".", następnie czy po . jest 5 - jeśli tak +, elseif (czy po kropce jest 75) -
Go to the top of the page
+Quote Post
SongoQ
post
Post #21





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Hm 5+ = 5.5 to skad bedziesz wiedzial ze jest -6 ?
Go to the top of the page
+Quote Post
dgaleza
post
Post #22





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


"+" w średniej szkolnej oznacza +0.5 pkt
"-" zaś oznacza -0.25pkt
Go to the top of the page
+Quote Post
nospor
post
Post #23





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Robię tabele z jedną oceną w rekordzie, a oceny będę szyfrował
"Szyfrowal" - jak to powaznie brzmi (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ok, wydaje sie to sensowne rozwiązanie.
Cytat
elseif (czy po kropce jest 75) -

No i oczywiscie wowczas cyfre przed kropką trzeba zwiększyc o jeden. bo przecez 5.75 to jest 6- a nie 5-
Go to the top of the page
+Quote Post
dgaleza
post
Post #24





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


Teraz zastanawiam się tylko nad nie przygotowaniami. Wymyśliłem takie coś.
Po wejściu na stronę ocen danego ucznia warunek sprawdzałby czy z tego przedmiotu, dany uczeń ma nieprzygotowania (czyli czy jest wiersz dotyczący tego ucznia), jeżeli nie to tworzy wiersz z wartością 0 (0 zgłoszonych nie przygotowań). Następnie można edytować ten wiersz.

Chyba dobre rozwiązanie?? Prawda??
Go to the top of the page
+Quote Post
giron
post
Post #25





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 28.09.2006

Ostrzeżenie: (0%)
-----


ojejku
strukture bazy danych zawsze tworzy sie z mysla o optymalizacji, jak chodzi o miejsce i o dalsza prace z baza
Struktura bazy powinna byc tak zorganizowana, aby kazda zmiane robic w jednym miejscu. Dodajesz 1 rekord w tabeli przedmiot i gotowe, wszystko dziala. Przy Twoim pomysle poczatkowym ile pracy nalezaloby dodac aby zmienic np. nazwe jakiegos przemiotu lub inaczej modyfikowac rekordy - duzo, a i po co. Po to wymyslono relacyjne bazy danych, aby ulatwic sobie zycie. W innym przypadku dalej mozemy je trzymac na np. pliku tekstowym.

zrob sobie tak:

tabela przedmioty
ID_Przedmiot, nazwa, .... i inne dane zwiazane z 1 przemiotem

tabela Uczniowie
ID_Uczen, imie, nazwisko, srednia ocen, ......

tabela oceny
ID_Uczen, ID_Przedmiot, ocena

pomysl z zamiana oceny 5+ na 5.5 jest b.dobry, pomoze Ci to przy liczeniu sredniej.
Aha, a i po co "parsowac" tekst, tzn. sprawdzac czy jest kropka czy jej nie ma, nie lepiej Ci porownywac liczby? ocena ==5.5, badz ocena > 5.5 itd

aha, i pamietaj o kluczach na tabelach (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

pozdrawiam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
dgaleza
post
Post #26





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


Wydaje mi się, że prościej będzie wykorzystać funkcję z "rozszyfrowaniem" (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) ocen. Tak trzeba byłoby skorzystać np. z case. A funkcja będzie bardziej plastyczna.
Go to the top of the page
+Quote Post
SongoQ
post
Post #27





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Cytat
Wydaje mi się, że prościej będzie wykorzystać funkcję z "rozszyfrowaniem" (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) ocen. Tak trzeba byłoby skorzystać np. z case. A funkcja będzie bardziej plastyczna.

A przeliczanie jakich kolwiek statystyk bedzie trwalo godzinami (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
dgaleza
post
Post #28





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 29.09.2006

Ostrzeżenie: (0%)
-----


Cytat(SongoQ @ 4.10.2006, 11:08:29 ) *
A przeliczanie jakich kolwiek statystyk bedzie trwalo godzinami (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)


Nie sądze,by przy użyciu "szyfrowania" trwalo to zbyt długo. A poza tym niby jakie to miałby być statyski?? Jedyną statyską to średnia.
Go to the top of the page
+Quote Post
SongoQ
post
Post #29





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Jesli zakladasz ze to kilka rekordow to nie ma znaczenia a jesli w gre wchodza rekordu rzedu kilku milionow to kazda operacja przeliczania narzuca pewien czas.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.12.2025 - 19:05