Avaleht
uus teema   vasta Tarkvara »  WWW »  <?php: kuidas funktsiooni sisse kaasata sõltumatu muutuja väärtus? märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele 1, 2  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
SGM
HV kasutaja

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 20.01.2008 17:26:07 <?php: kuidas funktsiooni sisse kaasata sõltumatu muutuja väärtus? vasta tsitaadiga

Oletame, et kood on midagi sellist:

<?php

$yks = "üks";

//siin vahel on muid koode ja igast jura
//

function blah($kaks, $kolm){

if($yks == "üks"){
//siis teeme midagi
}else{
$neli = $kaks + $kolm;
}

return $neli;
}

// blaablaa
// siin kusagil kutsume välja funktsiooni:

$arv = blah(2,3);

?>

Aga jama on selles, et funktsiooni sees on $yks täiesti tühi. Ma tean, et funktsiooni sees ja väljaspool olevad muutujad pole üldse samad, aga kas on kuidagi võimalik ka nii, et see $yks oleks automaatselt ka funktsiooni sees "üks"?
Seda oleks vaja nii, et ei pea seda muutujat $yks lisama blah() vahele, samas ei taha ka konstanti tekitada, kuna see $yks muutub pidevalt. icon_rolleyes.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 20.01.2008 17:37:32 vasta tsitaadiga

<?php

$yks = "üks";

//siin vahel on muid koode ja igast jura
//

function blah($kaks, $kolm){
global $yks ;
if($yks == "üks"){
$neli = $kaks * $kolm;
}else{
$neli = $kaks + $kolm;
}

return $neli;
}

// blaablaa
// siin kusagil kutsume välja funktsiooni:

$arv = blah(2,3);
echo $arv;
?>

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 20.01.2008 19:07:40 vasta tsitaadiga

global $muutuja; -- ja asi toimib! Ei arvanud, et nii lihtne! icon_biggrin.gif Tänud! beer_yum.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
morgoth
HV kasutaja
morgoth

liitunud: 14.01.2004




sõnum 20.01.2008 20:12:12 vasta tsitaadiga

Globaalmuutujate kasutamine ei vasta kodeerimise heale tavale. Saab ika ilma hakkama.
Kommentaarid: 11 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 10
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 20.01.2008 20:44:46 vasta tsitaadiga

Teine võimalus on see funktsiooni välja kutsumisel lisada.
$arv = blah(2,3,$yks);


function blah($kaks, $kolm,$yks){

Kui ei vasta tavadele, miks sa ei paku lahendust siis?

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Telempe
Kreisi kasutaja
Telempe

liitunud: 02.11.2002




sõnum 20.01.2008 22:54:01 vasta tsitaadiga

php:
  1. <?php
  2.  
  3. define(yks,"üks");
  4.  
  5. //siin vahel on muid koode ja igast jura
  6. //
  7.  
  8. function blah($kaks, $kolm){
  9. if(yks == "üks"){
  10. $neli = $kaks * $kolm;
  11. }else{
  12. $neli = $kaks + $kolm;
  13. }
  14.  
  15. return $neli;
  16. }
  17.  
  18. // blaablaa
  19. // siin kusagil kutsume välja funktsiooni:
  20.  
  21. $arv = blah(2,3);
  22. echo $arv;
  23. ?>

_________________
ORLY? I hardly know her!
Kommentaarid: 22 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 21
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 20.01.2008 23:11:34 vasta tsitaadiga

tsitaat:
define(yks,"üks");

Mis see nüüd on? See yks ei ole nüüd muutuja? Kui nüüd oleks vaja muutujat, kas siis teha tuleks nii?

$i = "üks";
define(yks, $i);

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 21.01.2008 11:54:27 vasta tsitaadiga

morgoth kirjutas:
Globaalmuutujate kasutamine ei vasta kodeerimise heale tavale. Saab ika ilma hakkama.

Ma sooviks ka mingit näidet vms. icon_smile.gif
Nagu ma ütlesin, et nii ma ei taha (sest ma ei saa nii):
$arv = blah(2,3,$yks);

Sain asja korda, kui panin:
global $yks;

Ja miks viimane peaks halb olema? Mingi turvarisk?
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
AMD
HV veteran
AMD

liitunud: 29.07.2003




sõnum 21.01.2008 13:21:33 vasta tsitaadiga

tsitaat:

Sain asja korda, kui panin:
global $yks;

Ja miks viimane peaks halb olema? Mingi turvarisk?


Pakun huupi aga kui $yks peaks eelnevalt defineerimata olema, siis v-o on seda võimalik ette anda $_POST / $_GET muutujatega.

_________________
From now on, the forum is owned by AMD.That means that you are NO LONGER allowed to talk about, or even mention *ntel.
Kommentaarid: 335 loe/lisa Kasutajad arvavad:  :: 145 :: 3 :: 12
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Telempe
Kreisi kasutaja
Telempe

liitunud: 02.11.2002




sõnum 21.01.2008 14:29:47 vasta tsitaadiga

http://ee.php.net/register_globals
_________________
ORLY? I hardly know her!
Kommentaarid: 22 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 21
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 21.01.2008 15:36:49 vasta tsitaadiga

AMD kirjutas:
Pakun huupi aga kui $yks peaks eelnevalt defineerimata olema, siis v-o on seda võimalik ette anda $_POST / $_GET muutujatega.

Kuidas keegi väljastpoolt minu serverit saaks muutujat $yks kuidagi muuta? $_POST / $_GET peaks selleks ju siis ikkagi minu koodis olema...? Mul antakse iga lehekülje päises muutujale $yks mingi kindel väärtus. Pakun, et ei saaks seda muutujat isegi siis muuta, kui RG oleks ON. Või saaks? icon_rolleyes.gif
Mul on üks osa muutujaid, millede väärtused on conf-i failis kindlaks määratud ja neid kasutatakse saidil globaalselt.
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
mks
HV veteran

liitunud: 27.09.2004




sõnum 21.01.2008 16:43:56 vasta tsitaadiga

Eeldusel, et serveril on register_globals sees, siis aadressireale domeen.xxx/fail.php?yks=midaiganes niipalju kui ma aru olen saanud...
Kommentaarid: 11 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 21.01.2008 17:14:59 vasta tsitaadiga

Telempe kirjutas:
http://ee.php.net/register_globals
väga väga paha soovitus on see
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
Telempe
Kreisi kasutaja
Telempe

liitunud: 02.11.2002




sõnum 21.01.2008 18:29:30 vasta tsitaadiga

"Relying on this feature is highly discouraged." on paha soovitus?
_________________
ORLY? I hardly know her!
Kommentaarid: 22 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 21
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 21.01.2008 23:42:10 vasta tsitaadiga

Telempe kirjutas:
"Relying on this feature is highly discouraged." on paha soovitus?
jah, register_globals on kurja juur
sealsamas php lehel näide nr1 on väga hea näide
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
mks
HV veteran

liitunud: 27.09.2004




sõnum 21.01.2008 23:50:26 vasta tsitaadiga

mikk36 kirjutas:
Telempe kirjutas:
"Relying on this feature is highly discouraged." on paha soovitus?
jah, register_globals on kurja juur
sealsamas php lehel näide nr1 on väga hea näide


"Selle funktsiooni kasutamine on rangelt mittesoovitatud" oleks lause lähikaudne tõlge icon_razz.gif inglise keelt vaja meelde tuletada icon_biggrin.gif
Kommentaarid: 11 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 22.01.2008 02:49:43 vasta tsitaadiga

Tegelikult sellise abstraktse koodinäite puhul ei saa öelda, milline oleks õige lähenemine. Vaja oleks siiski teada, mida see funktsioon teeb selle muutujaga ja mida tolle muutuja väärtus endast kujutab.

Üldiselt pole globaalsete muutujate kasutamine eriti taunitav, kuid pole reegleid ilma eranditeta ja teinekord on just see kõige parem lahendus.

Antud juhtum pole aga eriti seotud register_globals direktiiviga. Globaalsetest muutujatest tuleks proovida hoiduda ükskõik mis keeles progammeerides. Põhjus on selles, et globaalseid muutujaid kasutav funktsioon muutub kergemini haavatavaks - ta hakkab tugevasti sõltuma sellest keskkonnast, kus ta jookseb. Tarvitseb vaid tollel muutujal mingil ajahetkel omandada ebasobiv väärtus ning funktsioon lakkab korrektselt funktsioneerimast.

Aga alustuseks võiks sa siiski öelda, miks sa ei saa seda muutujat kaasa anda funktsiooni parameetrina? Sa ütled, et sa ei saa. Kuid miks?
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 23.01.2008 09:43:11 vasta tsitaadiga

nene kirjutas:
Aga alustuseks võiks sa siiski öelda, miks sa ei saa seda muutujat kaasa anda funktsiooni parameetrina? Sa ütled, et sa ei saa. Kuid miks?

Sellepärast, et selle muutuja $yks puhul on tegemist muutujaga, mida kaasa panna oleks tüütu -- peaksin ümber tegema kõik funktsiooni väljakutsumise kohad.... Ja ühel juhul on tegemist confifailis määratud väärtusega $shift=#mingiarv# ja siis $yks=time()+$shift - mida oleks väga ebadünaamiline iga funkts. sees uuesti määrata.
Ma ei kasuta kunagi enam RG=ON, sain sellest juba möödunud aastal üle. icon_smile.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 23.01.2008 09:56:12 vasta tsitaadiga

SGM, kasuta siis search funktsiooni, saad ehk kiiremini icon_razz.gif
tahad programmeerida siis programmeeri, mõnuga icon_biggrin.gif
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 23.01.2008 12:56:17 vasta tsitaadiga

mikk36 kirjutas:
SGM, kasuta siis search funktsiooni, saad ehk kiiremini icon_razz.gif
tahad programmeerida siis programmeeri, mõnuga icon_biggrin.gif

Kasutan seda nagunii. icon_biggrin.gif Aga global $muutuja; on mugavam. icon_biggrin.gif Pealegi on mul antud juhul tegemist kahjutute muutujatega - selle kaudu lehte peppu ei keera.

Ma ei programmeeri mõnuga, sest ma jään alati matemaatika taha toppama - see oli koolis ka "2" mul! icon_biggrin.gif Programmeerin vaid sellepärast, et keegi teine seda minu eest ei tee! Vähemalt mitte taskukohase hinnaga. icon_razz.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
okpoiss
HV kasutaja
okpoiss

liitunud: 07.11.2001




sõnum 25.01.2008 09:52:15 vasta tsitaadiga

No kui sul ühe kooditsükli jooksul $yks väärtus ei muutu, siis oleks kõige parem kasutada muutuja defineerimist nagu Telempe soovitas. Võid ka nii define($yks, ''Üks"); Või kui muujta vääärtus tuleb kogu aeg GET meetodi kaudu siis define($yks,addslashes($_GET['yks'])]; addslashes siis selleks, et kui keegi üritab igasuguseid keelatud märke urli kirjutada siis need muudetakse kahjututeks.

Kui muutujatel väärtus ei muutu, siis on parem nad defineerida. Sellisel juhul ei saa nendele koodi hiljem enam mingit muud väärtust anda ja samas defineeritud muutuja jookseb läbi ka funktsioonidest.
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
mks
HV veteran

liitunud: 27.09.2004




sõnum 25.01.2008 19:29:14 vasta tsitaadiga

afaik okpoiss meetodit kasutades siis kuhugi kasutaja suunas funktsiooni väärtuse väljastamisel peaks kasutama ka stripslashes ... võin ka eksida
Kommentaarid: 11 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga

sõnum 27.01.2008 20:02:13 vasta tsitaadiga

Väga hea! Mul ongi päris mitu kindlat muutujat, mis on saidi confifailis sees ja nendele annan väärtuse otse php-faili sisu muutes. Saidi töö kestel nende väärtused ei muutu. Väärtused ei tule andmebaasist.

Samas hakkab siin-seal viskama ette "Notice: Undefined variable... blaablaa", kui panen error_reporting(E_ALL); -- siis on hea näha, mis muutujad on tühjalt, isegi ilma vale väärtuseta. Näiteks if($muutuja == $midagi) juures hakkab ajama oma notice-jama. Aga kui enne (koodi alguses) olen $muutuja-le andnud niisama võrdusmärgiga väärtuseks kasvõi 0, siis enam ei kisanud mul sedasi.
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 27.01.2008 20:49:06 vasta tsitaadiga

SGM, nii peabki olema
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
okpoiss
HV kasutaja
okpoiss

liitunud: 07.11.2001




sõnum 27.01.2008 21:44:56 vasta tsitaadiga

mks kirjutas:
afaik okpoiss meetodit kasutades siis kuhugi kasutaja suunas funktsiooni väärtuse väljastamisel peaks kasutama ka stripslashes ... võin ka eksida


Jah stripslashes on vastupidine funktsiooni addslashes'ile. Stripi kasutaks andmete kuvamisel, et eemaldada kahtlaste märkide eest kaldkriipsud. Muidu oleks kuvamise väljund näiteks \'Tere\'.
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  <?php: kuidas funktsiooni sisse kaasata sõltumatu muutuja väärtus? mine lehele 1, 2  järgmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.