Avatar billede KHHP Juniormester
05. juli 2012 - 11:18 Der er 22 kommentarer og
1 løsning

Afkrydsningsfelter i formular

Hej
Jeg er igang med at lave en side hvor der skal være afkyrdsningsfelter til valg af boligtype, lidt ligesom boliga.dk
Følgende er kopieret direkte fra kildekoden på deres side:
<ul>
<li><label><input type="checkbox" name="type" id="type1" value="Villa" checked="checked" />Villa</label></li>
<li><label><input type="checkbox" name="type" id="type3" value="Ejerlejlighed" />Ejerlejlighed</label></li>
<li><label><input type="checkbox" name="type" id="type9" value="Villalejlighed" />Villalejlighed</label></li>
<li><label><input type="checkbox" name="type" id="type2" value="Rækkehus" />Rækkehus</label></li>
<li><label><input type="checkbox" name="type" id="type4" value="Fritidshus" />Fritidshus</label></li>
<li><label><input type="checkbox" name="type" id="type5" value="Andelsbolig" />Andelsbolig</label></li>
<li><label><input type="checkbox" name="type" id="type6" value="Landejendom" />Landejendom</label></li>
<li><label><input type="checkbox" name="type" id="type7" value="Helårsgrund" />Helårsgrund</label></li>
<li><label><input type="checkbox" name="type" id="type8" value="Fritidsgrund" />Fritidsgrund</label></li>
<li><label><input type="checkbox" id="rentaltype" value="Lejebolig" />Lejebolig</label></li>
</ul>
<input type="hidden" name="type" id="type0" value="" />   

Sådan har jeg også tænkt mig at bygge det op hos mig selv, men her skal det ikke bruges til at hente, men derimod til at gemme data.
Så nu er mit spørgsmål hvordan jeg får den til at gemme disse data, som 1 felt i databasen?
Jeg har et felt der hedder type, som skal indeholde værdierne af afkrydsningsfelterne. Hvis der er flere værdier adskilles disse med et komma:
værdi 1, værdi 2, værdi 3, værdi 4

Jeg har en idé om at jeg skal bruge noget while, for each samt et if-statement.
Er der nogen der kan hjælpe mig med at gøre dette på den bedste måde?
Det skal lige siges at jeg desværre arbejder med det gamle MySQL, men er i fuld gang med at lære MySQLi, dog ved jeg endnu ikke nok til at kunne implementere den konkrete side.
Avatar billede majbom Novice
05. juli 2012 - 12:28 #1
hvis du instisterer på at gemme flere værdier i ét felt i din tabel (hvilket jeg vil fraråde dig), kunne du jo bruge serialize/unserialize eller implode/explode
Avatar billede KHHP Juniormester
05. juli 2012 - 12:48 #2
Jo, det er det jeg helst vil, fordi det evt. skal bruges i en søgefunktion senere og så ville det være af fordel at bruge disse værdier som "tags".
Men hvordan skal jeg så lave det med serialize/unserialize eller implode/explode?
Avatar billede olebole Juniormester
05. juli 2012 - 13:51 #3
<ole>

Nej, det er med statsgaranti ikke det, du vil. Netop til en søgefunktion er det den dårligts tænkelige løsning at lægge flere uafhængige stykker data ind i ét falt  =)

Ordene bør lægges hver for sig i en tabel med to kolonner. I det andet felt indsættes ID'et til det, ordet skal knyttes sammen med.

Ellers bliver din søgefunktion temmelig ineffektiv

/mvh
</bole>
Avatar billede majbom Novice
05. juli 2012 - 14:05 #4
præcis søgning på sådan nogle felter er lige til at lukke op og s.... i.

Hvordan havde du tænkt dig at skrive din søgestreng hvor du søger på et eller flere tags?

www.php.net er en genial side at læse om php's funktioner, der er også de, i #1, nævnte funktioner representeret.

men ja, som ole skriver ville jeg også vælge en tabel til tags, med en én til mange relation til din primære tabel
Avatar billede KHHP Juniormester
05. juli 2012 - 14:21 #5
Jeg har tidligere lavet en søgefunktion og den lavede jeg således:
if (isset($_POST['search'])) {
$query = mysql_query("SELECT * FROM content WHERE titel LIKE '%$search%' OR beskrivelse LIKE '%$search%'");
}

