Avatar billede Slettet bruger
10. august 2010 - 12:52 Der er 21 kommentarer og
1 løsning

Script til at lave database om. Ny fil til at sende data med.

Jeg har en anden tråd åben her på forum hvor jeg ville have lidt hjælp.

Jeg blev forslået at lave min database om.
Men det er ikke lige det nemmeste at gøre manuelt.

Jeg har en database kaldet Ideer
Jeg har i mit eksempel valgt bare at kalde colonerne for RækkeX  og indholdet for tal da jeg så lære mere ved at gennemgå koderne selv og lave det om der skal laves om.

Nu håber jeg at dette kan læses:

Ideer
[-A-][---Række 1---][---Række 2---][---Række 3---]
--1--|-1, 2, 3, 4,-|----10, 11----|--20, 21, 22--|
--2--|-1, 2, 4, 5,-|----12, 13----|--23, 24, 25--|
--3--|-1, 3, 5, 6,-|----11, 12----|--20, 22, 25--|
--4--|-2, 3, 5, 6,-|----10, 13----|--21, 23, 24--|



Det jeg gerne vil er at jeg gerne vil have det disse felter ud i 3 nye databaser.
sådan at A og Række 1 kommer i en database hvor hvert tal under række 1 får sin egen celle:


Database 1
[ID][-A-] [Række 1]
-1-|--1--|----1---|
-2-|--1--|----2---|
-3-|--1--|----3---|
-4-|--1--|----4---|
-5-|--2--|----1---|
-6-|--2--|----2---|
-7-|--2--|----4---|
-8-|--2--|----5---|


Det samme skal der så ske med Række 2 og 3
Dog skal de i database 2 og 3 istedet.

Er der nogen der kan hjælpe mig med at lave sådanne et script.
Evt kan der bare laves 1 script til den ene række.
Så kan jeg selv lave til de 2 andre.
Alle data i tabellen er delt op med som det står 1, 2, 3, osv..
Altså med et komma og et mellem rum.

Når dette er på plads vil jeg gerne have hjælp til at lave en fil til at sende data med. Jeg har en men den skal så laves om så det tager vi bag efter.

Jeg skal godt nok noget i om et par timer og så er jeg tilbage engang måske sen aften.
Avatar billede ggxdg Nybegynder
10. august 2010 - 14:13 #1
Jeg lavede et eksempel i den anden tråd, så jeg smider den lige her ind:

$rb_res = mysql_query(SELECT * FROM tabel);
while ($rb_row = mysql_fetch_assoc($rb_res)){
  if(!mysql_query(INSERT INTO indekstabel (navn) VALUES('$rb_row[navn]')))
  {
    die('Error: ' . mysql_error());
  } else {
    $id_ref = mysql_insert_id();
    $rb_ex_arr1 = explode(", ", $rb_row['række1']);
    foreach($rb_ex_arr1 as $rb_ex_val1) {
      if(!mysql_query(INSERT INTO tabel1 (id_ref, r1) VALUES('$id_ref', '$rb_ex_val1')))
      {
        die('Error: ' . mysql_error());
      }
    }
    $rb_ex_arr2 = explode(",", $rb_row['række2']);
    foreach($rb_ex_arr2 as $rb_ex_val2) {
      if(!mysql_query(INSERT INTO tabel2 (id_ref, r2) VALUES('$id_ref', '$rb_ex_val2')))
      {
        die('Error: ' . mysql_error());
      }
    }
    $rb_ex_arr3 = explode(",", $rb_row['række3']);
    foreach($rb_ex_arr3 as $rb_ex_val3) {
      if(!mysql_query(INSERT INTO tabel1 (id_ref, r3) VALUES('$id_ref', '$rb_ex_val3')))
      {
        die('Error: ' . mysql_error());
      }
    }
  }
}


Der er en hel masse querys, så den er nok ret tung at danse med, det kan nok gøres bedre. Jeg var ved at overveje at bygge arrays op, og så bare reducere det hele til 4 querys, men du skriver at der er over 2500 resultater i DB'en, hvilket er grunden til at jeg har valgt den langsomme, men forhåbenligt mere hukommelses-venlige løsning.


Tabeller
[id][navn]
CREATE TABLE indekstabel (
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    navn CHAR(30) NOT NULL,
    PRIMARY KEY (id)
);


[id_ref][r1]
CREATE TABLE tabel1 (
    id_ref MEDIUMINT NOT NULL,
    r1 TINYINT NOT NULL,   
    PRIMARY KEY (id_ref)
);


[id_ref][r2]
CREATE TABLE tabel2 (
    id_ref MEDIUMINT NOT NULL,
    r2 TINYINT NOT NULL,   
    PRIMARY KEY (id_ref)
);


[id_ref][r3]
CREATE TABLE tabel3 (
    id_ref MEDIUMINT NOT NULL,
    r3 TINYINT NOT NULL,   
    PRIMARY KEY (id_ref)
);
Avatar billede Slettet bruger
10. august 2010 - 14:26 #2
Lige inden jeg smutter.
Indekstabelen... hvad bliver den præcis brugt til?

