Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dynamiczne tworzenie tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
dgaleza
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 sadsmiley02.gif . Co robię źle?questionmark.gif

Pozdrawiam
dgaleza
nospor
$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?
dgaleza
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 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. ?>
nospor
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.
qbatoja
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. ?>
dgaleza
Łą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
SongoQ
Jaki blad zwraca? Trudno stwierdzic co Ci nie dziala. Jak juz ktos wile razy powtarzal nie jestesmy wrozkami zeby takie rzeczy wiedziec.
myth
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. smile.gif
dgaleza
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?questionmark.gif

Jak narazie wszystko działa!!! Wznawiam prace 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?questionmark.gif
  1. ALTER TABLE `przedmiot` ADD `pole` TEXT NOT NULL ;
nospor
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 smile.gif
dgaleza
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
nospor
a ja myslalem o takiej:
Kod
idUcznia | idPrzedmiotu | ocena

I kazdy rekord w tej tabeli opisuje jedna ocene dla konkretnego ucznia z konkretnego przedmiotu
dr_bonzo
dgaleza: poprzegladaj jakies proste przykladowe projekty poprawnych (4p 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?
dgaleza
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??
nospor
No, roznica spora, ale nie zawsze o roznice chodzi 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
dr_bonzo
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.
dgaleza
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.
qbatoja
oni maja racje ziomus, jakbys mial wykonywac operacje na srringu z liczbami odzielonymi przecinkami, to marnujesz zasoby. mniesjza o to. powo ;]
SongoQ
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
dgaleza
Więc podsumujmy temat:
Czy lepiej tworzyć tabelę każda ocena w jednym rekordzie, czy wiele ocen w rekordzie?questionmark.gif

Którą z wyżej wymienionych opcji będzie łatwiej edytować i wyświetlać?questionmark.gif

Średniej nie chciałbym obliczać w locie, bo jak program zinterpretuje "5+"?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) -
SongoQ
Hm 5+ = 5.5 to skad bedziesz wiedzial ze jest -6 ?
dgaleza
"+" w średniej szkolnej oznacza +0.5 pkt
"-" zaś oznacza -0.25pkt
nospor
Cytat
Robię tabele z jedną oceną w rekordzie, a oceny będę szyfrował
"Szyfrowal" - jak to powaznie brzmi 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-
dgaleza
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??
giron
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 smile.gif

pozdrawiam smile.gif
dgaleza
Wydaje mi się, że prościej będzie wykorzystać funkcję z "rozszyfrowaniem" biggrin.gif ocen. Tak trzeba byłoby skorzystać np. z case. A funkcja będzie bardziej plastyczna.
SongoQ
Cytat
Wydaje mi się, że prościej będzie wykorzystać funkcję z "rozszyfrowaniem" 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 tongue.gif
dgaleza
Cytat(SongoQ @ 4.10.2006, 11:08:29 ) *
A przeliczanie jakich kolwiek statystyk bedzie trwalo godzinami 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.
SongoQ
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.
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.