Avatar billede Slettet bruger
18. januar 2011 - 22:42 Der er 5 kommentarer og
1 løsning

Kopier data og sæt det ind igen med lidt ændringer

Så bliver mine forklarings evner igen sat på prøve.
Men spørg endelig hvis i ikke forstår. Jeg ved godt at jeg ikke er god til at forklar.

Jeg har en liste med bruger som er hentet fra databasen "bruger".
Men det er kun de bruger der er ikke er i databasen "valg" i denne runde:


$result = mysql_query("SELECT * from bruger where b_brugernavn NOT IN (SELECT v_brugernavn FROM valg WHERE v_runde='$runde') ORDER BY b_brugernavn DESC");
While($row=mysql_fetch_array($result))
{
echo    "<tr>";
echo    "<td>".$row['u_NAME']."</td>";
echo    "<td><a href='test2.php?name=".$row['b_brugernavn']."'>Kopier sidste rundes hold</a></td>";
echo    "</tr>";
}


Det jeg nu gerne vil er at jeg enten ved at trykke på linket "kopier sidst rundes hold" kopiere valget og sætter det igen bare med denne rundes nummer.
Men linket er jo ud for hver bruger.
Hvis man kunne droppe linket og trykke på en knap så alle brugerne på listen fik kopieret deres sidste runde ind med denne runde, så vil det jo være lidt fedt.
Men hvis det er for besværligt er linket også ok.

Jeg har test2.php hvor jeg linker til og har disse oplysninger
$runde = $_SESSION['runde'];
$sidsterunde = $runde - 1;
$_GET['name'];

Nu skal jeg jo så bare finde en måde hvor på at data'erne, bliver kopieret.
Databasen "valg" ser sådan ud:
[v_brugernavn][v_nummer][v_antal][v_runde]

Så skal brugernavn, nummer og antal kopieres og indsættes og runden skal ændres fra $sidsterunde som jo er den vi henter til $runde..

Hvis det ikke giver meget mening så spørg endelig.
19. januar 2011 - 18:35 #1
Du opstiller i realiteten to problemer.  Et problem handler om mysql, hvordan man skriver forespoergsler der traekker data ud af en tabel og indsaetter dem i en anden tabel.  Et andet problem handler om at faa processen styret fra en php fil.

Med hensyn til det foerste problem, mysql, har jeg to bemaerkninger: 

(1)  For at kunne kopiere en brugers sidste runde maa det vel vaere en betingelse at brugeren har en sidste runde.  Det er saaledes ikke tilstraekkeligt at brugerne er 'NOT IN .... $runde', de skal ogsaa vaere 'IN' .... $runde - 1'.

(2)  Tabellen valg indeholder alle noedvendige data, saa forespoergslerne kan holdes i den tabel; ingen grund til at involvere tabellen bruger.

Jeg lavede en test-tabel kaldet ddd_valg2 som jeg viser nedenfor.  Med foelgende query fik jeg det rigtige resultat:

INSERT INTO ddd_valg2(SELECT v_brugernavn, v_nummer, v_antal, v_runde + 1 FROM ddd_valg2 WHERE v_runde = 2 AND v_brugernavn NOT IN(SELECT v_brugernavn FROM ddd_valg2 WHERE v_runde = 3));

Saa det andet problem, php:  Er der nogen grund til at vise brugerne paa php siden?  For dit formaal, at kopiere forige runde, skulle det vel vaere tilstraekkelig at lave en knap 'Kopier sidste rundes hold' der soerger for den korrekte kopiering. Den foelgende kode finder de brugere der ikke har $runde men som har $runde - 1 og kopierer detaljerne under $runde.  I min testtabel har bruger3 og bruger 5 ikke runde 3 men har runde 2.  Koden soerger for at de bliver indsat i tabellen med en runde 3.  Paa testsiden http://christianjorgensen.be/ddd2.php kan du afproeve det.

Her er min testkode:

<?
[forbindelse til databasen]

//$runde = $_SESSION['runde'];
$runde = 3;

if($_POST['kopier']) mysql_query("INSERT INTO ddd_valg2(SELECT  v_brugernavn, v_nummer, v_antal, v_runde + 1 FROM ddd_valg2 WHERE v_runde = 2 AND v_brugernavn NOT IN(SELECT v_brugernavn FROM ddd_valg2 WHERE v_runde = 3))")or die(mysql_error());