På den måde skal det jeg skriver kun være en del af det eller de felter jeg vil søge i. Derfor ville jeg have det i et felt.
Avatar billede olebole Juniormester
05. juli 2012 - 14:26 #6
@splazz: Egentlig var det ikke mig, der skrev det. Det var dig selv, men du skrev bare ikke alt det, du faktisk mente. Vi tænkte vist begge: 'relationerede tabeller kontra wildcard-helveder', da vi læste spørgsmålet. Derfor tillod jeg mig bare at tale ud på dine vegne  *o)
Avatar billede olebole Juniormester
05. juli 2012 - 14:33 #7
#5: Det er lidt ligesom med LSD, blokfløjte og bungy jump. Det glæder mig, du har prøvet det. Så har fået en oplevelse for livet, og du kan i fremtiden tale med om emnet, når det kommer op over en kop Gevalia. På den anden side er det ikke noget for en frisk, ung mand at skulle se frem til at dyrke hele livet. Nogle ting er bedst prøvet én gang  *D

Det er en elendigt performende søgekode - som kun bør bruges i aller aller yderste nødstilfælde.

MySQL er en såkaldt relationel database. Det har kostet udviklerholdet blod, sved og tårer at forkæle os ved at gøre den til det. Lad os bruge det  *o)
Avatar billede olebole Juniormester
05. juli 2012 - 14:37 #8
- og om performance i den viste funktion kan man oven i købet sige: At bruge LIKE og wildcards (%) sløver kaldet dramatisk. Når du samtidig bruger OR mellem to af den slags søgninger, bliver resultatet:
    Elendig performance multipliceret med elendig performance.

Det er ikke så godt  =)
Avatar billede KHHP Juniormester
05. juli 2012 - 15:39 #9
Jo, men hvis jeg skal relatere to tabeller til hinanden, så skal jeg vel bruge INNER JOIN
Jeg har forsøgt mig med et før, men det blev jeg blot mere forvirret af, og det er nok derfor allerede i den søgefunktion, jeg har vist kode fra, endte med at bruge LIKE i stedet.
Når vi taller INNER JOIN har jeg forstået hvordan det i teorien skal fungere, men når jeg så ser hvordan koden laves, så laver jeg en meget skarp U-vending op hopper tilbage til det "gamle".
Avatar billede olebole Juniormester
05. juli 2012 - 15:58 #10
Godt, så er vi alle enige. Du skal lære at gøre det rigtigt  *o)

I første omgang kan du prøve at lave en implicit JOIN kommando. Noget i stil med:

'SELECT tabel_1.feltA, tabel_2.feltB FROM table_1, table_2 WHERE table_2.feltC = ?'

Prøv det først. Så kan du efterfølgende lære at lave en mere effektiv INNER JOIN med en foreign key
Avatar billede olebole Juniormester
05. juli 2012 - 16:01 #11
Der står i menneskeord:

Vælg feltet feltA i tabel_1 og feltet feltB i tabel_2
- fra tabllerne tabel_1 og tabel_2
- hvor feltC i tabel_2 er lig med [PARAMETER]

Simple as that  =)
Avatar billede KHHP Juniormester
05. juli 2012 - 18:25 #12
ok. Så jeg skal altså inden jeg prøver koden, have lavet en tabel jeg kalder for f.eks. "tags" og her gemmer jeg alle de tags jeg benytter på siden.
Dem kan jeg med ovenstående kommando relatere til den tabel hvor mine informationer er gemt.
Men du søger jo efter et tredje felt og sådan som jeg har forstået det, så skal jeg jo bare have id og navn i "tags".
Men hvordan kan den relatere til mine tags, hvis jeg ikke gemmer dem alle i et felt?
Avatar billede olebole Juniormester
05. juli 2012 - 21:15 #13
Jeg tager ikke udgangspunkt i dit eksempel. Meningen er at få dig til selv at tænke ved at give dig et eksempel på syntaksen.

Lav et par helt simple tabeller og leg lidt med udtræk fra dem. Så lærer du at bruge MySQL til den slags opgaver, du sidder med.
Avatar billede KHHP Juniormester
06. juli 2012 - 12:37 #14
Så fandt jeg ud af hvordan det skulle gøres.
Kiggede lidt rundt i nogle gamle opgaver far Microsoft Access og så forstod jeg det.
Men hvordan skal jeg så få gemt de "tags" der hører til den enkelte post i tabellen? Det er jo fint nok at jeg kan relatere dem til hinanden, men den skal jo også have noget relatere til, så hvis jeg siger at jeg vil lave en søgning på kryptering og have vist de poster der indeholder Sikkerhed og/eller Programmering som "tags". Så relaterer jeg de to tabeller til hinanden og så har jeg et resultat.
Men hvordan når jeg opretter min poster i tabellen med det indhold jeg skal søge i?
Jeg har jo bygget en masse checkboxes, som i det eksempel jeg viste fra boliga.dk og jeg skal jo på en eller anden måde have gemt de "tags" der hører til de enkelte poster, således at jeg senere kan relatere til mine "tags" i en søgning.
Avatar billede majbom Novice
06. juli 2012 - 13:29 #15
Start med at gem posten i databasen, så du har et id på dén. bagefter gemmer du de afkrydsede tags sammen med dette id
Avatar billede KHHP Juniormester
06. juli 2012 - 13:40 #16
Ok, så jeg skal altså først lave en mysql_query der gemmer alt bortset fra mine "tags" i tabellen. Dernæst skal jeg hente id fra det jeg har gemt og bruge det som felt til at relatere til de tags der er benyttet eller hvordan?
Avatar billede majbom Novice
06. juli 2012 - 13:47 #17
jeps

du får det til at lyde som noget stort at hente sidst indsatte id ud, men det er altså relativ simpelt: mysql_insert_id()
Avatar billede olebole Juniormester
06. juli 2012 - 15:41 #18
Du kan også med stor fordel have tre tabeller - en til posterne, en til tags og en til at knytte tags og poster sammen. Det kommer an på din definition af 'tags', og hvordan du bruger dem
Avatar billede KHHP Juniormester
15. juli 2012 - 21:18 #19
Jeg havde forestillet mig noget i stil med dette:
tabelnavn: tags
id          tag
1          diverse
2          generelt
3          software

tabelnavn: indhold
id          titel          tekst                                            tags
1          side 1      <p>teksten til side 1</p>         

Hvis det altså skulle gøres med to tabeller.
Skulle der en tredje på, så skulle den vel se således ud:
tabelnavn: sammen
id        side                    tags
1        (id til side 1)        (tags til side 1)

Er den tredje lavet korrekt, eller er det helt ved siden af?
Avatar billede olebole Juniormester
15. juli 2012 - 21:26 #20
Du skal ikke have et tags-felt i 'indhold'.

Tabellen 'sammen' behøver ikke noget ID. Blot et felt til side-ID og et felt til tag-ID. Til hver side kan der så være f.eks. 10 posteringer i 'sammen' - én for hvert tag
Avatar billede KHHP Juniormester
16. juli 2012 - 12:19 #21
ok, så hvis side 1 har tilknyttet 3 tags, så vil den forekomme en gang for hvert tilknyttet tag.
Ok.
Og SQL-koden skal så se således ud:
'SELECT tabel_1.tag, tabel_2.titel FROM table_1, table_2 WHERE table_3.side = $variabel'

Hvis vi skal bruge den første kode vi tog udgangspunkt i.
Med INNER JOIN skal det altså se således ud:
SELECT * FROM sammen
INNER JOIN tags
ON sammen.tag = tags.id
INNER JOIN indhold
ON sammen.side = indhold.id


Er det korrekt?
Avatar billede KHHP Juniormester
19. august 2012 - 18:07 #22
Var det jeg har opstillet i #21 korrekt eller hvordan?
Avatar billede KHHP Juniormester
28. oktober 2012 - 16:23 #23
Lukker og slukker
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