htmlファイルの入力フォ-ムに1つのテキストエリアがありまして、
<form action="./hoge.php" method="POST">によりそのテキストエリアの値(name=abc)がhoge.phpに渡されます。
hoge.phpには、
require( dirname( __FILE__ ) . '/config.php' );
~中略~
$abc = $_POST['abc'];
$command = $php_path . ' ' . $script_path . ' ' . $abc . ' >/dev/null 2>&1 &';
exec( $command );
となっており、値abcを$abcとして読み込んでいます。ここまではわかるのですが、別のファイル(bobubobu.php)にも$abcは登場するのです。
どうやって違うファイルであるbobubobu.phpにも$abcを読み込んでいるのでしょう。
includeやrequireの類は一切使っていないのです。ス-パ-グロ-バル変数とかでもないのです。
bobubobu.php内の臭そうな部分は、
$abc = $argv[1];
だけなのです(唐突に$abcが現れます)。
全くわからず困っております。
また、最初の入力フォ-ムにテキストフォ-ムがもう一つあったとして(name=efg)、このefgもhoge.phpを経由してbobubobu.phpに登場させることはできるのでしょうか。
サンプルまで書いていただければベストアンサ-はもちろん、高ポイントを差し上げます。
「hoge.php」の以下の部分でコマンドとして実行しているようですので、定義済みの変数である$argvを使っているのではないかと思います。
$abc = $_POST['abc']; $command = $php_path . ' ' . $script_path . ' ' . $abc . ' >/dev/null 2>&1 &'; exec( $command );
・$argv PHP マニュアル 言語リファレンス 定義済の変数
http://php.net/manual/ja/reserved.variables.argv.php
コマンドラインから実行したときに、 現在のスクリプトに渡されたすべての引数の配列が含まれます。
注意: 最初の引数 $argv[0] は常に、スクリプトの実行に使う名前となります。
※「$argv の例」の入力および出力例を確認してもらえると分かりますが、引数として指定した順番で$argvに代入される点に注意してください。
新しく「name="efg"」の項目を追加して使用したい場合は、$abcと同じように実行するコマンドに引数として渡して、「bobubobu.php」の側では受け取った値の処理を追加すれば利用できるようになると思います。
・hoge.php
$abc = $_POST['abc']; $efg = $_POST['efg']; $hij = $_POST['hij']; $kln = $_POST['kln']; $command = $php_path . ' ' . $script_path . ' ' . escapeshellarg($abc) . ' ' . escapeshellarg($efg) . ' ' . escapeshellarg($hij) . ' ' . escapeshellarg($kln) . ' >/dev/null 2>&1 &'; /* * 次のように書くと引数に一つずつ指定する必要がないので面倒が減ります。 $args = array($_POST['abc'], $_POST['efg'], $_POST['hij'], $_POST['kln']); /* 他にも追加したい項目があればここに追記します。 */ $paramarr = array_map("escapeshellarg", $args); $paramstr = implode(' ', $paramarr); $command = $php_path . ' ' . $script_path . ' ' . $paramstr . ' >/dev/null 2>&1 &'; */ exec( $command );
・bobubobu.php
$abc = $argv[1]; $efg = $argv[2]; $hij = $argv[3]; $kln = $argv[4];
※ほぼコメントのままですが、TransFreeBSDさんから指摘のあった件で「escapeshellarg()」の処理を追加してあります。(環境によっては問題が発生する場合がある事に注意してください。)
hoge.phpには、
require( dirname( __FILE__ ) . '/config.php' );
とあるのですよね?
config.php の中に bobubobu.php は無いのですよね?
なぜ bobubobu.php が動作していると思われたのか分かりませんが、
そもそも bobubobu.php は動作しているのでしょうか?
また bobubobu.php が動作していると思った経緯を教えていただければ何か分かるかも知れません。
「hoge.php」の以下の部分でコマンドとして実行しているようですので、定義済みの変数である$argvを使っているのではないかと思います。
$abc = $_POST['abc']; $command = $php_path . ' ' . $script_path . ' ' . $abc . ' >/dev/null 2>&1 &'; exec( $command );
・$argv PHP マニュアル 言語リファレンス 定義済の変数
http://php.net/manual/ja/reserved.variables.argv.php
コマンドラインから実行したときに、 現在のスクリプトに渡されたすべての引数の配列が含まれます。
注意: 最初の引数 $argv[0] は常に、スクリプトの実行に使う名前となります。
※「$argv の例」の入力および出力例を確認してもらえると分かりますが、引数として指定した順番で$argvに代入される点に注意してください。
新しく「name="efg"」の項目を追加して使用したい場合は、$abcと同じように実行するコマンドに引数として渡して、「bobubobu.php」の側では受け取った値の処理を追加すれば利用できるようになると思います。
・hoge.php
$abc = $_POST['abc']; $efg = $_POST['efg']; $hij = $_POST['hij']; $kln = $_POST['kln']; $command = $php_path . ' ' . $script_path . ' ' . escapeshellarg($abc) . ' ' . escapeshellarg($efg) . ' ' . escapeshellarg($hij) . ' ' . escapeshellarg($kln) . ' >/dev/null 2>&1 &'; /* * 次のように書くと引数に一つずつ指定する必要がないので面倒が減ります。 $args = array($_POST['abc'], $_POST['efg'], $_POST['hij'], $_POST['kln']); /* 他にも追加したい項目があればここに追記します。 */ $paramarr = array_map("escapeshellarg", $args); $paramstr = implode(' ', $paramarr); $command = $php_path . ' ' . $script_path . ' ' . $paramstr . ' >/dev/null 2>&1 &'; */ exec( $command );
・bobubobu.php
$abc = $argv[1]; $efg = $argv[2]; $hij = $argv[3]; $kln = $argv[4];
※ほぼコメントのままですが、TransFreeBSDさんから指摘のあった件で「escapeshellarg()」の処理を追加してあります。(環境によっては問題が発生する場合がある事に注意してください。)
ありがとうございました!
ばっちり思ったような形になりました。感謝です!
ありがとうございました!
2014/11/14 12:28:57ばっちり思ったような形になりました。感謝です!