[PHP] (globale) variabelen opvragen als array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Weet iemand of PHP de mogelijkheid biedt om een array met de namen van alle variabelen die op de pagina bestaan/geregistreerd zijn op te vragen?

Ik wil namelijk bij het verzenden van een formulier dynamisch de namen van de formulier-elementen kunnen achterhalen, zodat ik deze kan gebruiken om de bijbehorende POST-variabelen te bereiken.

Voorbeeld:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?php

//De (globaal) geregistreerde variabelen
$var1 = blaat;
$var2 = blaat;

//Vraag de naam van $var2 op
echo($ArrayMetDeNamenVanAlleGeregistreerdeVariabelen[1]);

//Output
var2
?>

Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
De variablen krijg je toch terug in de array POST, dus die kan je toch doorlopen met foreach()?

PHP:
1
2
3
4
<?php
foreach ($_POST as $key => $waarde)
        echo "Veld $key heeft als waarde $waarde<br>";
?>

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • twixx
  • Registratie: April 2000
  • Niet online
En met $_SESSION en $_GET enz.

Ik denk eerder dat de topicstarter bedoelt dat hij ook wil zien welke variabelen hij zelf in het script gedeclareerd heeft.

9x Canadian Solar + Enphase IQ7+ 3,4 kWp ZZW 20º
4x Yingli + Enphase IQ7 1 kWp ZZW 25º
4x Yingli + Enphase IQ7 1 kWp ZZW 90º


Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Die variablen kan hij toch zelf in een array zetten?

PHP:
1
2
3
4
<?php
$variables['foo'] = 'bar';
$variables['bar'] = 'foo';
?>

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Inderdaad, het gaat mij erom om de namen van de geregistreerde variabelen te kunnen achterhalen via een array, zeg maar een soort van geavanceerde isset()-functie, zodat ik dus niet alleen kan zien óf een variabele geregistreerd is, maar ook onder welke naam.

Zeg maar zoiets als: isset[0] //geeft dan de naam van de eerst geregistreerde variabele.

Dit is zeg maar wat ik nu gebruik om de elementen uit een formulier als sessie-vars te registreren, ik geef nu via een GET door welke elementen globaal geregistreerd moeten worden en hoeveel elementen het formulier telt:

-> de action van het formulier is: register_globals.php?sVars[0]=txtPersonalID&sVars[1]=txtPersonalPassword&iArrayLength=1&sPage=result_page

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

//Registreer de sessie-array waar de globale variabelen in opgeslagen gaan worden
session_register("sSessionArray");

for ($i = 0; $i <= $iArrayLength; $i++)
{
    //Vul de inmiddels globale sessie-array met de waarden uit het formulier
    $sSessionArray[$sVars[$i]] = $$sVars[$i];
}

//Schakel door naar de pagina die doorgeven is via de url
header("Location: ../docs/" . $sPage . ".php");
?>

NOOT: De post-vars zijn automatisch globaal


De resultaat pagina (result_page.php):

PHP:
1
2
3
4
5
6
7
<?php

session_start();

echo($sSessionArray["txtPersonalID"]);
echo($sSessionArray["txtPersonalPassword"]);
?>


Het nadeel hiervan vind ik, dat ik nu iedere keer via de url door moet geven wat er geregistreerd moet worden i.p.v. dat het script zelf de POST variabelen 'ziet' en ze daarna automatisch als sessie-vars registreert.

Acties:
  • 0 Henk 'm!

Verwijderd

Euh, is get_defined_vars misschien wat je zoekt? Krijg je een array terug met alle geregistreerde variabelen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
b = array(1,1,2,3,5,8);

$arr = get_defined_vars();

// print $b
print_r($arr["b"]);

Met deze functie kan ik nog niet dynamisch de geregistreerde variabelen achterhalen, je kan via deze functie immers alleen de waarde van $b opvragen en niet de naam...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat ik dus bedoel is dat ik de naam 'b' te weten wil komen via een voorgedefinieerde array;

$de_array[0] moet dan 'b' teruggeven

Vervolgens kan ik dan de waarde van $b uitlezen door: $b = $_POST[$de_array[0]]

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

werken met superglobals zou het toch een stuk eenvoudiger maken, en ranzige constructies als $$sVars[$i]; totaal overbodig maken. Daarbij: gebruik nooit GET vars in je action in een POST form; sommige browsers geven dan nl de GET vars niet door!