else echo "<form action = '' method='POST'><input type='submit' name='kopier' value='Kopier sidste rundes hold'></form>";

mysql_close($link); 
?>

og her er testtabellen:

CREATE TABLE ddd_valg2(v_brugernavn VARCHAR(10), V_nummer INT, v_antal INT, v_runde INT);

INSERT INTO ddd_valg2 VALUES('bruger1', 1, 5, 1);
INSERT INTO ddd_valg2 VALUES('bruger1', 1, 6, 2);
INSERT INTO ddd_valg2 VALUES('bruger1', 1, 7, 3);
INSERT INTO ddd_valg2 VALUES('bruger2', 2, 5, 1);
INSERT INTO ddd_valg2 VALUES('bruger3', 3, 6, 2);
INSERT INTO ddd_valg2 VALUES('bruger4', 4, 8, 2);
INSERT INTO ddd_valg2 VALUES('bruger4', 4, 3, 3);
INSERT INTO ddd_valg2 VALUES('bruger5', 5, 4, 2);

Og saa kan jeg ikke dy mig for denne kommentar:  Det du kalder database kaldes normalt tabeller, og databasen er det system der indeholder alle tabellerne plus de systemtabeller der tager vare paa logikken i systemet.  Du opretter en forbindelse til databasen, og naar forbindelsen er oprettet kan du forespoerge tabellerne i databasen.  Det kan virke forvirrende naar du snakker om at flytte data mellem to databaser hvor det blot drejer sig om at flytte data mellem to tabeller i databasen.
Avatar billede Slettet bruger
20. januar 2011 - 03:18 #2
Hej Christian.
Endnu en gang 1000 tak for den store hjælp.

Ja det med database og tabeller vidste jeg faktisk godt. Ved ikke hvorfor jeg altid kalder dem databaser. Skal nok prøve at holde øje med om jeg gør det igen og vende mig af med det.

Men ellers, undskyld for det sene svar, men har været ude og fejre min eksamener på dette semester er overstået.

Endnu engang er det en fornøjelse at få et svar fra dig. Du beskriver meget hvad du gør og det er virkelig dejligt.

Ang koden.
Skal bruge det 2 steder.

Sted nummer 1 virker det perfekt.
Men sted nummer 2 virker det ikke.

Her kan brugeren selv skrive sig ind, det gør de ved at udfylde 4 indput felter.
I tabellen "log", hvor disse data bliver sat ind, er der yderligere 15 kolonner. Disse 15 kolonner har enten en standard værdi eller tomme. Og disse bliver ændre af brugeren hen af vejen. Når kopireren finder sted skal disse felter ikke kopieres med. Og det er det der skaber problemer. Koden vil have at alle felterne i den række der bliver indsat, skal være udfyldt.

Jeg troede ikke det ville skab problemer da brugeren jo selv nøjes med at indsætte de 4 oplysninger og så kommer resten af sig selv.

Fejlbeskeden der kommer når jeg prøver at bruge koden på denne tabel er her:
Column count doesn't match value count at row 1

Tabellen hedder som sagt "Log"
Den indholder følgende kolonner:
[l_id][l_bruger][l_land][l_by][l_alder][1][2][3]....

Her er det kun disse der skal kopieres og sættes ind i en ny række:
[l_bruger][l_land][l_by][l_alder]

[l_id] er key og har auto_increment.
[1][2][3].... er de andre coloner som ikke skal kopieres.


Håber det var forståeligt ellers bare spørg.
20. januar 2011 - 07:02 #3
Den skal jeg vist lige have igen. 

Dit oprindelige spoergsmaal gik ud paa at indsaette nye raekker i valg.  Du fortalte ikke hvad formaalet var.  Jeg gaettede paa at brugere kan tilmelde sig til en ny runde, for eksempel runde 3.  Hvis de tilmelder sig bliver deres data indsat i valg med runde = 3.  De brugere der ikke tilmeldte sig skal automatiskt tilmeldes ved at kopiere data fra runde 2. Er det nogenlunde rigtigt, og er det problem nu loest ved hjaelp af mit indlaeg?

Saa snakker du om en tabel Log hvor brugere skriver sig ind med navn, land, by, og alder. Tabellen opretter saa en id og indeholder yderligere 15 kolonner, men disse er ikke relevante for naervaerende.  Du har brug for at kopiere en brugers navn, land, by, og alder.  Jeg har ikke forstaaet hvor disse data skal kopieres til, hvornaar de skal kopieres, hvordan kopieringen skal startes (ogsaa med en knap?) og hvad formaalet er.
Avatar billede Slettet bruger
20. januar 2011 - 13:44 #4
Altså jeg havde 2 opgaver der skulle løses. Men troede at begge opgaver kunne løses på samme måde og samme system.

Altså den første med tabellen "valg" virker jo helt super fedt og perfekt.

Det andet var en log. Brugerne skal tilmelde sig en "log". Alle brugerne har været tilmeldt før. Men når loggen åbner igen, så er det ikke altid alle der får sig tilmeldt. Altså med samme princip som "valg".

Så princippet i koden, er ligesom det var med "valg", at man trykkede på en knap, og dem der ikke var tilmeldt den nye "log" runde, vil blive tilmeldt nu, ud fra sidste log runde. Så data fra "log" skal kopiers og sættes ind i "log"

Kan også se at jeg glemte kolonnen der er til sidst i "log"
[l_runde] den var jo også meget vigtig da det er den der styre hvilken runde brugeren er i. :)

Så når alt kommer til alt troede jeg samme stump kode, kunne rettes til og på den måde virker i begge. Det er desværre ikke muligt hvis den ene tabel har flere kolonner.
Det troede jeg ikke havde nogen betydning da brugerne selv kan tilmelde sig og kun udfylde de 4 felter (runde kommer jo automatisk med min runde session).

Er glad for du spørg igen :)
20. januar 2011 - 17:25 #5
Ikke testet, men den foelgende mysql query skulle virke:

INSERT INTO log(l_bruger, l_land, l_by, l_alder, l_runde)(SELECT l_bruger, l_land,  l_by, l_alder, '$runde' from log WHERE l_runde = '$runde' - 1 AND l_bruger NOT IN(SELECT l_bruger FROM log WHERE v_runde = '$runde'))

Jeg ser foroevrigt at den query jeg gav i #1 ikke var den endelige loesning men et mellemtrin hvor jeg brugte specifikke rundenumre.  Hvor der staar "WHERE v_runde = 2" skulle det have vaeret "WHERE v_runde = '$runde' - 1", og der hvor der staar "WHERE v_runde = 3" skulle det have vaeret "WHERE v_runde = '$runde'".  Men det har du sikkert selv fundet ud af.

Og saa kan jeg ikke dy mig for endnu en gang at gaa udenfor spoergsmaalet:  Jeg ville da mene at du har brug for en tabel kaldet, for eksempel, bruger med kolonnerne id, brugernavn, land, by, alder, ... [og alt andet der karakteriserer en bruger og ikke aendrer sig fra runde til runde].  Saa er en bruger med alle brugerens egenskaber unikt identificeret ved et id-nummer, og saa behoever du, ja skal du, i valg, log, og alle andre tabeller der har med brugere at goere kun at referere til brugeren med id nummeret.  Hvis bruger 'klodshans' er fra Danmark, Odense, saa kommer der i log tabellen til at staa klodshans Danmark Odense en hel masse gange.  Hvis det nu om et halvt aars tid viser sig at klodshans havde skrevet forkert fordi han ikke havde forstaaet en formular og i virkeligheden er fra Odessa (og Ukraine), hvordan vil du saa rette det?  Ved at gaa tilbage og rette 25 linier i log tabellen (og maaske lave trykfejl undervejs) eller ved at lade det staa men for fremtiden bruge Odessa for klodshans?  I saafald har din database flere konfliktende versioner af klodshans.  Det kan skabe problemer hvis du engang i fremtiden vil udvide dit system.  Hvis du nu kun havde et sted, tabellen bruger, hvor der staar hvilket land og by en bruger er fra saa retter du eventuelle fejl der.  Fordi alle andre tabeller kun bruger klodshans' id saa vil de, efter en rettelse, automatisk refere til klodshans fra Odessa.
Avatar billede Slettet bruger
21. januar 2011 - 01:29 #6
Super fedt helt perfekt.
Og ja, jeg havde opdaget den lille fejl med runde nummeret.

Hvad ang dit råd, hvilket jeg altid er modtagelig for.
Så kan jeg godt se det smarte i at bruge id'et. Det ændre jeg lige på et tidspunkt.
Selvom det er minimalt, vil det så ikke også gøre siderne hurtigere når den kun skal finde et id frem for et brugernavn?

Igen, mange mange mange tak.
skønt med så god hjælp.
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