Kunne man ikke bare nøjes med databasen tabel som man henter fra i først?
Avatar billede ggxdg Nybegynder
10. august 2010 - 14:37 #3
Jo, det kan du godt.
Men du vil have en masse ekstra data der bare ligger og flyder, medmindre du efterfølgende sletter de ekstra kolonner.

Min tanke var at bygge alle op fra bunden, så har du den gamle tabel som backup i tilfælde af at noget går galt.
Avatar billede ggxdg Nybegynder
10. august 2010 - 14:37 #4
Men hvis man gør som du siger, og bruger den originale tabel som indeks, vil scriptet blive lidt simplere.
Avatar billede Slettet bruger
10. august 2010 - 14:41 #5
Kommer lige tilbage i aften. Kæresten slår mig i hovedet lige nu. V skal åbenbart ud af døren nu :P
Avatar billede ggxdg Nybegynder
10. august 2010 - 14:45 #6
Her er scriptet hvor man bare bruger den eksisterende tabel som indeks-tabel
$rb_res = mysql_query(SELECT * FROM tabel);
while ($rb_row = mysql_fetch_assoc($rb_res)){
    $rb_ex_arr1 = explode(", ", $rb_row['række1']);
    foreach($rb_ex_arr1 as $rb_ex_val1) {
      if(!mysql_query(INSERT INTO tabel1 (id_ref, r1) VALUES('rb_row[id]', '$rb_ex_val1')))
      {
        die('Error: ' . mysql_error());
      }
    }
    $rb_ex_arr2 = explode(",", $rb_row['række2']);
    foreach($rb_ex_arr2 as $rb_ex_val2) {
      if(!mysql_query(INSERT INTO tabel2 (id_ref, r2) VALUES('rb_row[id]', '$rb_ex_val2')))
      {
        die('Error: ' . mysql_error());
      }
    }
    $rb_ex_arr3 = explode(",", $rb_row['række3']);
    foreach($rb_ex_arr3 as $rb_ex_val3) {
      if(!mysql_query(INSERT INTO tabel1 (id_ref, r3) VALUES('rb_row[id]', '$rb_ex_val3')))
      {
        die('Error: ' . mysql_error());
      }
    }
  }
}
Avatar billede ggxdg Nybegynder
10. august 2010 - 15:06 #7
der er lige en afsluttende klamme for meget i ovenstående kode;
Rettet:

$rb_res = mysql_query(SELECT * FROM tabel);
while ($rb_row = mysql_fetch_assoc($rb_res)){
  $rb_ex_arr1 = explode(", ", $rb_row['række1']);
  foreach($rb_ex_arr1 as $rb_ex_val1) {
    if(!mysql_query(INSERT INTO tabel1 (id_ref, r1) VALUES('rb_row[id]', '$rb_ex_val1')))
    {
      die('Error: ' . mysql_error());
    }
  }
  $rb_ex_arr2 = explode(",", $rb_row['række2']);
  foreach($rb_ex_arr2 as $rb_ex_val2) {
    if(!mysql_query(INSERT INTO tabel2 (id_ref, r2) VALUES('rb_row[id]', '$rb_ex_val2')))
    {
      die('Error: ' . mysql_error());
    }
  }
  $rb_ex_arr3 = explode(",", $rb_row['række3']);
  foreach($rb_ex_arr3 as $rb_ex_val3) {
    if(!mysql_query(INSERT INTO tabel1 (id_ref, r3) VALUES('rb_row[id]', '$rb_ex_val3')))
    {
      die('Error: ' . mysql_error());
    }
  }
}
Avatar billede ggxdg Nybegynder
10. august 2010 - 15:09 #8
og explode 2 og 3 rettes til
explode(", ", $rb_row['

der mangler lige et mellemrum
Avatar billede showsource Seniormester
10. august 2010 - 15:44 #9
Noget af det samme, men med en query for hvert row, ikke for hver værdi der kommer med explode:


$rows = mysql_query("SELECT id, feltnavn FROM tabel") or die (mysql_error());

while($v = mysql_fetch_object($rows)) {

$vars = explode(",", $v->feltnavn);

$sqlvar = array();

    for($i = 0; $i < count($vars); $i++) {

    $sqlvar[] = "(NULL,'".$vars[$i]."','".$v->id."')";

    }

$sql = "INSERT INTO ny_tabel VALUES ".implode(",", $sqlvar);

echo $sql."<br>";
}

I stedet for echo skal det jo så være mysql_query() ......
Avatar billede ggxdg Nybegynder
10. august 2010 - 18:56 #10
Yeah, det var også min første tanke at lave det noget i samme stil, men arrayet bliver lidt stort med over 2500 resultater. Hvis man så også skal have 2-3 af dem.
Jeg har ingen idé om hvor meget arrays kan indeholde i PHP...
Avatar billede showsource Seniormester
10. august 2010 - 19:20 #11
Der er 2500 rækker i db, ikke 2500 ved explode, så vidt jeg ved.
Jeg har lavet en insert af 7000+ rækker lavet ud fra et array.
Det tog ca. 30 sekunder.
P4 2.4 Ghz, 2 Gb ram og raid 0 (to diske), sata 150

Umiddelbart vil jeg tro man skal ha' en rigtig gammel comp, hvis ikke det kører ok.
Avatar billede ggxdg Nybegynder
10. august 2010 - 20:33 #12
yeah... 2500 vil være worst-case pr. array.

Og for hulen da.... 7k+ rækker var ikke så lidt...
Jeg arbejder normalt overhovedet ikke med så store arrays, og inserts, jeg er selvlært og jeg skal indrømme at jeg ikke rigtigt har undersøgt hvad begrændsninger der er for arrays og inserts.

Er der et maks antal variabler i et array (jeg går ud fra at key'en har en eller anden maksimal integer-værdi)? eller ligger begrændsningen udelukkende i de 8MB RAM de fleste sider får tildelt?
Avatar billede Slettet bruger
11. august 2010 - 00:01 #13
Får denne fejl på din kode:

Parse error: syntax error, unexpected T_STRING in ...naa.php on line 4

Hvilket er din første linje:
$rb_res = mysql_query(SELECT * FROM tabel);
Avatar billede Slettet bruger
11. august 2010 - 00:06 #14
Fandt lige et par steder hvor der manglede "

Men nu fik jeg kørt den.
Jeg fik med det samme denne fejl:

Error: Duplicate entry '0' for key 1


Og jeg fik kun indsat 1 linje i den første database.
Fik indsat:

[ID][R2]
-0-|-1-
Avatar billede Slettet bruger
11. august 2010 - 01:47 #15
YIR BABY.... Så lykkes det

Der manglede også et par $

Smid et svar :)
Avatar billede Slettet bruger
11. august 2010 - 02:00 #16
Lige for at forstå det helt:

Her henter du data fra tabellen tabel

$rb_res = mysql_query(SELECT * FROM tabel);
while ($rb_row = mysql_fetch_assoc($rb_res)){


Hvad sker der helt præcis her:

  $rb_ex_arr1 = explode(", ", $rb_row['række1']);

Laver du en array som er =
Explode deler en linje op i flere linjer
og den får afvide at den skal deles imellem ", " Altså komma og mellemrum.
, $rb_row['række1'] fortæller så at det skal være gældende i række1

Hvad sker der så her:

  foreach($rb_ex_arr1 as $rb_ex_val1) {
    if(!mysql_query(INSERT INTO tabel1 (id_ref, r1) VALUES('rb_row[id]', '$rb_ex_val1')))
    {
      die('Error: ' . mysql_error());
    }

Det må gerne forklares lidt linje efter linje.
Avatar billede ggxdg Nybegynder
11. august 2010 - 08:13 #17
foreach() er et loop der kører for hver værdi der ligger i arrayet. Denne funktion sætter så den aktuelle værdi i loopet til $rb_ex_val1, som så bare bliver sat ind i databasen.


fandt du en løsning på
Error: Duplicate entry '0' for key 1
?

Det er vel fordi at en key skal være unik? (det er alt for lang tid siden jeg har lavet tabeller, så jeg kan ikke lige helt huske det.)

id_ref skal jo helst ikke være unik, i så fald refererer den jo ikke korrekt til id'en i "indeks-tabellen".
Avatar billede showsource Seniormester
11. august 2010 - 12:28 #18
Ja, fejlen er at feltet ikke kan ha' samme værdi i flere rows.

Og du bør nok også lave index, "indholdsfortegnelse", i dine nye tabeller.

Jeg er iøvrigt også selvlært, og absolut ikke "pro".
De 7000+ var fordi jeg ville lave en tabel med alle mulige to og tre tals kombinationer til www.lottostatistik.dk

Og det var iøvrigt under udvikling af den side, jeg blev opmærksom på nødvendigheden af at lave index.
Avatar billede Slettet bruger
11. august 2010 - 14:45 #19
Jeps lavede bare en ny der bare hed id som key.
Så var den skid slået.

Nååå ja.. nu kan jeg godt se det.
Tak for hjælpen.

Du glemte at svare :)
Avatar billede ggxdg Nybegynder
11. august 2010 - 19:04 #20
Svar her, bare del dem med showsource hvis han vil have nogle.
Hans løsning var nok lidt mere elegant :P
Avatar billede Slettet bruger
11. august 2010 - 19:37 #21
Det er op til jer.
Jeg brugte jo ikke hans da din virkede perfekt.
Men vil da lige kigge på hans på et andet tidspunkt når der skal leges lidt :) Det er godt at lære selvom man ikke har brug for det.
Avatar billede showsource Seniormester
11. august 2010 - 20:02 #22
Man kan jo desværre hverken få mad eller øl for point ! :O(

Og glem nu ikke det med at lave index på dine tabeller !!!!!
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