PHP System関数が動作しない原因と解決策

このQ&Aのポイント
  • PHP System関数を使用してあるphpファイルを実行するプログラムを作成したが、System関数でファイルが実行されない問題が発生している。ファイルの配置やパラメータの受け渡しに問題がある可能性がある。
  • sample_c.phpの中身は単純なSQL文で、単体での動作は確認済み。
  • System関数で変数を受け渡す場合、引数に変数を直接指定するか、$_SERVER['argv']を使用する方法があるが、どちらの方法でも正常に動作しない。原因が分からないため、解決策を知りたい。
回答を見る
  • ベストアンサー

PHP System関数が動作しません

サーバー上の、あるphpファイル(sample_c.php)をシステム関数を使用して実行する必要があり、以下の流れのプログラムを作成しました。 sample_a.php でSubmit sample_b.php でSystem関数でsample_c.phpを呼び出し sample_c.php で実行 です。 <? /* sample_a.php */ ?> <form action="sample_b.php" method="post"> <input type="hidden" name="login" value="sample_user"> <input type="hidden" name="action" value="trigger_b"> <input type="submit" value="submit"> </form> <? /* sample_a.php */ ?> <? if($_POST['action'] =="trigger_b") { $login = $_POST['login']; system("sample_c.php $login"); header('Location: sample_a.php?action=fin'); exit; } else { header('Location: sample_a.php?action=error'); exit; } ?> <? /* sample_c.php */ ?> $_SERVER['argv'] で受け取った値を処理 ----------------- 3つのファイルは全て同じ階層に配置してあります。 sample_a.phpでsubmitすると、sample_a.php?action=fin にリダイレクトするのですが、 sample_c.php内の動作が実行されていません。 中身はDB接続して、テーブルに保存する単純なsql文が入っていて、sample_c.php単体での動作は確認しています。 (単体テストの場合は$_SERVER['argv']の代わりに変数に値をセットして実行しています。) System関数で変数を受け渡さずに system("sample_c.php $login"); を system("sample_c.php") として実行してもうまくいきません。; 原因が分かるかたがいらっしゃれば教えてください。 お願いします。

  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

> system("sample_c.php $login"); これを > system("./sample_c.php $login"); にしてみてください。 system関数は、環境変数PATHに基づいて指定したコマンドに対応する実行ファイルの検索を行います。カレントディレクトリは通常PATHに含まれない為、system("sample_c.php");としても、カレントディレクトリ上の sample_c.php が実行されることはありません。 system("./sample_c.php")とすると、PATHは無視して、実行ファイルの場所を直接指定するという形になります。 これでも動かない場合は、sample_c.php が「実行ファイル」として動作できるようになっているかの確認をしてください。 HTTP経由でアクセスする場合、PHPファイルは単なるデータファイルにすぎませんが、 system関数で呼び出す場合は、PHPファイルに「実行ファイル」としての体裁を整える必要があります。 ・ファイルの属性(パーミッション)で、実行属性を付ける必要があります。 ・ファイルの1行目を「#!/usr/bin/php」のように、PHPの実行ファイル名を記述する必要があります。 以上の体裁の整えていない/整え方がわからないのでしたら、単純な解決方法としては、 system("php sample_c.php $login"); と、system関数に指定するコマンドとしては「php」を渡す、という方法があります。

changuri
質問者

お礼

ありがとうございます。 sample_c.phpの中身自体は私の作成したものではなく、変更もできるだけしたくなかったので、 system("php sample_c.php $login"); こちらの方法で実行することができました。 細かく説明していただき、助かりました。 より一層精進したいと思います。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>system("sample_c.php") まずは、system("ls")などして、system関数が利用できるかどうか 調べるところから始めてください。 system()が実行可能だとしてsample_c.phpはCLIで書かれていますか? またsample_c.phpにapache(もしくは他のhttpd)からの実行権限はついていますか?

