[PHP] scope variabele

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
OK, kleine intro: ik ben bezig met een eigen statistieken-module. dat hebben een miljoen mensen voor mij ook al gedaan, maar ik wil alles graag op mijn manier doen en zo leer ik er ook nog eens behoorlijk veel van.

Allerlei struikelblokken overwonnen, maar nu heb ik dus een aantal tabellen waar allerlei informatie in moet komen en al gauw kwam ik erachter dat het insert'en van verschillende info wel met een enkele functie zou moeten kunnen, namelijk zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function insert_platform() {
  // bepaal $platform..
  $platform = "Windows";
  insert_db("LOG_PLATFORMS", "platform");
}

function insert_db($log_table, $column) {
  global $$column;
  $value = $$column;
  $query = "INSERT INTO $log_table ($column) VALUES ('$value')";
  $result = mysql_query($query) or die(display_error($query));
}

geeft Notice: Undefined variable: platform in .. on line ..

De scope van $platform maar vast in de 1e functie vastleggen werkt niet.

Als $platform niet uit een functie komt, maar gewoon
PHP:
1
2
3
4
5
6
7
8
9
10
// bepaal $platform..
$platform = "Windows";
insert_db("LOG_PLATFORMS", "platform");

function insert_db($log_table, $column) {
  global $$column;
  $value = $$column;
  $query = "INSERT INTO $log_table ($column) VALUES ('$value')";
  $result = mysql_query($query) or die(display_error($query));
}

dan gaat het (natuurlijk) wel goed.

Dus hoe verkrijg ik nu de inhoud van $platform van de ene in de andere functie?

--------
Later wil ik ook nog meerdere variabelen mee kunnen geven, dus bijvoorbeeld insert_db("LOG_BROWSERS", "browser+version") en dat-ie dan daar zelf even $browser en $version van maakt en de juiste waarden invult, maar ik loop alweer op de zaken vooruit en dat gaat me zelf ook wel lukken..

Acties:
  • 0 Henk 'm!

  • vogeltje
  • Registratie: December 2001
  • Laatst online: 10-08 19:30
wat voert PHP standaard uit? Call-by-Value of Call-by-Reference? Anders kan je daar eens mee gaan spelen.

trouwens, je geeft nou niet de variable $platform mee, maar de string "platform" :?

[ Voor 30% gewijzigd door vogeltje op 22-01-2004 18:44 ]

binnenkort een hele dikke casemod :P


Acties:
  • 0 Henk 'm!

Verwijderd

insert_db herschrijven naar insert_db($log_table, $column,$var) en aanroepen met insert_db("LOG_PLATFORMS", "platform",$platform) lijkt mij het meest logische als deze code zo niet werkt. Dan moet je van $value natuurlijk wel dit maken: $value = $var;

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
function insert_platform() { 
  // bepaal $platform.. 
  $platform = "Windows"; 
  insert_db("LOG_PLATFORMS", "$platform"); 
}


Dus "platform" vervangen door "$platform"?

edit:

nvm: had de dubbele $$ niet gezien O-)

[ Voor 26% gewijzigd door Verwijderd op 22-01-2004 18:45 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:52

crisp

Devver

Pixelated

waarom werk je niet met een array dan; variabele variabelen zijn wel erg ranzig namelijk:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function insert_platform() { 
  // bepaal data 
  $data = array('platform' => 'Windows');
  insert_db('LOG_PLATFORMS', $data); 
} 

function insert_db($log_table, $data) {

  foreach ($data as $column => $value) {
    $query = "INSERT INTO $log_table ($column) VALUES ('$value')"; 
    $result = mysql_query($query) or die(display_error($query)); 
  }

}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
bedankt voor alle snelle reply's.. crisp's oplossing lijkt me de meest mooie en logische oplossing, ook al gezien mijn 'onderschriftje'. ik ga d'r even mee prutsen en laat het zo wel weten..

Acties:
  • 0 Henk 'm!

Verwijderd

die andere manier kan ook natuurlijk, maar dan moet het zo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
function insert_platform() {
  global $platform; //even globaal maken
  // bepaal $platform..
  $platform = "Windows";
  insert_db("LOG_PLATFORMS", "platform");
}

function insert_db($log_table, $column) {
  global $$column;
  $value = $$column;
  $query = "INSERT INTO $log_table ($column) VALUES ('$value')";
  $result = mysql_query($query) or die(display_error($query));
}
?> 

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
X-Lars schreef op 22 januari 2004 @ 18:37:
De scope van $platform maar vast in de 1e functie vastleggen werkt niet.
Dat werkte dus niet.. meerdere kolommetjes vullen gaat nu makkelijk zo (met de oplossing van crisp):
PHP:
1
2
$data = array('browser' => $browser, 'version' => $version); 
insert_db("LOG_BROWSERS", $data);

Zat alleen te denken dat het misschien teveel queries gaat kosten (elke variabele kost een aparte query zo. Ik ga proberen er 1 query van te maken.

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
PHP:
1
2
3
4
5
6
function insert_db($log_table, $data) {
    $columns = implode(", ", array_keys($data));
    $values = implode("', '", array_values($data));
    $query = "INSERT INTO $log_table ($columns) VALUES ('$values')";
    $result = mysql_query($query) or die(display_error($query));
}


:Y)

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
PHP:
1
2
  global $$column;
  $value = $$column;

Zeker weten dat het de bedoeling is om met variabele variabele te werken?

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
@PrisonerOfPain: ja :) ik ben er ondertussen al uit. maar wat die '$$' betreft: zo kon ik makkelijk de column 'platform' en de variable $platform in 1x doorgeven. tenminste, als-ie echt 'global' zou worden..

Acties:
  • 0 Henk 'm!

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
[muggenziftmodus]
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?

function insert_db($log_table, $data) { 

  foreach ($data as $column => $value) { 
    $query = "INSERT INTO " . $log_table . " (" . $column . ") VALUES ('" . $value . "')"; 
    $result = mysql_query($query) or die(display_error($query)); 
  } 

}
?>
Wel ff escapen nog ajb.[/muggenziftmodus]

[ Voor 31% gewijzigd door flashin op 22-01-2004 19:56 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
ok flashin _/-\o_ edit: je quote overigens wel de 'verkeerde' code :+

was toch ook best blij dat ik er zelf uit kwam.. heb vaak soms duwtje in de juiste richting nodig O-)

[ Voor 23% gewijzigd door X-Lars op 22-01-2004 20:01 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
X-Lars schreef op 22 januari 2004 @ 19:53:
@PrisonerOfPain: ja :) ik ben er ondertussen al uit. maar wat die '$$' betreft: zo kon ik makkelijk de column 'platform' en de variable $platform in 1x doorgeven. tenminste, als-ie echt 'global' zou worden..
Oww maar global importeerd een variable in de functie, ipv andersom

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$a = 1;
function functie1() {
  global $a;
  $b = $a;
  if(isset($b)) echo "Met global is b gelijk aan a: ". $b; // $b = 1
  functie2();
}
function functie2() {
  global $b;
  if(!isset($b)) echo "<br />Ik vind dat global ook echt global moet zijn!"; // isset($b) = false
}
functie1();
?>

[ Voor 22% gewijzigd door X-Lars op 22-01-2004 21:59 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
verkeerde knopje 8)7

[ Voor 97% gewijzigd door X-Lars op 22-01-2004 21:59 ]

Pagina: 1