Gå til innhold

Variabler i funksjoner. Hvordan få tak i de?


Anbefalte innlegg

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
Videoannonse
Annonse

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

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

Å 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

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 av The Red Devil
Lenke til kommentar

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

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

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

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 av Pangaea
Lenke til kommentar

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

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

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...