関連するQ&A

  • 複数フォームについて

    こんばんは。 いま行き詰ってます(汗) 早速質問なんですが、三つのフォームを用意します。 <FORM method="POST" action=<?echo"xxx.php?1"?>> <INPUT type="submit" value="A" </FORM> <FORM method="POST" action=<?echo"xxx.php?2"?>> <INPUT type="submit" value="B" </FORM> <FORM method="POST" action=<?echo"xxx.php?3"?>> <INPUT type="submit" value="C" </FORM> 上記のHTMLを実行。 [A][B][C] Aを押すとxxx.php?1 Bを押すとxxx.php?2 Cを押すとxxx.php?2 と別々のアクションに行くはずだと思ったんですが.。 常にxxxx.php?1です(笑) これを、ABCそれぞれのボタンにアクションをつけたいんですが、 可能ですか?? ご教授お願い致します!!!

  • FORMで送信ボタンと戻るボタンを2つつけてそれぞれ遷移先を変えたい

       以下のような画面を作りたいのですが↓ -------------------------------------------------------------------------------- ● a.php (ユーザ情報入力画面) ※フォームに入力する画面    <FORM method="POST" action="b.php">   <INPUT type="text" name="mail">   <INPUT type="submit" name="submit" value="確認">  </FORM> ● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面  <FORM method="POST" action="c.php">   <!-- ここには、フォームに入力された値を表示する -->   <INPUT type="submit" name="submit" value="登録"> // c.php に遷移する   <INPUT type="submit" name="submit" value="戻る"> // a.php に戻る  </FORM> ● c.php (完了画面) -------------------------------------------------------------------------------- b.php について質問なのですが、 b.phpにおいて、登録ボタンと戻るボタンを2つつけて、 それぞれ遷移先を変えたいのですが、どうすればいいんでしょうか・・・? <FORM method="POST" action="c.php">と書いてしまうと、 戻るボタンを押しても戻らずに、c.phpに遷移してしまいますよね?? こういう場合ってJavaScriptとかで遷移先を指定するんですか・・? もしそうでしたら、JavaScriptがよくわからないので できればサンプルコード示していただけると助かります・・・。   

  • 配列を使って値を受け取る方法で困っています(PHP)

    こんにちは、よろしくお願い致します。 現在使用している環境が2つあります。 Win2000+Apache1.3+PHP4.2.3 RedHatLinux8.0+Apache1.3+PHP4.2.3 そのうちLinux環境の方では、配列がうまく使えません。 お手数ですが、具体的な結果は test.html、test.phpのソースと実行結果をご覧下さい。 両方の環境のApacheやPHPの設定ファイルをチェックしたのですが 特に怪しいところはなく、とても困ってます。 アドバイスお願い致します。 (test.html)-- <HTML><BODY> <form action=./test.php method=post> <input type=input name=a[0] value="1"> <input type=input name=b[0] value="12"> <input type=input name=c[0] value="123"> <input type=input name=d[0] value="1234"> <input type=input name=e[0] value="12345"> <input type=input name=f[0] value="123456"> <input type=submit name=submit value="OK"> </form> </BODY></HTML> ------------ (test.php)-- <?php print_r($HTTP_POST_VARS); ?> ------------ 【 Win環境の結果 】 Array ( [a] => Array ( [0] => 1 ) [b] => Array ( [0] => 12 ) [c] => Array ( [0] => 123 ) [d] => Array ( [0] => 1234 ) [e] => Array ( [0] => 12345 ) [f] => Array ( [0] => 123456 ) [submit] => OK ) 【 Linux環境の結果 】 Array ( [a] => Array ( [0] => 1 ) [b] => Array ( [0] => 12 ) [c] => Array ( [0] => 123 ) [d] => Array ( [0] => ) [e] => Array ( [0] => 5 ) [f] => Array ( [0] => 56 ) [submit] => OK )

    • ベストアンサー
    • PHP
  • PHP 引数の使い方

    PHPファイルどうしで引数を共有する方法を教えてください。 例えば、 「sample001.php」では、 <form action="sample002.php" method="post"> <input type="text" name="word" size="30"> <input type="submit" value="登録"> のタグによって文字列を入力し登録します。 「sample002.php」では、 $arr_word = $_POST["word"]; により、入力された文字列が“$arr_word”に格納されます。 「sample003.php」でも 入力された文字列を使いたい場合は、どうすればよいですか? “$arr_word” もしくは $_POST["word"] もしくは action="sample003.php"  を活用することでできるのでしょうか? PHPはまだまだ初心者です。教えてください。

    • ベストアンサー
    • PHP
  • htmlでsubmitで指定したActionファイルが実行されない

    A(a.htmlのこと)に  <form method="post" Action="b.hph">  <input で入力・・  <input type="submit" value="確認" /<>br /> と記述してデータを入力させ、 B(b.phpのこと)実行しようとすると、 ページが表示できません、のエラーになります。 OSはWindowXP サーバにAn HTTPdを実行し IEを実行して http://localhost/で実行しています その前に http://localhost/hello.php を実行してみましたが 正しく実行され、Helloと表示されます この様にPHPが実行できるのに Aの中に書いたB(b.php)はどうして 実行されないのでしょうか? 追加 http://localhost/b.php と実行すると Notice: Undefined variable: _post in C:\www\public_html\sample1\b.php on line 8 がでます。

    • ベストアンサー
    • PHP
  • PHP の自動で飛ぶ処理

    A.php ------------------------------------------------------------- ~省略~ print "<form action='./B.php' method='PSOT'>"; print "<input type='text' name='a_syori' value=''>"; print "<input type='submit' value='送信'>"; print "</form>"; -------------------------------------------------------------- B.php ~省略~ $b = $_POST['a_syori']; $b = $b * 2; -------------------------------------------------------------- B.phpでA.phpから送信された数値を2倍して すぐにまたA.phpに戻す という動作を行いたいのですが この場合、A.phpと同じ動作(formを作ってsubmitで送信)でしか A.phpには戻らないのでしょうか? 見た目ではB.phpでは表示させずにA.phpのみしか表示させたくありません。 今回はPHPで処理を行いたいと思っています。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで、C#のプログラムを実行するには、

    PHPで、C#のプログラムを実行するには、    example.php>> <form id="form" method="post" action="cpg.php"> <label> <input type="submit" name="button" id="button" value="C#実行" /> </label> </form> ↑ cpg.php にどういうソースを書けば、  C:\WinSockC(.sln←拡張子)のプログラムを実行することができますか?

    • ベストアンサー
    • PHP
  • PHPのデータの受け渡しとフレーム

    PHPを最近始めた者なのですが、 データの受け渡しについてわからないことがあります。 あるページのフォームで入力したデータをフレーム構造のページへ受け渡したとします。(データを入力したページをAとします) これはページAに設置されているフォームのソースです。 <form action="フレームページ.php" method="post"> <input name=(省略)> <input type='submit' value='submit'> </form> フレームページで表示されるページをB、Cとします。 目的はページAで入力したデータをページB、Cに反映させることなのですが、どうしても構造上問題があるのか反映されません。 たぶん受け渡したいデータがフレームページにいってしまい、ページBとCには届いていないと思うのですが、なんとかページB、Cに渡す方法はないでしょうか? フォームのactionをページB.phpと直接打てばデータが反映されることは確認しています。

    • ベストアンサー
    • PHP
  • 一つのformで、複数のaction指定

    レイアウトなどの関係で、formの配置が基本とは異なるものになってしまい、うまく動作させる方法が見つからず困っています。 現在は <form> <input type="checkbox" name="select[]" value="●●"> <input type="checkbox" name="select[]" value="●●"> <input type="checkbox" name="select[]" value="●●"> </form> …… <form method="POST" action="A.php"> <input type="submit" name="aa" value="あああ"> </form> <form method="POST" action="B.php"> <input type="submit" name="bb" value="いいい"> </form> <form method="POST" action="C.php"> <input type="submit" name="cc" value="ううう"> </form> <form method="POST" action="D.php"> <input type="submit" name="dd" value="えええ"> </form> のようになっていて、チェックボックスの値を送信したいのは、Dのボタンを押したときだけPOSTされるようにしたい状態です。 この値を取得する方法か、もしくは <form method="POST" action="(ボタンに応じたもの)"> <input type="checkbox" name="select[]" value="●●"> <input type="checkbox" name="select[]" value="●●"> <input type="checkbox" name="select[]" value="●●"> …… <input type="submit" name="aa" value="あああ"> <input type="submit" name="bb" value="いいい"> <input type="submit" name="cc" value="ううう"> <input type="submit" name="dd" value="えええ"> </form> このように、一つのフォームの中に埋めてしまい、actionに入る値をボタンによって分ける方法はありませんでしょうか? もしくは他の方法でも構いません。 お分かりの方がいましたら、是非ご教授お願いいたします。

    • 締切済み
    • PHP
  • PHP初心者です。何処がエラーなのかさっぱり解りません。

    超初心者です。 PHPの勉強を始めたばかりで、いきなりつまずいています。 下記の表示になりエラーになっているのですが、何処がエラーなのか意味が解りません。 Parse error: syntax error, unexpected $end in C:\xampp\htdocs\phplesson\03\login.php on line 31 どなたか教えてください。 よろしくお願いします。 ----------------- <?php session_start(); $error_message = ""; //ログインボタンが押されたかを判定 if (isset($_POST["login"])) { if ($_POST["member_name"] == "php" && $_POST["password"] == "password") { //ログインが成功した証拠をセッションに保持 $_SESSION["login_name"] = $_POST["member_name"]; //管理者専用画面へWebブラウザをリダイレクトさせる $login_url = "http://{$_SERVER["HTTP_HOST"]}/phplesson/03/anq_result.php"; header("Location: {$login_url}"); exit; } $error_message ="メンバー名かパスワードを間違えています。"; } ?> <html> <body> <?php if ($error_message) { print '<font color="red">' .$error_message. '</font>'; } ?> <form action="/phplesson/03/login.php" method="post"> メンバー名:<input type="text" name="member_name" value="" /><br /> パスワード:<input type="password" name="password" value="" /><br /> <input type="submit" name="login" value="ログイン" /> </form> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう