[PHP] Global Vars

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mask
  • Registratie: September 2001
  • Laatst online: 06-07-2020
Ben ik nu zo stom (retorische vraag, graag niet beantwoorden :P) of hoe zit dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
  $var1 = 0;
  $var2 = 0;
  $var3 = 0;

  function setlang($lang) {
    global $var1,$var2,$var3;
    switch ($lang) {
      case "nl":
        $var1 = "Variabele 1";
        $var2 = "Variabele 2";
        $var3 = "Variabele 3";
        break;
     case "en":
        $var1 = "Variable 1";
        $var2 = "Variable 2";
        $var3 = "Variable 3";
        break;
     }
  }

  if ($user == "test") setlang("nl");
  else setlang("en");

  print($var1);
?>


Bij het aanroepen test.php?user=test zou hij toch "Variabele 1" moeten printen? Hij geeft 0 :) Misschien te slaperig :P

Sorry voor de 2e topic.. Vorige gesloten voor ik er een reactie op kon geven..

Reactie:
Ik heb het dus niet over de post/get variabelen.. Ik kan namelijk prima bij $user komen, maar op een of andere manier NIET bij de $var1,2 en 3 die geset zijn in de function..

Ook $GLOBALS['var1'] or $_GET['var1'] werken niet.. Is dit toch een superglobals probleem? Hoe zou ik dat dan aan moeten geven?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
natuurlijk werken $_GET['var1'] en $GLOBALS niet. Je variabel heet toch user 8)7

$_GET['user'] dus... :P


Niet goed gelezen ;)

Hij werkt hier ook goed overigens.

[ Voor 33% gewijzigd door Michali op 27-03-2005 16:53 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

Sorry voor de 2e topic.. Vorige gesloten voor ik er een reactie op kon geven..
Stuur volgende keer een mailtje als je het niet eens bent met een topic :) Heropenen kan dan altijd :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
Script werkt prima hier :S

Bovendien is die $user oftewel $_GET['user'] niet het probleem... mocht dat niet werken dan pakt hij de "en"-case en zou hij net zo goed hetzelfde moeten printen.

[ Voor 126% gewijzigd door HyperioN op 27-03-2005 16:52 ]


Acties:
  • 0 Henk 'm!

  • Mask
  • Registratie: September 2001
  • Laatst online: 06-07-2020
Michali: Ik heb geen behoefte aan de USER variabele, maar meer aan de var1, var2 en var3 die ik binnenin de functie set..

gorgi_19: sorry, my bad!

HyperioN.: Als ik alleen met superglobals werk (zie onder) pakt ie em ook niet namelijk:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
  $GLOBALS['var1'] = 0;
  $GLOBALS['var2'] = 0;
  $GLOBALS['var3'] = 0;

  function setlang($lang) {
    switch ($lang) {
      case "nl":
        $GLOBALS['var1'] = "Variabele 1";
        $GLOBALS['var2'] = "Variabele 2";
        $GLOBALS['var3'] = "Variabele 3";
        break;
     case "en":
        $GLOBALS['var1']  = "Variable 1";
        $GLOBALS['var2']  = "Variable 2";
        $GLOBALS['var3']  = "Variable 3";
        break;
     }
  }

  if ($user == "test") setlang("nl");
  else setlang("en");

  print($GLOBALS['var1']);
?>

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Hmm dat is vreemd. Heb je superglobals aan staan? En welke php versie draai je?

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
Lijkt me een probleem in de configuratie van je webserver..want wederom werkt het prima hier. Geprobeerd op twee verschillende servers.

Acties:
  • 0 Henk 'm!

Verwijderd

Ga eens gewoon debuggen? Zet hier en daar een echo statement, zodat je ziet wat er allemaal wel en niet wordt uitgevoerd?

Acties:
  • 0 Henk 'm!

  • Mask
  • Registratie: September 2001
  • Laatst online: 06-07-2020
Ok, om er zeker van te zijn dat het niet ergens anders in mijn code zit, hierbij de aangepaste "originele" code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
  $title    = 0;
  $descript = 0;
  $descrip2 = 0;
  $fullname = 0;
  $address1 = 0;
  $address2 = 0;
  $postal   = 0;
  $city     = 0;
  $country  = 0;
  $editor   = 0;
  $date     = 0;
  $day1     = 0;
  $day2     = 0; 
  $day3     = 0;
  $status1  = 0;
  $error1   = 0;
  $error2   = 0;
  $error3   = 0;
  $error4   = 0;
  $error5   = 0;
  $error6   = 0;
  $error7   = 0;
 
 function checklogin($user,$pass) {
    // Hier checked ie de user en pass en return true als goed is, return false is fout is.
  }

  function entrycheck($FEFullName,$FEAddress1,$FEAddress2,$FEPostalcode,$FECity,$FECountry,$FEEditor,$FEEventDate) {
    if ($FEFullName == "") $error="Error1";;
    if ($FEAddress1 == "") $error="Error2";
    if ($FEPostalCode == "") $error="Error3";
    if ($FECity == "") $error="Error4";
    if ($FECountry == "") $error="Error5";
    if ($FEEditor == "") $error="Error6";
    if ($FEEventDate == "") $error="Error7";
    if ($error != "") return $error;
    else return "Good";
  }
  
  function setlang($user) {
    //global $title, $descript, $descrip2, $fullname, $address1, $address2, $postal, $city, $country, $editor, $date, $day1, $day2, $day3, $status1, $error1, $error2, $error3, $error4, $error5, $error6, $error7;
    if ($user == "mem") {
      $GLOBALS['title']    = "Adreslijst Bruiloftsreceptie";
      $GLOBALS['descript'] = "Vul het adres in en klik op Submit Form.";
      $GLOBALS['descrip2'] = "Vul a.u.b. alle velden met een * in.";
      $GLOBALS['fullname'] = "Naam";
      $GLOBALS['address1'] = "Adres 1";
      $GLOBALS['address2'] = "Adres 2";
      $GLOBALS['postal']   = "Postcode";
      $GLOBALS['city']     = "Woonplaats";
      $GLOBALS['country']  = "Land";
      $GLOBALS['editor']   = "Gebruiker";
      $GLOBALS['date']     = "Datum";
      $GLOBALS['day1']     = "Zat, 28 Mei 2005";
      $GLOBALS['day2']     = "Zon, 29 Mei 2005"; 
      $GLOBALS['day3']     = "Vrij, 10 Juni 2005";
      $GLOBALS['status1']  = "Ingelogd";
      $GLOBALS['error1']   = "Naam niet ingevuld";
      $GLOBALS['error2']   = "Adres niet ingevuld";
      $GLOBALS['error3']   = "Postcode niet ingevuld";
      $GLOBALS['error4']   = "Woonplaats niet ingevuld";
      $GLOBALS['error5']   = "Lang niet ingevuld";
      $GLOBALS['error6']   = "Geen gebruiker uitgekozen";
      $GLOBALS['error7']   = "Geen datum uitgekozen";
    }
    else {
      $GLOBALS['title']    = "Address-list Wedding-reception";
      $GLOBALS['descript'] = "Enter the address details and click Submit Form.";
      $GLOBALS['descrip2'] = "Please fill in all fields marked with a *.";
      $GLOBALS['fullname'] = "Full Name";
      $GLOBALS['address1'] = "Address 1";
      $GLOBALS['address2'] = "Address 2";
      $GLOBALS['postal']   = "ZIP Code";
      $GLOBALS['city']     = "City";
      $GLOBALS['country']  = "Country";
      $GLOBALS['editor']   = "Username";
      $GLOBALS['date']     = "Date";
      $GLOBALS['day1']     = "Sat, 28 May 2005";
      $GLOBALS['day2']     = "Sun, 29 May 2005"; 
      $GLOBALS['day3']     = "Fri, 10 June 2005";
      $GLOBALS['status1']  = "Logged in";
      $GLOBALS['error1']   = "No name entered";
      $GLOBALS['error2']   = "No address entered";
      $GLOBALS['error3']   = "No postal code entered";
      $GLOBALS['error4']   = "No city entered";
      $GLOBALS['error5']   = "No country entered";
      $GLOBALS['error6']   = "No username selected";
      $GLOBALS['error7']   = "No date selected";
    }
    return true;
  }

  function printform($user,$lang) {
    global $title,$fullname,$address1,$address2,$postal,$city,$country,$editor,$date,$day1,$day2,$day3;
    
  // Hier print ie het invulformulier in HTML
    return true;
  }

  function printlogin() {
     // Hier print ie het loginscherm
    return true;
  }

  function printstatus($currentstatus) {
    //Hier print ie de huidige status
    print("<table width=\"95%\" cellspacing=\"0\" cellpadding=\"0\" bgcolor=\"#000000\">\n<tr>\n<td>\n<table width=\"100%\" cellspacing=\"1\" cellpadding=\"5\" bgcolor=\"#D6DFEF\">\n<tr>\n<td>Status: ".$currentstatus."</td>\n</tr>\n</table>\n</td>\n</tr>\n</table>\n<BR>");
    return true;
  }

  if ($action == "login") {
    if (checklogin($user,$pass)) {
      setlang($user);
      $currentstatus = $status1;
      printstatus($currentstatus);
      printform($user,$lang);
    }
    print("ShowSuccess");
  }
  else if ($action == "add") {
entrycheck($FEFullName,$FEAddress1,$FEAddress2,$FEPostalcode,$FECity,$FECountry,$FEEditor,$FEEventDate);
   if ($error != "Error3") print("The error is: ".$_GET['error3']);
   else print("Couldnt figure it out..");
  }
  else printlogin();

?>


Sorry voor de spaghetti maar het gaat me om de laatste regel onder action==add. Bij het printen van Error3 geeft ie: The error is: 0..

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ja daag, breng het zelf eerst maar eens terug naar de essentie. En zoals al gezegd, ga gewoon een beetje debuggen. :)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je nou eens in plaats van het gebruiken van globals, nou gewoon een array zou laten teruggeven door je functie, dan heb je om te beginnen al een stuk minder ranzige code.

Verder is $error geen global, en daarom gaat het mis...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Dat is dus wat ik het grote nadeel vindt aan PHP, als ze gewoon de structuur gelaten zouden hebben als bij C had het handiger gewerkt.

Ik heb zelf dit probleem ook gehad, bij het aanpassen van een PHP-Nuke theme:
de achtergrond kleur was gedefinieerd in het "global" gedeelte en werd gebruikt in de header functie
PHP:
1
2
3
4
5
6
7
8
$bgcolor = "#FF0000";  //oftewel rood

function theme_header(){
global $bgcolor;
...
echo "<td bgcolor=\"$bgcolor\">";   // in de HTML komt: <td bgcolor="">
...
}


Dat kan eraan liggen dat het includen van een file binnen een functie variabelen volledig buiten scope zet; ze zijn nooit te benaderen tenzij je superglobals gebruikt.

Acties:
  • 0 Henk 'm!

Verwijderd

Ja, dit gaat natuurlijk nooit goed
PHP:
1
2
if ($error != "") return $error;
    else return "Good";


-> als er een error is geef de error terug.
en vervolgens compleet ongerelateerd aan de regel:
-> anders geef goed terug
je kan geen else gebruiken zonder if, of met andere woorden: haal de ";" na $error weg!!!

en wat bedoel je met $_GET['error3']?

probeer eens de debug regel echo($error3);

je if regel geeft aan dat hij $_GET['error3'] moet weergeven als $error NIET GELIJK aan "error3" is, dat hoort vast niet.

[ Voor 60% gewijzigd door Verwijderd op 27-03-2005 17:22 ]


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
Verwijderd schreef op zondag 27 maart 2005 @ 17:16:
Ja, dit gaat natuurlijk nooit goed
PHP:
1
2
if ($error != "") return $error;
    else return "Good";


-> als er een error is geef de error terug.
en vervolgens compleet ongerelateerd aan de regel:
-> anders geef goed terug
je kan geen else gebruiken zonder if, of met andere woorden: haal de ";" na $error weg!!!

en wat bedoel je met $_GET['error3']?
Neenee, zijn if-else statement is wel degelijk correct! Die puntkomma heeft namelijk betrekking op de return-functie en niet op het if-statement. Denk dat jij zelf even de PHP syntax nader moet bestuderen.

Heb nog een klein syntax foutje gevonden:
PHP:
1
if ($FEFullName == "") $error="Error1";;

Dubbele aanhalingstekens lijken me niet de bedoeling.

[ Voor 12% gewijzigd door HyperioN op 27-03-2005 17:23 ]


Acties:
  • 0 Henk 'm!

  • PipoDeClown
  • Registratie: September 2000
  • Niet online

PipoDeClown

Izze Zimpell

PHP:
1
2
3
4
$var1 = ""; // i.p.v. $var = 0;

// en verderop
$user = (isset($_GET['user'])) ? $_GET['user'] : "";

[ Voor 131% gewijzigd door PipoDeClown op 27-03-2005 20:18 ]

God weet alles, want hij is lid van de Mosad. To protect your freedom i will take that away from you. Mijn drankgebruik heeft ernstig te lijden onder mijn gezondheid.


Acties:
  • 0 Henk 'm!

Verwijderd

Eep, het is sowieso een ranzige constructie, ik gebruik zelf onder alle condities {}.
dubbele ;; moet eigelijk geen problemen veroorzaken: een leeg statement of geen statement maakt effectief vrij weinig uit.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou die code maar helemaal opnieuw opzetten. Wat een zooi.

Als je een paar regels achter elkaar hebt die allemaal op elkaar lijken, dan moet je je afvragen of je niet iets met een array en een loopje had kunnen doen.

