Gå til innhold

[Løst] Arrangering av resultatdata fra mysql_query i tabell


Anbefalte innlegg

Hei,

 

Har noen tables i en database som jeg henter ut data fra, so far so good.

Problemet ligger i at resultatet kommer ut på en annen måte enn ønskelig, og jeg skal prøve å forklare det nærmere:

1. Tabellens navn er kalender_(firmaid)_(brukerid).

2. Tabellen inneholder 21 felt, hvorav 17 felt indikerer tid og dato. Resterende felt indikerer hvilke kundedata som skal hentes ut fra en annen tabell.

3. Utdata hentes ved hjelp av denne koden:

for($i=1;$i <= $uida[0];$i++) {

$que = mysql_query("SELECT * FROM kalender_".$fid."_".$i." WHERE dag='".$dag."' AND mnd='".$mnd."' AND aar='".$aar."'")
or die("Valg av kalender feilet. " . mysql_error());

$ques = mysql_query("SELECT kontakt FROM firma_".$fid." WHERE brukerid='".$i."'")
or die("Kunne ikke finne elektriker navn. " . mysql_error());
$elek = mysql_fetch_row($ques);

while($asd = mysql_fetch_assoc($que)) {
echo "<tr><td>$elek[0]</td><td class=\"$asd[8]\">8</td><td class=\"$asd[9]\">9</td><td class=\"$asd[10]\">10</td><td class=\"$asd[11]\">11</td><td 

class=\"$asd[12]\">12</td><td class=\"$asd[13]\">13</td><td class=\"$asd[14]\">14</td><td class=\"$asd[15]\">15</td><td class=\"$asd[16]\">16</td><td 

class=\"$asd[17]\">17</td><td class=\"$asd[18]\">18</td><td class=\"$asd[19]\">19</td><td class=\"$asd[20]\">20</td><td 

class=\"$asd[21]\">21<td>$asd[dag]-$asd[mnd]-$asd[aar]</td>
";

}
}

4. Data som ligger i database tabellen blir hentet ut (samme brukerid kan ha flere avtaler med forskjellige kunder samme dag), men her kommer også problemet.

Slik resultatet vises etter ovenstående kode:

første kunde avtale

andre kunde avtale

tredje kunde avtale

osv osv.

 

Jeg ønsker at det istedet skal bli:

Første kunde avtale Andre kunde avtale Tredje kunde avtale osv osv

(Altså at alle resultater for kalender_1_1 med samme dato skal komme i samme <tr></tr>, i stedet for flere <tr></tr>).

 

Er dette i det hele tatt mulig å få til?

Dersom noe er uklart, er det bare å spørre så skal jeg forsøke å forklare på en bedre/annen måte.

 

Jeg er klar over at det er "gammeldags" å bruke tables, samt å ikke bruke mysqli og ser derfor ingen grunn til at noen fokuserer på det.

 

Diverse info:

$elek variabelen settes etter en annen mysql spørring.

$i finner først oversikt over hvor mange brukere (firmaid) har i en annen tabell før man så lenge $i er mindre eller lik antallet brukere for (firmaid) inkrementeres med $i++.

Firmaid hentes fra en sesjonsvariabel som settes ved pålogging til systemet.

Årsaken til at $asd[nn] skrives ut i class er for å få fargekodet tabellen uten ekstremt mange if...else... variabler.

 

Når alt er ferdig programmert er det ment å skulle være et time-bookingssystem, med mulighet for daglig leder eller personal ansvarlig å gå inn og se hvor og hva de ansatte gjør - ut ifra hva vi har solgt inn av tjenester på deres vegne.

Endret av martinbn
Lenke til kommentar
Videoannonse
Annonse

Det første du bør gjøre er å slå sammen år, måned og dag til ETT datofelt. Det er ingen poeng i å splitte disse i tre felter. Snarere blir det en ulempe, og spørringene blir unødvendig hårete.

 

For det andre bør du få alle ansatte i samme tabell. Det er ingen poeng i å ha en tabell pr ansatt. Når en slutter har du en tabell du ikke bruker, begynner en ny må du lage en ny tabell med lik struktur. Lite poeng i. Lag ei ny kolonne som identifiserer den ansatte.

 

For det tredje kan du se på å lage en ny tabell med oversikt over de ansatte, som så inneholder hvilket firma de jobber i. For å finne alle avtalene til firma A så må du først finne alle ansatte til firma A, og deretter avtalene til hver enkelt ansatt. Enten i en spørring eller i flere. Dette er en mer korrekt og fleksibel måte å gjøre det på. Unntaket er om du skiller på det pga sikkerhetshensyn. Om så er tilfelle bør du heller splitte det ut i egne databaser, ikke bare tabeller.

 

Så til spørsmålet. For å få de på rekke i stede for ny rad pr avtale så må du bare passe på hvor du legger inn <tr> og </tr> i koden. Sørg for å legge disse før en ny ansatt vises, og etter. Ikke for hver gang en ny avtale hentes ut.

Lenke til kommentar

Det første du bør gjøre er å slå sammen år, måned og dag til ETT datofelt. Det er ingen poeng i å splitte disse i tre felter. Snarere blir det en ulempe, og spørringene blir unødvendig hårete.

Ser poenget ditt her. Dette er lagt opp slik foreløpig med tanke på å raskt kunne hente ut statistikk basert på måned og år.

 

For det andre bør du få alle ansatte i samme tabell. Det er ingen poeng i å ha en tabell pr ansatt. Når en slutter har du en tabell du ikke bruker, begynner en ny må du lage en ny tabell med lik struktur. Lite poeng i. Lag ei ny kolonne som identifiserer den ansatte.

Alle brukerne ligger i en egen tabell, hvor de identifiseres med firmaid og brukerid i firmatabellen. Dersom avtaler er laget langt fram i tid for den enkelte ansatte, må man kunne gå inn og flytte avtalen over til en annen ansatt med ledig kapasitet.

 

For det tredje kan du se på å lage en ny tabell med oversikt over de ansatte, som så inneholder hvilket firma de jobber i. For å finne alle avtalene til firma A så må du først finne alle ansatte til firma A, og deretter avtalene til hver enkelt ansatt. Enten i en spørring eller i flere. Dette er en mer korrekt og fleksibel måte å gjøre det på. Unntaket er om du skiller på det pga sikkerhetshensyn. Om så er tilfelle bør du heller splitte det ut i egne databaser, ikke bare tabeller.

Grunnen til at jeg har skilt ut kalenderen til den enkelte i en egen tabell er for å minimere risikoen for at Ansatt 1 skal få opp avtalene til Ansatt 2 (samme firma). Jeg er ikke noen ekspert i database design, så det kan være et tungvint oppsett jeg har valgt.

 

Så til spørsmålet. For å få de på rekke i stede for ny rad pr avtale så må du bare passe på hvor du legger inn <tr> og </tr> i koden. Sørg for å legge disse før en ny ansatt vises, og etter. Ikke for hver gang en ny avtale hentes ut.

Så at det var en liten feil i ovenstående kode, som jeg har rettet opp i nå. Imidlertid havner alt nå på en linje, men <td>'ene "stopper" ikke der de skal, og fortsetter bare videre. Istedet for å stoppe etter 16 "felt", fortsetter den med likt antall treff den får på avtaler på den enkelte datoen (slik at det blir 80 <td></td> dersom det er 5 avtaler på samme dato).

 

Ny kode er som under:

for($i=1;$i <= $uida[0];$i++) {
echo "<tr>";
$que = mysql_query("SELECT tilknyttet_kunde,tilknyttet_ringeliste,8,9,10,11,12,13,14,15,16,17,18,19,20,21 FROM kalender_".$fid."_".$i." WHERE dag='".$dag."' 

AND mnd='".$mnd."' AND aar='".$aar."'")
or die("Valg av kalender feilet. " . mysql_error());

$ques = mysql_query("SELECT kontakt FROM firma_".$fid." WHERE brukerid='".$i."'")
or die("Kunne ikke finne elektriker navn. " . mysql_error());
$elek = mysql_fetch_row($ques);

while($asd = mysql_fetch_array($que)) {
echo "
<td>$elek[0]</td>
<td class=\"$asd[2]\">8</td>
<td class=\"$asd[3]\">9</td>
<td class=\"$asd[4]\">10</td>
<td class=\"$asd[5]\">11</td>
<td class=\"$asd[6]\">12</td>
<td class=\"$asd[7]\">13</td>
<td class=\"$asd[8]\">14</td>
<td class=\"$asd[9]\">15</td>
<td class=\"$asd[10]\">16</td>
<td class=\"$asd[11]\">17</td>
<td class=\"$asd[12]\">18</td>
<td class=\"$asd[13]\">19</td>
<td class=\"$asd[14]\">20</td>
<td class=\"$asd[15]\">21</td>
<td>$asd[16]-$asd[17]-$asd[18]</td>
";

}
}
echo "</tr>";
}

 

Dersom du har noen forslag til hvor <tr> og </tr> skal plasseres, tar jeg gjerne i mot det. Plasserer jeg de inne i while() funksjonen, stopper de etter rett antall, men det kommer en row for hvert treff på dato og avtale.

Lenke til kommentar
Ser poenget ditt her. Dette er lagt opp slik foreløpig med tanke på å raskt kunne hente ut statistikk basert på måned og år.

Designer du databasen for å være lett leselig for mennesker(kontormedarbeidere) eller for datamaskiner? Om det førstnevnte er tilfelle så forstår eg valget, men er det det siste(som det skal være) så er det raskere å bruke et datofelt. Slik det er ment. Men med små datamengder vil det sannsynligvis være lite merkbart, men praksisen bør læres uansett :)

 

Alle brukerne ligger i en egen tabell, hvor de identifiseres med firmaid og brukerid i firmatabellen. Dersom avtaler er laget langt fram i tid for den enkelte ansatte, må man kunne gå inn og flytte avtalen over til en annen ansatt med ledig kapasitet.

Ved å bruke forslaget mitt er "flyttingen" bare en update av cellen som inneholder ansatt id.

 

Grunnen til at jeg har skilt ut kalenderen til den enkelte i en egen tabell er for å minimere risikoen for at Ansatt 1 skal få opp avtalene til Ansatt 2 (samme firma). Jeg er ikke noen ekspert i database design, så det kan være et tungvint oppsett jeg har valgt.

Bruk eget felt. Spørringen er så nøyaktig at om du ber om å få ut avtalene til en ansatt, så får du det. Ikke av og til rett, og av og til feil. I så tilfelle er spørringen feil :)

 

Legg inn echo "<tr>" FØR while som henter ut avtalene, og echo "</tr>" ETTER. Det skal løse problemet :)

Lenke til kommentar
Ser poenget ditt her. Dette er lagt opp slik foreløpig med tanke på å raskt kunne hente ut statistikk basert på måned og år.

Designer du databasen for å være lett leselig for mennesker(kontormedarbeidere) eller for datamaskiner? Om det førstnevnte er tilfelle så forstår eg valget, men er det det siste(som det skal være) så er det raskere å bruke et datofelt. Slik det er ment. Men med små datamengder vil det sannsynligvis være lite merkbart, men praksisen bør læres uansett :)

Ja, det er for at det skal være lett leselig for kontormedarbeidere.

 

Alle brukerne ligger i en egen tabell, hvor de identifiseres med firmaid og brukerid i firmatabellen. Dersom avtaler er laget langt fram i tid for den enkelte ansatte, må man kunne gå inn og flytte avtalen over til en annen ansatt med ledig kapasitet.

Ved å bruke forslaget mitt er "flyttingen" bare en update av cellen som inneholder ansatt id.

La oss si at jeg endrer det slik at kalender tabellen har feltene:

id | ansatt_id | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21

 

Grunnen til at jeg har skilt ut kalenderen til den enkelte i en egen tabell er for å minimere risikoen for at Ansatt 1 skal få opp avtalene til Ansatt 2 (samme firma). Jeg er ikke noen ekspert i database design, så det kan være et tungvint oppsett jeg har valgt.

Bruk eget felt. Spørringen er så nøyaktig at om du ber om å få ut avtalene til en ansatt, så får du det. Ikke av og til rett, og av og til feil. I så tilfelle er spørringen feil :)

Enklere kan det vel ikke sies ;)

 

Legg inn echo "<tr>" FØR while som henter ut avtalene, og echo "</tr>" ETTER. Det skal løse problemet :)

La oss si at innholdet i tabellen som resultatet hentes fra er slik:

id | ansatt_id | kundeid | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21

1 | 1 | 1 | x | v | no | no | no | no | no | no | no | no | no | no | no | no

2 | 1 | 2 | no | no | no | x | x | no | no | no | no | no | no | no | no | no

3 | 1 | 3 | no | no | no | no | no | no | no | no | v | no | no | no | no | no

4 | 1 | 4 | no | no | no | no | no | no | no | no | no | no | no | no | no | no

5 | 1 | 5 | no | no | no | no | no | x | x | x | no | no | no | no | no | no

6 | 2 | 6 | no | no | no | no | no | no | no | no | no | no | x | x | x | x

 

Jeg prøvde å plassere echo "<tr>" mellom $elek = mysql_fetch_row($ques); og while($asd = mysql_fetch_array($que)) {, samt etter den første }. Dette hjalp ikke på visningsproblematikken, som er det jeg skulle fikse først, så kan man ytelse optimere dette i etterkant.

 

Visningen ønskes slik:

NAVN     |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21
Ansatt 1 |  x |  v | no |  x |  x |  x |  x |  x |  v | no | no | no | no | no
Ansatt 2 | no | no | no | no | no | no | no | no | no | no |  x |  x |  x |  x

men blir slik:

NAVN     |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21
Ansatt 1 |  x |  v | no | no | no | no | no | no | no | no | no | no | no | no
Ansatt 1 | no | no | no |  x |  x | no | no | no | no | no | no | no | no | no
Ansatt 1 | no | no | no | no | no | no | no | no |  v | no | no | no | no | no
Ansatt 1 | no | no | no | no | no | no | no | no | no | no | no | no | no | no
Ansatt 1 | no | no | no | no | no |  x |  x |  x | no | no | no | no | no | no
Ansatt 2 | no | no | no | no | no | no | no | no | no | no |  x |  x |  x |  x

når jeg har <tr> og </tr> inne i while loopen.

 

Utenfor while loopen:

NAVN     |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21
Ansatt 1 |  x |  v | no | no | no | no | no | no | no | no | no | no | no | noAnsatt 1 | no | no | no |  x |  x | no | no | no | no | no | no | no | no | noAnsatt 1 | no | no | no | no | no | no | no | no |  v | no | no | no | no | noAnsatt 1 | no | no | no | no | no | no | no | no | no | no | no | no | no | noAnsatt 1 | no | no | no | no | no |  x |  x |  x | no | no | no | no | no | no
Ansatt 2 | no | no | no | no | no | no | no | no | no | no |  x |  x |  x |  x

 

 

Håper dette gjorde det litt enklere dersom det var noen forvirring om hva jeg ønsker å oppnå.

Lenke til kommentar

Oioioi. Den var værre. Problemet du har nå kommer direkte av "feil måte" å lagre data på. Dette løses best med at du redesigner strukturen.

 

Tabellen kalender bør se slik ut:

| ID | Ansatt | Kunde | Start | Slutt |

 

En oppføring i den tabellen bør da se slik ut:

| 51 | 4 | 9 | 2011-11-08 12:00:00 | 2011-11-08 13:00:00 |

 

 

Koden din for visning må da totalt redesignes.

 

Det første du må gjøre er å kjøre en spørring som heter ut alle ansatte i det firmaet det gjelder.

Deretter, for hver enkelt ansatt så kjører du 8 nye spørringer. En spørring pr time på dagen. Dette gjør i med ei for-løkke:

for ($t=8; $t<16; $t++) { // kode skal her // }

 

Spørring: SELECT * FROM kalender WHERE (Ansatt=Ansatt) AND (DATEDIFF(Start,Now())=0) AND (Hour(Start)=$i)

 

Dersom antall rader er null, er den ansatte ledig. Er den mer enn null, helst en, så er den ansatte opptatt.

Lenke til kommentar

Oioioi. Den var værre. Problemet du har nå kommer direkte av "feil måte" å lagre data på. Dette løses best med at du redesigner strukturen.

 

Spørring: SELECT * FROM kalender WHERE (Ansatt=Ansatt) AND (DATEDIFF(Start,Now())=0) AND (Hour(Start)=$i)

 

Vel, Da har jeg gjort om litt på tabellen, og fått utdata slik jeg vil ha de.

 

Løsningen var å redesigne tabellen, og bruke explode på data i feltene som anga tidspunkt.

Endret av martinbn
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...