verder hoef je niets als array op te vragen $_POST is al een array net als $_SESSION (zie de 1e reply)

[ Voor 24% gewijzigd door crisp op 23-08-2003 01:12 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oww fuk...

dingstje Euhm... Tja... had helemaal gelijk, dat foreach werkt perfect! Hartelijk bedankt nog!

Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Verwijderd schreef op 23 August 2003 @ 01:37:
Oww fuk...

dingstje Euhm... Tja... had helemaal gelijk, dat foreach werkt perfect! Hartelijk bedankt nog!
Hartelijk graag gedaan :-) [/nutteloze post]

[ Voor 4% gewijzigd door dingstje op 23-08-2003 01:41 ]

If you can't beat them, try harder


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
crisp schreef op 23 August 2003 @ 01:09:
werken met superglobals zou het toch een stuk eenvoudiger maken, en ranzige constructies als $$sVars[$i]; totaal overbodig maken. Daarbij: gebruik nooit GET vars in je action in een POST form; sommige browsers geven dan nl de GET vars niet door!

verder hoef je niets als array op te vragen $_POST is al een array net als $_SESSION (zie de 1e reply)
Weet je toevallig welke browsers dat zijn? Ik ben het nog nooit tegen gekomen, namelijk...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
schop.... crisp?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

even gezocht:

http://codewalkers.com/fo...side&id=105&realm=default
http://mail.zope.org/pipe.../2003-January/001614.html

er wordt geen expliciete browser/versie genoemd; ik meen dat dit probleem speelde met IE5 op de Mac, maar het is erg lastig zoeken met zulke steekwoorden.
Het komt er op neer dat sommige browsers bij een form submit de URL in de action opnieuw opbouwen, en bij een POST dus feitelijk de GET variabelen er af halen.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Hmz, dat is nogal vervelend, maar zolang ik geen bugreports ervan krijg, ga ik het nog niet veranderen.

Dat is nogal een lading werk :/

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Grijze Vos schreef op 25 augustus 2003 @ 12:45:
Hmz, dat is nogal vervelend, maar zolang ik geen bugreports ervan krijg, ga ik het nog niet veranderen.

Dat is nogal een lading werk :/
Het zullen ook wel geen recente browsers zijn lijkt me ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
Ik heb ook al mijn scripts vol staan met combinaties tussen beide. Meestal geef ik als GET variable de action variable mee, zodat het duidelijk is wat er gebeurt, bijvoorbeeld het opslaan van een formulier. Alle waarde stuur ik gewoon via POST.

Het is ook een beetje uit luiheid, nu kan ik gewoon switch(addslashes($_GET['action'])) doen, anders moet ik eerst testen wat het is ;)

[ Voor 3% gewijzigd door djluc op 25-08-2003 14:41 ]


Acties:
  • 0 Henk 'm!

Verwijderd

djluc schreef op 25 augustus 2003 @ 13:45:
Ik heb ook al mijn scripts vol staan met combinaties tussen beide. Meestal geef ik als GET variable de action variable mee, zodat het duidelijk is wat er gebeurt, bijvoorbeeld het opslaan van een formulier. Alle waarde stuur ik gewoon via POST.

Het is ook een beetje uit luiheid, nu kan ik gewoon switch(addslashes($_GET['action'])) doen, anders moet ik eerst etsten wat het is ;)
waarom een addslashes in je switch?

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
Verwijderd schreef op 25 August 2003 @ 14:06:
waarom een addslashes in je switch?
Goede vraag, het heeft niet echt nut. Ik gebruik toch geen ' o.i.d. in mijn actions. O+

Acties:
  • 0 Henk 'm!

Verwijderd

djluc schreef op 25 August 2003 @ 14:41:
[...]

Goede vraag, het heeft niet echt nut. Ik gebruik toch geen ' o.i.d. in mijn actions. O+
daarnaast.... al zou je het doen, dan gaat de match van de switch waarschijnlijk niet goed (niet gechecked hoor, maar is maar een ingeving)

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
Als je toch case "foto\'s" zou doen heb je misschien nog wel kans, eventueel eerst een urlencode er overheen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Om nog even terug te komen op mijn vorige post; ik heb mijn script nu gedeeltelijk werkend gekregen, alleen zit ik met het probleem dat de variabele van het eerste veld (txtPersonalID) steeds gevuld wordt met de waarde van het 'hidden-veld' (hidPage). Dit probleem kon ik zelf niet oplossen, dus ik hoop dat jullie even willen kijken wat het probleem is...

Formulier:
HTML:
1
2
3
4
5
6
7
8
9
10
11
<form action="../scripts/register_globals.php" method="post" name="frmPersonalInfo" id="frmPersonalInfo">
    <input name="txtPersonalID" type="text" id="txtPersonalID">
    <input name="txtPersonalPassword" type="text" id="txtPersonalPassword">
    <input name="txtPersonalName" type="text" id="txtPersonalName">
    <input name="txtPersonalAddress" type="text" id="txtPersonalAddress">
    <input name="txtPersonalPostcode" type="text" id="txtPersonalPostcode">
    <input name="txtPersonalCity" type="text" id="txtAffiliateCity">
    <input name="txtPersonalEmail" type="text" id="txtPersonalEmail">
    <input name="txtPersonalDomain" type="text" id="txtPersonalDomain"> 
    <input name="hidPage" type="hidden" id="hidPage" value="test_page.php">
</form>


PHP-script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

foreach ($_POST as $sFormElementName => $sFormElementValue) 
{
    //Zorg dat buttons en verborgen velden worden genegeerd
    if (! (strpos($sFormElementName, "hid") > -1) and ! (strpos($sFormElementName, "cmd") > -1))
    {
        //Registreer het formulier-element als een sessie-var
        session_register($sFormElementName);
        
        //Vul de sessie variabele met de bijbehorende waarde
        $_GLOBALS[$sFormElementName] = $sFormElementValue;
    }
} 

//Schakel door naar de pagina die doorgeven is via een verborgen veld
header("Location: ../docs/" . $hidPage);
?>


Output-pagina:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

session_start();

echo("$txtPersonalID<br>");
echo("$txtPersonalPassword<br>");
echo("$txtPersonalName<br>");
echo("$txtPersonalAddress<br>");
echo("$txtPersonalPostcode<br>");
echo("$txtPersonalCity<br>");
echo("$txtPersonalEmail<br>");
echo("$txtPersonalDomain<br>");
?>


De output bij respectievelijk (1, 2, 3, 4, 5, 6, 7, 8 ):

test_page.php //I.p.v. van 1 wordt hier de waarde van het 'hidden-veld' gepakt :?
2
3
4
5
6
7
8

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
Waarom gebruik je session_register, daar hebben we tegenwoordig $_SESSION voor. Verder heel snel die variablen tussen die quotes uit:
PHP:
1
echo $txtPersonalID.'<br>';


edit: moet je ook geen session_start() in je 2de stuk code hebben? Of ging dat automatisch als je session_register gebruikt? Is al lang geleden dat ik die functie gebruikt heb dus zou het niet meer weten.

[ Voor 41% gewijzigd door djluc op 25-08-2003 16:53 ]


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 18-09 13:29
Misschien dat die gegevens die je weergeeft nog in je sessie zitten?
Probeer eens
PHP:
1
$GLOBALS[$sFormElementName] = $sFormElementValue;

Let op de underscore!
Edit:
Je kan idd veel beter $_SESSION gebruiken en de variabelen helemaal niet in je global-scope neerzetten.

Verder gaat dit:
PHP:
1
! (strpos($sFormElementName, "hid") > -1)

niet goed als 'hid' later in de string voorkomt (misschien wil je ooit een 'machid' veld gebruiken :)). Beter is
PHP:
1
(strpos($sFormElementName, "hid") !== 0)

[ Voor 58% gewijzigd door Sjaaky op 25-08-2003 17:24 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
Doe anders even $_SESSION=array() zodat je sessie leeg is.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja het werk! :D

Nu ik:
PHP:
1
2
//Registreer het formulier-element als een sessie-var en vul het met de bijbehorende waarde
$_SESSION[$sFormElementName] = $sFormElementValue;

gebruikt werkt het wel... wel vaag eigenlijk :?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oja en nog bedankt hè!!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met $_SESSION werkt het eindelijk wél! Hartelijk bedankt voor julie hulp!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
heheh vaag had niet gezien dat mijn posts op pag 2 werden gezet... dus vandaar... :)
Pagina: 1