Acties:
  • 0 Henk 'm!

  • Mask
  • Registratie: September 2001
  • Laatst online: 06-07-2020
Sorry, heb een beetje teveel geknoeid met de code en ben bezig het een beetje op te ruimen :) Lekkere puinzooi nu :P Daarom wilde ik eerst ook niet posten in het forum.. Teveel zooi in mijn code..

Maar goed, wat ik bedoelde met $_GET['error3'] of daarvoor $GLOBALS['error3'] was dat ik gewoon wilde kijken of ik de waarde van $error3 (die set was in checkentry) terug kon krijgen.. Ik vulde namelijk gewoon datzelfde veld iedere keer niet in..

Dat had ik even uit moeten leggen.. Wordt er niet vroeger op hier..

En overigens over de else return "Goed", dat had ik eerst ook niet.. Ik had gewoon "return $error" gedaan, tot ik niet snapte waarom ik op een of andere manier nog steeds de waarde had die ik in de start van de code had ingesteld. Terwijl ik tijdens de print functie WEL gewoon bij alle waarden kon komen die ik had ingesteld onder de setlang functie..

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

HyperioN. schreef op zondag 27 maart 2005 @ 17:21:
[...]
Dubbele aanhalingstekens lijken me niet de bedoeling.
Maar zal verder ook niets uitmaken ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Maar goed, wat ik bedoelde met $_GET['error3'] of daarvoor $GLOBALS['error3'] was dat ik gewoon wilde kijken of ik de waarde van $error3 (die set was in checkentry) terug kon krijgen.. Ik vulde namelijk gewoon datzelfde veld iedere keer niet in..
Uhm.... het kan zijn dat PHP hier ook weer een of andere ranzige constructie heeft, maar $_GET is de array met HTTP-GET variabelen, die hebben niets te maken met de PHP-GLOBAL variabelen!

e if regel onderaan in de code geeft aan dat hij $_GET['error3'] moet weergeven als $error NIET GELIJK aan "error3" is, dat hoort vast niet.

[ Voor 17% gewijzigd door Verwijderd op 27-03-2005 17:29 ]


Acties:
  • 0 Henk 'm!

  • Mask
  • Registratie: September 2001
  • Laatst online: 06-07-2020
Reden daarvan was weer dat $error3 me de juiste waarden niet terug gaf.. En reden DAARVAN is weer dat $error zelf niet te pakken te krijgen was (ook al had ik hem toen als global gedefinieerd) vanaf de globale code.. Na zoveel gekloot dacht ik dus: algemene vraag op het forum stellen over het printen in de globale code van variabelen geset in een functie.. Maar aangezien daar het probleem niet leek te zitten, toch mijn ranzige (geef het toe) code maar gepost..

Acties:
  • 0 Henk 'm!

Verwijderd

Ah, nu begrijp ik het probleem.

Je kan twee dingen doen:
1) Je zet global $error; in je functie (onder de regel function entrycheck(...){)
2) Je zet $error=entrycheck(....) onderaan bij de functieaanroep.

Je hebt namelijk effectief twee variabelen die allebei $error heten; een globale die je bovenaan en onderaan in je code gebruikt, en een locale die je binnen de functie entrycheck gebruikt.

[ Voor 46% gewijzigd door Verwijderd op 27-03-2005 17:38 ]


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
$action moet ook vervangen worden door $_GET["action"] als ik je code goed implementeer.

Acties:
  • 0 Henk 'm!

  • Mask
  • Registratie: September 2001
  • Laatst online: 06-07-2020
Heb de code effe opgeschoond (voor zover mogelijk :P) en heb $error nu als global ingesteld in de functie (had ik eerder ook). Toch, als ik in de functie zelf echo($error3) probeer, is ie leeg. Daardoor krijg ik ook nooit de juiste waarden terug in mijn globale aanroep denk ik..

Zal er morgen nog effe wat meer mee prutsen maar morgenochtend vroeg weer op (tis hier middernacht nu) dus geef morgen het resultaat nog even.

Het ligt ONGETWIJFELD aan mijn slechte coding stijl :) Ben errrrrrg roestig in mijn coding.. Moet het echt weer es oppikken..

Bedankt voor alle suggesties in elk geval en zal ze morgen voor zekerheid nog es 3x nalopen!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zoals ik hierboven al gezegd heb: globals lijken me hier volstrekt overbodig. Ga asjeblieft werken met variabelen die je via parameters doorgeeft, dat maakt je code veel onderhoudbaarder, en dan heb je dit hele probleem ook niet meer.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1