Kenneth Dammyr Skrevet 13. desember 2006 Del Skrevet 13. desember 2006 Hei Nå har jeg sittet i timesvis med det samme scriptet uten å ha kommet så veldig mye lenger, så jeg kryper til korset og ber om hjelp. Av en eller annen grunn har jeg tatt på meg jobben med å lage et nettbasert reservasjonssystem for utstyr og rom på skolen vår. Ikke egentlig noe veldig avanserte greier og jeg har faktisk klart å lage det meste. Det kan sees her: Link. Brukernummer: 123456 Men for å ta på medalje og bli helt ferdig har jeg to utfordringer igjen: 1. Dette er kanskje det viktigste. Jeg vil gjøre det umulig å reservere noe i et tidsrom hvor det allerede er opptatt. Jeg har prøvd mye rart her, men uansett hva jeg begynner på blir det altfor komplisert for meg og jeg mister både oversikt og kontroll. Grunnideen min går slik: if (regtid == busytid) {DIE!!!!!} else {INSERT} Så går da utfordringen ut på å regne ut regtid og busytid. Det eneste jeg har klart er vel egentlig å lage et script som fyller minnet mitt... Gøy 2. Punkt nummer to er ikke fullt så viktig, men hadde vært svært fancy. Det er ytret ønske om å ha en grafisk oversikt på førstesiden som viser hvilket utstyr som er lånt ut og når. Gantt-modellen har vært nevnt som visningsmåte. Jeg prøvde meg litt med å modifisere en kjempesimpel php-kalender. Lenger unna en løsning tror jeg sjelden noen har vært. Jeg er klar over at dette ikke er oppgaver som er løst på fem minutter, derfor hadde jeg blitt svært takknemlig hvis noen kunne legge sammen noen mirakler. Hvis dere trenger noe mer informasjon så si ifra! På forhånd takk! Lenke til kommentar
eigan Skrevet 14. desember 2006 Del Skrevet 14. desember 2006 if($reg-slutt > &dato-og-klokke-nå) { echo "Det er optatt"; } else { INSERT } Er det en ide? Lenke til kommentar
Kenneth Dammyr Skrevet 14. desember 2006 Forfatter Del Skrevet 14. desember 2006 Det er for enkelt til å fungere. Jeg sa kanskje ikke at jeg har mange oppføringer i databasen med utlånt utstyr. I det en ny reservasjon skal legges inn må det ønskede tidsrommet sjekkes opp mot all utlånstiden i databasen for det elementet. Hvis ikke det kolliderer med noe så kan reservasjonen legges til. Lenke til kommentar
pgdx Skrevet 14. desember 2006 Del Skrevet 14. desember 2006 Men for å ta på medalje og bli helt ferdig har jeg to utfordringer igjen:1. Dette er kanskje det viktigste. Jeg vil gjøre det umulig å reservere noe i et tidsrom hvor det allerede er opptatt. Jeg har prøvd mye rart her, men uansett hva jeg begynner på blir det altfor komplisert for meg og jeg mister både oversikt og kontroll. Grunnideen min går slik: if (regtid == busytid) {DIE!!!} else {INSERT} Så går da utfordringen ut på å regne ut regtid og busytid. Det eneste jeg har klart er vel egentlig å lage et script som fyller minnet mitt... Gøy Hvordan er reservasjonen lagret i databasen? Fra og til? Eller kun en beskrivelse med skriften "til klokken 3"? For hvis du lagrer fra og til-dato med vanlig datoformat / unixtime, så burde det være mulig å se om det var reservasjoner på gitte tidspunkt. i databasen: fra: 1166099767 til: 1166199767 Så bør du kunne sjekke om et tall er mindre enn $til eller høyere enn $fra, eller på en måte sjekke om den er der et sted. Da burde også 2 løse seg selv 2. Punkt nummer to er ikke fullt så viktig, men hadde vært svært fancy. Det er ytret ønske om å ha en grafisk oversikt på førstesiden som viser hvilket utstyr som er lånt ut og når. Gantt-modellen har vært nevnt som visningsmåte. Jeg prøvde meg litt med å modifisere en kjempesimpel php-kalender. Lenger unna en løsning tror jeg sjelden noen har vært.Lage en kalender (du finner sikkert mange GPL-lisensierte et sted), og der bør det også være mulig å bruke fra og til til noe slikt. Lenke til kommentar
blacktower Skrevet 14. desember 2006 Del Skrevet 14. desember 2006 (endret) Jeg antar at du har en tabell med ting og en tabell med reservasjoner som refererer til ting. Tidene er lagret som DATETIME eller noe lignende. Du kan da gjøre noe slikt: Advarsel: Dette er helt feil! SELECT id FROM reservations WHERE ( from_date BETWEEN $desired_from AND $desired_to OR to_date BETWEEN $desired_from AND $desired_to ) AND item_id = $id; Hvis du ikke får noen rader tilbake er ønsket tidsrom ledig og du kan opprette reservasjonen. Endret 14. januar 2007 av blacktower Lenke til kommentar
Kenneth Dammyr Skrevet 14. desember 2006 Forfatter Del Skrevet 14. desember 2006 I databasen er det tre aktuelle felter: item, fdato og tdato. Altså startdato(fdato) og sluttdato(tdato). Løsningen til Tor-Erik virket jo forsåvidt god, og enkel. Jeg skal gi det et forsøk. Lenke til kommentar
Kenneth Dammyr Skrevet 14. desember 2006 Forfatter Del Skrevet 14. desember 2006 Ikke akkurat voldsomme resultater enda. Får feilmelding om at jeg har en feil på linje to i koden. Der er det bare en kommentar... $result = mysql_query("SELECT id FROM rent WHERE (fdato BETWEEN $fdato AND $tdato OR tdato BETWEEN $fdato AND $tdato) AND item = $item;") or die(mysql_error()); if (mysql_num_rows($result) == 0) { $sql = "INSERT INTO rent SET user='$user2', item='$item', fdato='$fdato', tdato='$tdato', ftid='$ftid', ttid='$ttid'"; $query = mysql_query($sql) or die("Cannot query the database.<br>" . mysql_error()); } else { echo "Opptatt!"; } Lenke til kommentar
blacktower Skrevet 14. desember 2006 Del Skrevet 14. desember 2006 For å finne feilen i koden kan du for eksempel skille ut funksjonen som sjekker om noe er opptatt i en egen funksjon (..) og teste at den virker. Men, den spørringen der vil gi feil resultat, du må skrive det slik.. WHERE ((fdato BETWEEN $fdato AND $tdato) OR (tdato BETWEEN $fdato AND $tdato)) AND item = $item a || b && c er ikke det samme som (a || b) && c med presedensreglene i SQL (eller vanlig logikk). Lenke til kommentar
Kenneth Dammyr Skrevet 13. januar 2007 Forfatter Del Skrevet 13. januar 2007 $result = mysql_query("SELECT id FROM rent WHERE ((fdato BETWEEN $fdato AND $tdato) OR (tdato BETWEEN $fdato AND $tdato)) AND item = $item") or die(mysql_error()); if (mysql_num_rows($result) == 0) { $sql = "INSERT INTO rent SET user='$user2', item='$item', fdato='$fdato', tdato='$tdato', ftid='$ftid', ttid='$ttid'"; $query = mysql_query($sql) or die("Cannot query the database.<br>" . mysql_error()); } else { echo "Opptatt!"; } Resultat: Unknown column 'A218' in 'where clause' Prøv gjerne selv: Link! Brukernummer: 123456 Trenger tydeligvis mer hjelp Lenke til kommentar
blacktower Skrevet 13. januar 2007 Del Skrevet 13. januar 2007 SQL uses single quotes around text values (most database systems will also accept double quotes). Du må altså skrive det slik: ...AND item = '$item'") ... Lenke til kommentar
Kenneth Dammyr Skrevet 13. januar 2007 Forfatter Del Skrevet 13. januar 2007 Nå ble det framgang ja. Riktignok etter litt fram og tilbake, men det oppstod et nytt problem. Scenario: Et rom er reservert fra 15/1-2007 til 19/1-2007. Hvis jeg prøver å bestille det samme rommet nøyaktig fra 15/1 til 19/1 en gang til vil det ikke gå (bra), men om jeg bestiller fra 16/1 til 17/1 vil det gå. Noe som er feil for da blir det jo en dobbelbooking. Takk for hjelpen så langt forresten! Lenke til kommentar
blacktower Skrevet 14. januar 2007 Del Skrevet 14. januar 2007 My bad. Spørringen min tar ikke høyde for alle tilfellene. Prøv heller denne: SELECT id FROM rent WHERE (NOT ((tdato < $fdato) OR (fdato > $tdato))) AND item = '$item' Lenke til kommentar
Kenneth Dammyr Skrevet 14. januar 2007 Forfatter Del Skrevet 14. januar 2007 (endret) Da er det bare for meg å bøye meg i støvet. Endelig gikk det! Forresten så trenger alle disse variablene eller hva det heter enkle quotes rundt seg: SELECT id FROM rent WHERE (NOT ((tdato < '$fdato') OR (fdato > '$tdato'))) AND item = '$item' Slik EDIT:Men så var det dette med klokkeslett også da... ftid, ttid... En liten copy paste av dato-koden ser ikke ut til å fungere. Noe sier meg at jeg må få klokkeslett-verdiene inn i datoen. Endret 14. januar 2007 av kennethdammyr Lenke til kommentar
blacktower Skrevet 14. januar 2007 Del Skrevet 14. januar 2007 Lagre tid og dato i samme felt, så slipper du dette problemet (og mange andre). Du kan bruke DATETIME eller TIMESTAMP som type. Et timestamp inneholder antall sekunder siden 1970. Det er lettere å håndtere tallet 2342413123123 enn "Søndag klokken Kvart på Tre". Når tiden skal vises til brukeren konverterer du det til et menneskelig format. Lagrer du tid (og dato) som en timestamp vil spørringen over fungere av seg selv. Lenke til kommentar
Kenneth Dammyr Skrevet 14. januar 2007 Forfatter Del Skrevet 14. januar 2007 (endret) Jeg kan nesten ikke unngå å spørre hvordan jeg gjør det? Endret 14. januar 2007 av kennethdammyr Lenke til kommentar
Kenneth Dammyr Skrevet 14. januar 2007 Forfatter Del Skrevet 14. januar 2007 Det sa meg ikke så veldig mye da utfordringen var å få det inn i databasen etc, men jeg har løst det på egen hånd. Byttet ut timestamp med datetime og formet oppføringen selv: $fdatetime = $faar."-".$fmnd."-".$fdag." ".$ftime.":".$fminutt.":00"; Så var det bare å putte dette inn i databasen på vanlig måte. Det gikk nemlig ikke med timestamp. Så nå fungerer det ordentlig! Skal kjøre litt tester og sånn, men har ikke merket noe feil enda i hvert fall. Tusen takk! Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå