webForumDet fria alternativet

Globala variablar!

12 svar · 491 visningar · startad av Fredde Mannen

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#1

Ehmm..

Kan någon yttra sig åt mig om detta?

"script är "säkrare" om man alltid använder sig av de globala variablerna"

Utlåtande tack!

:D

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#2

De jag menar var att jag skrev ett script för en inlämningsuppgift!

Fick den godkänd men med kommentarer om att

Sedan så förstår jag inte varför du "plockar ut" värdena ur $_POST. Skriptet blir mer lättläst och "säkrare" om man alltid använder sig av de globala variablerna."

Men då började jag fundera nu, globala variablar, handlar inte de om man vill ha variablar i funktioner globala eller icke globala, dvs lokala!

Alltså:

<?
function plus() {
  global $tal1, $tal2;

  $svar = $tal1 + $tal2;
  
  return $svar; 
}

$tal1 = 12;
$tal2 = 11;
$svar = plus();
echo $svar; 
?>

Så vad syftar han på? ehum..

ang. $_POST, så är det väl lämpligast att hämta värdet med $_POST, och inte med formulärnamnet, ex $namn ?

:q

PeeerMedlem sedan mars 20025 362 inlägg
#3

http://se.php.net/manual/en/language.variables.predefined.php

Sedan så förstår jag inte varför du "plockar ut" värdena ur $_POST. Skriptet blir mer lättläst och "säkrare" om man alltid använder sig av de globala variablerna.

Misstänker att du gör något sådant här

$id = $_POST['id'];

Det är väl det han ifrågasätter. Varför lagra om värdet i $id när du redan har värdet i $_POST['id']

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#4

misstänkte det! :)

det är väl i sig inget större fel att göra så eller? Ser många som gör så, sen är man lite fast i ASP, sen början! :)

Alpha IIMedlem sedan maj 20002 579 inlägg
#5

Det är ju inget syntaxfel men det är rätt onödigt och tar upp dubbelt så mycket plats.

SkarreMedlem sedan apr. 20012 447 inlägg
#6

Jag lägger nästan alltid $_POST-värden i nya variabler. När en besökare skickar ett formulär och jag måste visa ett felmeddelande för att denne glömt fylla i ett fält, då vill jag inte tvinga dem att fylla i hela formuläret från början igen. Därför ser det ofta ut ungefär såhär i toppen av mina formulärsidor.

if ($_POST) {
	$name = $_POST['name'];
	$email = $_POST['email'];
} else {
	$name = '';
	$email = '';
}

Formuläret kan då se ut ungefär så här.

<form>
	<input type="text" name="name" value="<?=$name?>" />
	<input type="text" name="email" value="<?=$email?>" />
</form>

Men om ni nu tycker att det är onödigt, hur gör ni då för att bevara värdena i ett formulär på här sättet? Man kan ju inte gärna skriva så här

<input type="text" name="name" value="<?=$_POST['name']?>" />

Har jag missat något?

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#7

Alpha II skrev:

Det är ju inget syntaxfel men det är rätt onödigt och tar upp dubbelt så mycket plats.

Mjo, men att det tar upp mer plats, struntar jag i!

Saken var den, blir scriptet "säkrare" genom att inte göra så här:

$var = $_POST['formvar'];

till skillnad från

$_POST['formvar'];

:q

att de kräver mer plats i minnet är en sak! Men blir de säkrare?

Om nu register_globals = OFF

aasahMedlem sedan mars 20033 451 inlägg
#8

Jag tror att en tanke kan vara följande:

De värden som ligger i $_POST är tveklöst från det postade formuläret. Om du slentrianmässigt sätter du om alla POST, GET, SESSION och COOKIES till samma namn utanför de respektive arrayerna i dina skript, kan en krock uppstå. Om du gör detta i olika skript (via include) eller om skriptet är långt, kan då otrevliga saker hända.

Ett snabbt, förenklat och knasigt exempel som dock illustrerar vad jag menar är följande:
Antag att alla sidor kollar inloggning genom en inkluderad fil som gör följande:

$inne = $_SESSION["inne"];   //Får värdet 0 för icke inloggad tex.

Senare i skriptet:

$inne = $_POST["inne"];  //Får värdet 7 tex.

Senare igen:

if ($inne) {
print $lösenord;
}

Ingen höjdare direkt!!

Om du däremot skrev:

if (isSet($_SESSION["inne"]) && $_SESSION["inne"] == 1) {
print $lösenord;
}

så kan inget otrevligt hända.

-----
En annan skillnad är att POST, GET, SESSION och COOKIES är superglobala och syns även i funktioner, medan globala variabler som du definierar inte syns i funktioner med default.

$inne = $_SESSION["inne"];
//returnerar alltid 0
function sloppy() {
   return $inne;
}

//Funkar
function works() {
   global $inne;
   return $inne;
}

//Funkar
function in() {
   return $_SESSION["inne"];
}
bassebhuMedlem sedan nov. 20014 028 inlägg
#9

hmm, jag tycker också att det blir snyggare kod om man slänger in post-variabler i nya variabler som man sedan kan använda i sina sql-frågor osv. Blir mycket mer lättläst. Att det skulle kräva märkbart mer laddningstid tror jag inte på.

för att förhindra slumpkrockar så kan man ju sätta $p_namn för postvariabel, $g_namn för get, $c_namn för cookie och $s_namn för session osv.

$p_namn eller kanske $pNamn är mer lättläst än $_POST['namn'] och dessutom färre tecken man behöver skriva (fnuttarna och klamrarna behöver ju öven dubbelgrepp för att knappas in :P ). Vill man sedan lägga på en funktion på $_POST['namn'] så behöver man bara ändra det första gången.

Jag tycker att det verkar mycket vettigt. Har jag missat nåt?

MatteMedlem sedan aug. 20002 970 inlägg
#10

Jag kan av egen erfarenhet säga att det blir mycket lättare när man kommer tillbaka till gamla skript efter ett halvår eller så, att följa skriptet och förstå om man använt $_POST['variabel'] och liknande i sin kod istället för omskrivna variabler.

Därför inte sagt att det inte finns tillfällen då det kan vara lämpligt att lägga över i andra variabler.

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#11

Låter vackert!

Men åter igen detta med:

$var = $_POST['formvar'];

Hittade nyligen i boken PHP 3 och PHP 5 av Jesper EK m.fl. där han sätter

$var = $_POST['formvar'];

Om det nu är säkrare att bara använda sig av den superglobala variabeln, varför går han ut med ett sådant ex. :q

ex. http://nezzo.nu/na.asp?id1=96&id2=3148

(borde väl tänka säkert, tycker man juh! )

är som lite konfundersam! *s*

aasahMedlem sedan mars 20033 451 inlägg
#12

Ett skäl till att läroböcker skriver så KAN vara att det gör skripten lättare att anpassa för folk som sitter med äldre versioner av PHP. Då är det bara tilldelningsdelen som ska ändras, medan annars är det problem i hela skriptet. Min bok har någon småknasighet (kommer inte ihåg vad) där de speciellt säger att de gör på ett sämre sätt med tanke på folk med äldre PHP-versioner.

Fredde MannenMedlem sedan nov. 20013 498 inlägg
#13

aasah skrev:

Ett skäl till att läroböcker skriver så KAN vara att det gör skripten lättare att anpassa för folk som sitter med äldre versioner av PHP. Då är det bara tilldelningsdelen som ska ändras, medan annars är det problem i hela skriptet. Min bok har någon småknasighet (kommer inte ihåg vad) där de speciellt säger att de gör på ett sämre sätt med tanke på folk med äldre PHP-versioner.

Gudarsskymning.
Är boken för PHP 5, så räknar jag med att folk använder PHP 5 :OO

Genererad på 385 ms · cache AV · v20260730165559-full.f96bc7eb