Pangaea Skrevet 9. juni 2004 Del Skrevet 9. juni 2004 Holder på å lage et stort skjema som også har et slags del-skjema. Vil at folk skal kunne legge til bootlegs på hjemmesiden min. Først trengs vanlig bootleg info som dato, navn osv. Og i delskjemaet kommer hvilke sanger som er på bootleg'en, og hvor disse ble spilt. Bootleg er live konsert opptak hvis noen lurte... Jeg har da valgt å ha dropdown bokser med hvor mange "tracks" som er på hver CD (En bootleg kan inneholde flere CDer), og en OK boks. Har man skrevet inn info allerede vil jeg at den skal bli bevart, når siden relastes etter å ha tegnet opp del-skjemaet. Og det det samme blir gjort når man klikker på "Add Bootleg". Data blir sjekket og lagret i noen arrays. Siden dette er en del kode tenkte jeg det kunne være greit å bruke en funksjon i stedet for å skrive samme koden opp igjen to ganger. Men da får jeg ikke tilgang til variablene seinere i scriptet. Fant ut at jeg kunne sette alle variablene jeg trenger fra funksjonen som global, men er det egentlig en god idé? Finnes det bedre måter å gjøre det på? Lenke til kommentar
[kami] Skrevet 9. juni 2004 Del Skrevet 9. juni 2004 organsier variablene du vil bruke i senere i et array/objekt og returner dette i fra funksjonen. om en funksjon oppretter mye data som du trenger senere høres det ut som du kanskje bør vurdere å lage en klasse av dette.. menneh.. er jo litt vanskelig å se uten koden skal du først ha globale variabler foreslår jeg at du bruker arrayen $GLOBALS['..variabelnavn..']. Denne fungere om du er nødt til å dele opp scriptet ditt i flere filer (noe globals IKKE gjør) Lenke til kommentar
Nervetattoo Skrevet 9. juni 2004 Del Skrevet 9. juni 2004 Det aller enkleste er å bruke session variabler: $_SESSION['variabel'] Det er også en ganske bra løsning. Lenke til kommentar
Pangaea Skrevet 9. juni 2004 Forfatter Del Skrevet 9. juni 2004 Hadde håpt return hadde funket, men ser ikke sånn ut gitt. Bruk av session vil vel funke, men det blir fryktelig mye session vars da. Egentlig fristende å bare kopiere koden to ganger selv om det er litt dårlig koding, blir mindre stress av det vertfall. Lenke til kommentar
RipZ- Skrevet 9. juni 2004 Del Skrevet 9. juni 2004 Å bruke sessionvariabler i dette filfellet er feil. Du kan bruke hvilke som helst av de globale variablene ($_POST, $_GET, $_SESSION etc), men dette synes jeg er latskap og feil måte å tenke på. Riktig måte: $min_var = "hei hå"; function hei() { global $min_var; echo $min_var; } Skjønner prinsippet? Du gjør en variabel tilgjengelig i funksjonen din ved å skriv global $variabel;. Oi, ser ut til at du var klar over dette prinsippet. Jeg som leser litt dårlig. Utrolig hva solsteken kan gjøre eller hva? Det er iallfall den "riktige" måten å gjøre det på. Jeg synes det ikke er nødvendig å rote inn andre globale varaibler i denne sammenhengen. Lenke til kommentar
Pangaea Skrevet 9. juni 2004 Forfatter Del Skrevet 9. juni 2004 Okay, da tror jeg jeg går for å bruke global. De andre funket ikke, og sessions blir mye styr her synes jeg... Takker Lenke til kommentar
The Red Devil Skrevet 9. juni 2004 Del Skrevet 9. juni 2004 (endret) Du bør bruke minst muleg "globals". function test($variable1, $variable2, $variable3) { } er mye bedre i min meining enn function test() { globals $variable1, $variable2, $variable3; } eventuelt vist du vil at variablen skal oppdatere seg utenfor funksjonene og kan du legge til ein ekstra $ framføre variablen i.e. function test($$variable1, $variable2, $variable3) { } EDIT: Tipper du veit det, men for sikkerhetskyld. For å starte funksjonen bruker du: test($variablenavn1, $variablenavn2, $variablenavn3); osv (husk at variablenavnet inne i funksjonen ikkje trenge å være likt det du inkluderer.) Endret 9. juni 2004 av The Red Devil Lenke til kommentar
Pangaea Skrevet 9. juni 2004 Forfatter Del Skrevet 9. juni 2004 Noe spesiell grunn til at man ikke bør bruke globals? Har sikkert 20+ variabler, og mange av dem blir laget i funksjonen, så er enklest å bruke globals slik jeg ser det... Lenke til kommentar
Nervetattoo Skrevet 10. juni 2004 Del Skrevet 10. juni 2004 Blir litt usikker på akkurat hva du ønsker å oppnå. Men: Om du skal bruke globale variabler, bruk det allerede definerte $GLOBALS arrayet til det. $GLOBALS['form_data']['form_element_x'] = $data; Eller plaser det i et array, særlig med 20 variabler så kan du da bruke foreach for å gjøre hva enn du skal gjøre med de senere. Return fungerer helt fint. Eksempel: function test($var) { return $var; } $test = test("hei"); Vil tilsvare $test = "hei"; Lenke til kommentar
The Red Devil Skrevet 10. juni 2004 Del Skrevet 10. juni 2004 Som findus sa, du kan bruke return eller vist du det er lettere å ikkje bruke det kan du legge til ein ekstra & framføre variablen, i dømet under så skriver den ut 2 (ser eg skreiv feil i den forrige posten, beklager det). function test(&$var) { $var++; } $test=1; test($test); echo $test; Du kan og returnere verdiene i eit array vist du vil det. I.e. return array(); og deretter bruke list() = functionname(); til å hente dei ut i egne variabler Grunnen til at du ikkje bør bruke for mye globals, er rett og slett fordi at globals er ein "uting", du har mindre kontroll over programmet seinere vist du gjør nokre forandringer. I.e. vist du forandrer på ein av variablene som er brukt i fleire functions ved hjelp av globals så må du plutseleg kansje forandre på alle funksjonene. + når du bruker globals er sjansen større for at nokon kan forandre på informasjonen til dei variablene, og med det prøve og bryte seg inn i seden din osv. Lenke til kommentar
Nervetattoo Skrevet 10. juni 2004 Del Skrevet 10. juni 2004 Og bare for å kommentere litt på posten til The Red Devil her. Som du ser bruker han &$var. Det kan da være greit å vite hva & gjør/er. & skaper en referanse til variabelen, så en endringen på orginal variabelen vil også endre den refererte variabelen, og motsatt. Den normale oppførselen er at det tas en kopi. function test(&$var) { $var++; } function test2($var) { $var++; } $test = 1; /* Her vil fuksjonen test() referere direkte til $test variabelen. Dermed vil $var++; i funksjonen kunne sammenlignes med $test++; */ echo test($test); // Skriver 2 /* Her vil funksjonen test2() lage en kopi av $test i den interne variabelen $var Dermed vil $var++; sette $var til 2 og ikke røre $test echo test2($test); // Skriver 1 Vet ikke hvorvidt det var interesant for deg i det store og hele, men det bare datt ut Lenke til kommentar
Pangaea Skrevet 10. juni 2004 Forfatter Del Skrevet 10. juni 2004 (endret) Mye god informasjon her, men ble egentlig litt usikker på hva jeg bør bruke. Har en ganske lang funksjon først (ca 160 linjer). Her blir en del variabler satt fra skjema osv. Disse bruker jeg seinere til å sette inn i databasen i forskjellige tabeller. Derfor må jeg ha tilgang til variablene utenfor selve funksjonen også. Det fungerer sånn som det er nå (med globals), men er det en sikkerhetsrisiko bør jeg kanskje revurdere det. function validate() { global $cd1, $cd2, $cd3, $bootmedia_id, $bootleg, $rel_year, $label, $catno, $aud_qual, $vid_qual, $notes, $status; $cd1 = $_POST['cd1']; $cd2 = $_POST['cd2']; $cd3 = $_POST['cd3']; $bootmedia_id = $_POST['bootmedia']; $bootleg = htmlspecialchars(mysql_escape_string(trim($_POST['bootleg']))); $rel_year = $_POST['rel_year']; $label = htmlspecialchars(mysql_escape_string(trim($_POST['label']))); $catno = htmlspecialchars(mysql_escape_string(trim($_POST['catno']))); $aud_qual = $_POST['Audio']; $vid_qual = $_POST['Video']; $notes = htmlspecialchars(addslashes(trim($_POST['notes']))); $status = true; if(!is_numeric($bootmedia_id)) { global $err_bootmedia; $err_bootmedia = "You must choose a media for the bootleg.<br/>"; $status = false; } if(empty($bootleg)) { global $err_bootleg; $err_bootleg = "You must enter a name for the bootleg.<br/>"; $status = false; } if(!is_numeric($aud_qual)) { $aud_qual = 0; } if(!is_numeric($vid_qual)) { $vid_qual = 0; } //get format_id from bootmedia dropdown box $format_id = getFormat($bootmedia_id); if($format_id == 1) { $vid_qual = 0; } //check for entered track-number if(!is_numeric($cd1)) { $cd1 = 0; $status = false; } if(!is_numeric($cd2)) { $cd2 = 0; $status = false; } if(!is_numeric($cd3)) { $cd3 = 0; $status = false; } if($cd1 == 0 && $cd2 == 0 && $cd3 == 0) { global $err_cd; $err_cd = "You must choose tracks for the bootleg.<br/>"; $status = false; } //if entered in wrong sequence, set to zero if($cd1 == 0) { $cd2 = 0; $cd3 = 0; } elseif($cd2 == 0) { $cd3 = 0; } //put to arrays $i = 1; while($i <= $cd1) { global $cd1song, $cd1concert, $cd1track; if(is_numeric($_POST['cd1_sid'.$i]) && is_numeric($_POST['cd1_cid'.$i])) { $cd1song[$i] = $_POST['cd1_sid'.$i]; $cd1concert[$i] = $_POST['cd1_cid'.$i]; $cd1track[$i] = ""; } elseif(!empty($_POST['cd1_track'.$i])) { $cd1track[$i] = $_POST['cd1_track'.$i]; $cd1song[$i] = 0; $cd1concert[$i] = 0; } else { global $err_cd1; $err_cd1 .= "You must enter information for track #".$i." on Disc #1.<br/>"; $status = false; } $i++; } //put to arrays $i = 1; while($i <= $cd2) { global $cd2song, $cd2concert, $cd2track; if(is_numeric($_POST['cd2_sid'.$i]) && is_numeric($_POST['cd2_cid'.$i])) { $cd2song[$i] = $_POST['cd2_sid'.$i]; $cd2concert[$i] = $_POST['cd2_cid'.$i]; $cd2track[$i] = ""; } elseif(!empty($_POST['cd2_track'.$i])) { $cd2track[$i] = $_POST['cd2_track'.$i]; $cd2song[$i] = 0; $cd2concert[$i] = 0; } else { global $err_cd2; $err_cd2 .= "You must enter information for track #".$i." on Disc #2.<br/>"; $status = false; } $i++; } //put to arrays $i = 1; while($i <= $cd3) { global $cd3song, $cd3concert, $cd3track; if(is_numeric($_POST['cd3_sid'.$i]) && is_numeric($_POST['cd3_cid'.$i])) { $cd3song[$i] = $_POST['cd3_sid'.$i]; $cd3concert[$i] = $_POST['cd3_cid'.$i]; $cd3track[$i] = ""; } elseif(!empty($_POST['cd3_track'.$i])) { $cd3track[$i] = $_POST['cd3_track'.$i]; $cd3song[$i] = 0; $cd3concert[$i] = 0; } else { global $err_cd3; $err_cd3 .= "You must enter information for track #".$i." on Disc #3.<br/>"; $status = false; } $i++; } } Om jeg istedenfor lagrer variablene i en array, fx $data['var'], hvordan får jeg da hentet ut fra denne arrayen? Fikk det ikke helt til. Jeg unsetter alle variablene jeg bruker etter de har blitt satt inn i databasen, eller når skriptet er ferdigkjørt. Er det ikke nok sikkerhetsmessig i dette tilfellet? Edit: Tabs -> Spaces i kode... Endret 10. juni 2004 av Pangaea Lenke til kommentar
The Red Devil Skrevet 10. juni 2004 Del Skrevet 10. juni 2004 Findus: Slik som du forklarer det er rett, men kode eksempelet fungerer ikkje. Du kan ikkje bruke "echo test2($test);" for å skrive ut dei nummeret. Og slik den er oppsatt vist du kunne brukt den måten til å skrive det ut så ville den siste blitt 3 ikkje 1. Grunnen til dette er siden du først har "$test=1" deretter så blir $test satt til 2 i funksjon test, og tilslutt blir den sett til 3 i funksjon test2 Pangaea: Eg startet med å skrive om funksjonen din, men gidde det opp. Beklager men eg forstår bare ikkje alt av logikken din. Denne funksjonen skal iallefall kunne skrives om til å bli bare halvparten så lang eller ennå kortere. Slik eg fårstår det er dette bare ein verifisjons av at alt inneholder data ? Alt du trenger då er ein lang if setning, som vist noko ikkje er rett setter $error til ein feilmelding som deretter blir returnert til hovedskriptet som igjen bryter av skriptet og viser feilmeldingen istedenfor å lagre skriptet. Det ville nok også vært mye bedre å bruke ein classe til heile denne operasjonen, i.e. validering og eventuelt lagrning Lenke til kommentar
Nervetattoo Skrevet 10. juni 2004 Del Skrevet 10. juni 2004 The Red Devil: Oooooops, ja, tenkt ikke så alt for langt når jeg skrev ned det eksempelet. My bad. Lenke til kommentar
Pangaea Skrevet 10. juni 2004 Forfatter Del Skrevet 10. juni 2004 Sikkert mulig å få den en del kortere, men så lenge jeg har oversikt er det greit nok for meg egentlig. Klasse er nok en bra måte å gjøre det på, men kan ikke noe særlig om det, og orker ikke å sette meg inn i det akkurat nå. Vil heller få siden opp å gå, så kan jeg heller fikse det etter hvert. Bruker globals nå, er det sikkert nok? Prøvde å bruke subarrays på cd-dataene, men da ville ikke noen andre funksjoner virke, så måtte bruke de sånn som de står i koden... 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å