Avatar billede engberg Juniormester
11. oktober 2005 - 13:51 Der er 23 kommentarer og
2 løsninger

Gennemgå alle tabeller i en database

Jeg mangler en funktion der kan:

Løkke start
  åben tabel
  gør ting med tabellen
Løkke slut

Løkken skal gennemgå alle tabellerne der starter med Bruger_

Mine tabeller hedder:
Bruger_0
Bruger_1
Bruger_2
Bruger_7
Bruger_8

Og den skal altså kunne håndtere at der kommer huller...
Avatar billede barklund Nybegynder
11. oktober 2005 - 13:54 #1
Du har ikke lavet en tabel for hver bruger? Det lyder som mildest talt dårligt databasedesign - og det er meget mildt sagt.

Men du kan da lave en SHOW TABLES og ud fra dette løbe tabeller igennem og rette dem. Men man bør altså _aldrig_ have et dynamisk antal tabeller eller dynamisk antal felter i disse - kun dynamisk antal rækker i fastlåste tabelstrukturer.

--
Morten Barklund
Avatar billede saucer Nybegynder
11. oktober 2005 - 13:57 #2
Her kan du få hjælp til dit spørgsmål.. Rent faktisk vises der et eks med dette :)

http://dk.php.net/manual/da/function.mysql-select-db.php
Avatar billede engberg Juniormester
11. oktober 2005 - 14:05 #3
barklund>> Øhh... jo jeg har lavet en tabel for hver bruger - og der smutter hurtigt 3-400 poster på hver bruger...
Mener du stadig det er dårligt design og hvorfor?
Hvis jeg nu gør noget i den her stil:
$info = mysql_fetch_array(mysql_query("SHOW TABLE FROM $Database LIKE 'Bruger_'"));
- er det sådan det fungerer - og hvordan finder jeg så antallet???

saucer>> Jeg må være blind - men hvor er det lige du mener, at der er et eksempel jeg kan bruge???
Avatar billede barklund Nybegynder
11. oktober 2005 - 14:09 #4
engbjerg>> ja, det er forfærdeligt databasedesign. hvad har du for eksempel i din bruger-tabel?
Avatar billede barklund Nybegynder
11. oktober 2005 - 14:10 #5
engberg even :)
Avatar billede barklund Nybegynder
11. oktober 2005 - 14:11 #6
Avatar billede Slettet bruger
11. oktober 2005 - 14:16 #7
3-400 poster er jo ingenting. pt. har jeg lidt over 450.000 poster i min statistik-database :)
Avatar billede saucer Nybegynder
11. oktober 2005 - 14:17 #8
engberg >>

Du akal oprette et db med navnet eks. brugere

Den inde kan du så have :

id
brugernavn
password
email
navn
køn
osv..

Det er normalt sådan man gemmer / laver en bruger karotek. Det du har lavet er noget lort og du vil hurtig laver en overkill + at din side vil gå død hvis du laver alt for mange samfletninger af bruger info..
Avatar billede engberg Juniormester
11. oktober 2005 - 14:18 #9
barklund>> even ??
Jeg har en masse resultater, som sagt hurtigt 3-400 rækker og snilt mange flere...

Hvordan får jeg den til at begrænse sig til de tabeller der starter med Bruger_

mysql_connect("localhost", "mysql_bruger", "mysql_kode");
$result = mysql_list_tables("mindb");
$num_rows = mysql_num_rows($result);
for ($i = 0; $i < $num_rows; $i++) {
  $Tabel = mysql_tablename($result, $i);
  $result2 = mysql_query("SELECT * FROM $Tabel WHERE Type='$type'",$db) or die ($db_fejl.mysql_error());
  while ($arr = mysql_fetch_array($result)) {
      GØR NOGET;
  }
}


- og hvad skal den her linie gøre godt for???
mysql_free_result($result);
Avatar billede saucer Nybegynder
11. oktober 2005 - 14:18 #10
el_barto >> Har du dem i en DB eller har du dem i 450.000 db
Avatar billede saucer Nybegynder
11. oktober 2005 - 14:19 #11
+ el_barto hvad er pointen med at have så mange db'er til samme info ??
Avatar billede engberg Juniormester
11. oktober 2005 - 14:21 #12
saucer>> Jo tak men ud over:

id
brugernavn
password
email
navn
køn

har jeg også brug for at indsætte rækker hver gang brugeren har gjort noget - kald det bare en slags log...

hændelse1
hændelse2
hændelse3
hændelse4
hændelse5
hændelse6
hændelse7
osv... der er vist ca. 20 feltnavne...

Altså vil bare det jeg har nu skabe en tabel med ca. 30 kolonner og
Avatar billede Slettet bruger
11. oktober 2005 - 14:22 #13
Nej, jeg har 450.000 poster i samme tabel, i samme database
Avatar billede engberg Juniormester
11. oktober 2005 - 14:23 #14
4000 rækker - og senere skal der være mulighed for mindst 30 kolonner og 10.000.000 rækker...

Mener I så stadig det er smartest og lave en tabel - og hvorfor?
Avatar billede barklund Nybegynder
11. oktober 2005 - 14:24 #15
engberg, så laver du en tabel til log, og en tabel til noget tredje, og en til noget fjerde - men kun en af hver. Ofte kommer man måske op på 30-40 tabeller med diverse brugerdata og så kan der være millioner af rækker i hver tabel. Jeg har også mysql-tabeller på 100 millioner rækker - det er intet problem, der er jo det, databasen er lavet til. Databasen er derimod _ikke_ lavet til at skalere i bredden og til at indeksere tabeller på tværs på den mærkelige måde, som du har lavet.
Avatar billede barklund Nybegynder
11. oktober 2005 - 14:26 #16
Nejnej, du laver 1 tabel med 1 række for hver bruger:

id | navn | email | køn | ...

Så laver du en anden tabel med for eksempel en log over, hvornår de har logget ind:

id | tidspunkt

Og her laver du så en ny række for hver gang, brugeren logger ind - hvis det for eksempel er sådan statistik, som du opsamler. Man må godt have flere tabeller med forskelligt udseende, der refererer til hinanden - det er sådan set konceptet i en database :)

--
Morten Barklund
Avatar billede barklund Nybegynder
11. oktober 2005 - 14:27 #17
Men nu snakker vi ikke rigtig php længere - men fornuftigt databasedesign. :)
Avatar billede saucer Nybegynder
11. oktober 2005 - 14:39 #18
el_barto >> Ok, iorden.. Jeg læste det bare som om at du havde 450000 DB'er :)

Men lige som alle andre siger så er vejen frem kun ved at lave en DB som skla indeholde alle brugere..
Avatar billede saucer Nybegynder
11. oktober 2005 - 14:41 #19
Det du nu skal gøre er vel at lave en kopi af bruger db og omdøbe den til et unik navn.. eks. users. Når du så skal oprette flere brugere så skal du ikke create/lavet et nyt db men bare bruge INSERT INTO users () VALUES ()
Avatar billede fixxxer Nybegynder
11. oktober 2005 - 15:17 #20
Her af navnet "relationsdatabase" ? :)
Avatar billede engberg Juniormester
11. oktober 2005 - 21:23 #21
Hmm... hvad så når der nu er 1000 brugere der på samme tid skal i kontakt med data i den samme tabel - er det ikke sværere end hvis de skal i hver sin tabel?
Eller er det hip som hap om det er samme tabel, når bare det er samme database?

Og jeg har i øvrigt allerede tabellen til id | navn | email | køn | ...

- jeg troede i min autodidakte naivitet bare at det var smartere med flere tabeller....

Barklund - smid svar - det er vist dig der har hjulpet mig mest, selvom spørgsmålet har drejet sig lidt...
Avatar billede Slettet bruger
12. oktober 2005 - 06:27 #22
En database er lavet til at flere skal kunne bruge den på samme tid, så overlad den bekymring til andre :)
Avatar billede saucer Nybegynder
12. oktober 2005 - 08:46 #23
engberg >> Det er sq mere krævende for process med 1000 brugere at skulle konnecte til 1000 tabeller frem for 1 :D
Avatar billede showsource Seniormester
12. oktober 2005 - 08:51 #24
Og for lige...
mysql_connect("localhost", "mysql_bruger", "mysql_kode");
$result = mysql_list_tables("mindb");
$num_rows = mysql_num_rows($result);

for ($i = 0; $i < $num_rows; $i++) {
    if(substr(mysql_tablename($result, $i), 0, 7) != "Bruger_") {
    continue;
    }
  $Tabel = mysql_tablename($result, $i);
  $result2 = mysql_query("SELECT * FROM $Tabel WHERE Type='$type'",$db) or die ($db_fejl.mysql_error());
  while ($arr = mysql_fetch_array($result)) {
      GØR NOGET;
  }
}

Hvis ikke du bruger mysql_free_result() efter while, vil den formodentlig blive ved at bruge som resultat i for-løkken.
Og brug altid gerne mysql_free_result() når resultat ikke længere skal bruges
Avatar billede engberg Juniormester
21. november 2005 - 08:42 #25
BARKLUND SMID SVAR!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester