人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPを勉強中です。 あるサンプルプログラムの事でわからないことがあり、教えてください。
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に登場させることはできるのでしょうか。
サンプルまで書いていただければベストアンサ?はもちろん、高ポイントを差し上げます。

●質問者: mocchi
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ヨネちゃん

hoge.phpには、
require( dirname( __FILE__ ) . '/config.php' );
とあるのですよね?
config.php の中に bobubobu.php は無いのですよね?

なぜ bobubobu.php が動作していると思われたのか分かりませんが、
そもそも bobubobu.php は動作しているのでしょうか?
また bobubobu.php が動作していると思った経緯を教えていただければ何か分かるかも知れません。


2 ● rouge_2008
ベストアンサー

「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()」の処理を追加してあります。(環境によっては問題が発生する場合がある事に注意してください。)


mocchiさんのコメント
ありがとうございました! ばっちり思ったような形になりました。感謝です!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