Posted by redboxhosting on January 5, 2017 at 6:28am
お世話になります。
Drupal7xにてNode内でPHPを利用しているのですが、独自につくった関数内からグローバル変数にアクセスする際にはどのようにしたらよろしいでしょうか。
関数の中で以下の様にGlobalと宣言しても、$a $bが空になりうまく効いていないように見受けられます。
NODE外で直接PHPを置いた場合期待した動作になりますので、おそらくDrupalのNodeの何かが原因ではないかと推測しています。
例:
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
宜しくお願い致します。
Comments
node内にphpを書いた場合、最終的には eval()
node内にphpを書いた場合、最終的には
eval()を通して実行されるので、スコープはそのeval内に閉じられて $a, $bはグローバル扱いにならないような気がします。以下のような感じでそれっぽい動きになるかと思います。
variable_setしたデータはDBに入るので、↓の例の場合は a,bの初期化は一度だけ実行されます。グローバル変数にした場合とちょっと動きが違うと思いますので、そのあたりはアレンジしてください。
<?php
if (is_null(variable_get('a', NULL)) {
variable_set('a', 1);
}
if (is_null(variable_get('b', NULL)) {
variable_set('b', 2);
}
function Sum()
{
$a = variable_get('a');
$b = variable_get('b');
variable_set('b', $a + $b);
}
Sum();
?>
早速アドバイス有り難うございます。 やはりグローバル扱いに
早速アドバイス有り難うございます。
やはりグローバル扱いにはならないのですね。
教えて頂きましたvariable_setを利用してみましたが、3行目の variable_set('a', 1);で
Evalエラーとなってしまいました。
念のため以下の様なコードで試しましたがやはりsetする時点で動作しないようです。。
<?php
global $conf;
$var = "1";
variable_set('var1', $var);
print_r variable_get('var1');
?>
また、variable_setしたデータはDB内に格納されるとおもうのですが、
このNodeは異なるユーザーがアクセスするため、変数内はユーザー毎に異なっている必要があります。その場合、変数名をユニークにするか毎回variable_delするなどで代用する必要があるのでしょうか。
例:
ユーザー1 変数 $a = 1
ユーザー2 変数 $a = 2
宜しくお願い致します。
あ、2箇所、閉じカッコが足りませんでした、申し訳ない。。
あ、2箇所、閉じカッコが足りませんでした、申し訳ない。。
<?php
if (is_null(variable_get('a', NULL))) {
variable_set('a', 1);
}
if (is_null(variable_get('b', NULL))) {
variable_set('b', 2);
}
function Sum()
{
$a = variable_get('a');
$b = variable_get('b');
variable_set('b', $a + $b);
return $b;
}
echo Sum();
?>
でどうでしょう?
はい、そうですね。
認証済みユーザーだけであれば
<?phpglobal $user;
$user->uid;
?>
でユーザーIDがとれますので、variable_setする時のキーを
<?phpglobal $user;
variable_set("{$user->uid}_a", 1);
?>
のようにすればユーザー毎に分離できます。
anoymousユーザーの場合は、
$user->uidは0が返ってくるので、session IDをキーにするなどの考慮が必要かもしれません。ありがとうございます。
ありがとうございます。
試しにコードを記載したところページリロードするたびに1つづ増えていっているので
正常に値が保存され読み込まれているようです。
またユーザーについても有り難うございます。現状は認証ユーザーのみ対象とするので
$user->uidでUIDを拾って変数をユニークにして対応するようにします。