PHPプログラムないで別PHPを呼び出し戻り値を受け取ろうと考えています。


test1.php-------------
<?php
print "<html><body>\n";
$return_data= exec(/usr/local/bin/php ./test2.php?param1=1¶m2=2);
print $param1."+".$param2."=".$return_data;
print "</body></html>";

test2.php------------------
<?php
$return_item = $param1 + $param2;
print $return_item;
?>

のように、test1.phpからパラメータを渡し、
test2.phpで計算をして答えをtest1.phpに返す
プログラムを作成しました。

test1.phpからtest2.phpをパラメータをつけて渡すのが
うまくいきません。

execではパラメータをつけることはできないのでしょうか?もしくは他の方法はないでしょうか?

functionやincludeではなく上記の方法で行いたいと思っております。

お手数ですが、アドバイスお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

こんにちは。



CやJAVAやっていれば、すぐわかるのでしょうが・・・。
コマンドライン上からパラメータを渡す方法を考えてください。

PHPのようなC言語ライクな言語では慣用的に、

argv や argc といった「arg」が付く変数名が特別な扱い方をされます。
JAVAだと args ですね。
で、PHPだと、
$argv と $argc になります。

$argv は、引数で渡されたパラメータの配列です。
$argc は、パラメータの個数が格納されています。

パラメータの渡し方は、

"/usr/local/bin/php ./test2.php aaa bbb"

のように、半角で区切った形になります。

GETのように、スクリプトのあとに aaa=bbb&ccc=ddd と渡すと
「&」以降が特殊な値ととられてしまいます。

具体的にいうと、 test2.php のパラメータを受け取る部分は以下のようになります。

$param1 = $argv[1];
$param2 = $argv[2];

で、$argv[0] には、./test2.php が入っています。(実行させたいスクリプトへのパス)
また、$argc には、3 が入っています。(配列$argv の要素数)

次に、実行結果を受けとる方法ですが、

test2.phpから、実行結果を受け取りたい場合は、exec 関数は、他の言語の exec 関数より便利に出来ています。

test1.php を以下のようにしてください。

exec("/usr/local/bin/php ./test2.php aaa bbb" , $rec , $status);
if ($status != 0){
print "失敗しました";
exit(1);
}

test2.php は、

print $return_item;
exit();
?>

とした場合、
$rec に print で出力した結果が入っていると思います。

※注意

実をいうと $rec には意図した結果以外に色々なデータも入っています。
たとえば、test2.php で、

$aaa = "aaaa";

print $aaa;

とした場合、
$rec には、

$rec[0] : Content-type: text/html; charset=EUC-JP
$rec[1] : X-Powered-By: PHP/5.0.2
$rec[2] :
$rec[3] : aaaa

という値が入っています。
$rec[0] から $rec[2] までは環境によって違います。つまり、test2.php から受け取ったデータが $rec のどの要素に入っているかは、環境によって違ってきますので、まず、


exec("/usr/local/bin/php ./test2.php aaa bbb" , $rec , $status);
if ($status != 0){
print "失敗しました";
exit(1);
}
print_r($rec);


で、確認してみてください。
    • good
    • 0

・単純に、test2.phpに計算だけする関数を定義して、それをtest1.phpで呼び出す。

だったらtest1.phpにその関数を書いた方がいいんだけど。

・test1.phpからtest2.phpへリダイレクトする。リダイレクトする際に、パラメータを付ける。それからまた、test2.phpからtest1.phpへリダイレクトする。あんまり意味はないけど。

この場合、何をしたいのかがわかれば、的確に答えられると思います。
あと、「param1=1」の後が文字化けしてますけど、「param1=1&param2=2」ってなってますよね?それから、test2.phpでGET値を取得していないようですが、大丈夫ですか?GET値=変数名は古い仕様です。$_GET["param1"]で取得してみてください。あー、あと、「print $return_item」ってやっても、test1.phpに値は返らないんじゃないかな。
    • good
    • 0

$return_data= exec("/usr/local/bin/php ./test2.php param1=1 m2=2");



コマンドを呼んでるようなので、、「?,&」でなくて「 (半角スペース)」でどうでしょう?

また、「./test2.php」のような相対パスでなくて、絶対パスで書いたほうが確実かと思います
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qあるphpから他のPHPプログラムに飛び実行する命令

header("Location: ○○○.php");

という記述だけでは、実行できないのでしょうか?
この行の上部までは完璧に実行されますが、この命令だけは飛んでいってくれません。他のしくみがいりますか?

Aベストアンサー

http://www.php.net/manual/ja/function.require.php
実行するのが目的なら
require( ) 又は、include( ) を使うのがよいと思います。

>header("Location: ○○○.php");
は、指定するプログラムの実行というより、WEBページの遷移です。

参考URL:http://www.php.net/manual/ja/function.require.php

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

QPHPからHTMLへの変数の受け渡し

form.html→page1.php→page2.php
というようなページをつくり、form.htmlでテキストエリア等<form>を使いpage1.phpにデータ:nameを送るとします。
その際$name = $_POST['name'];とするとphpでの変数になってしまってpage1のhtml上では認識されませんよね?
page1からpage2に移動するときにform.phpでいれたnameのデータも
<input type="hidden" name="名前" value="name">
というように使いたいのですがその際page1内でphpでの$nameをhtmlのnameに代入というかデータの受け渡しが必要になるかと思うのですがそれはどのように記述すればいいのでしょうか?

ご教授よろしくお願いいたします。

Aベストアンサー

1.hiddenで値を回す(大抵は「値を引き継ぐ」と呼ばれます)
[form.php]
<form action="page1.php" method="POST">
<input type="text" name="name" />
<input type="submit" />
</form>

[page1.php]
<form action="page2.php" method="POST">
↓そのまま$_POSTの値を突っ込むとxssなどバグの温床になるんだけど。
<input type="hidden" name="name" value="<?php echo htmlspecialchars($_POST['name']); ?>" />
<input type="submit" />
</form>

[page2.php]
上記だとHTMLを排除された値が渡ってくることに注意
<?php echo $_POST["name"]; ?>


2.sessionを使って値を保持する
[form.php]
(snip)

[page1.php]
<?php
session_start();
$_SESSION['name'] = $_POST['name'];
?>

[page2.php]
<?php
session_start();
echo $_SESSION['name'];


sessionを使った方がセキュリティ的には強固 かつ 作成者的に負担が少ないので
個人的には2.をお勧めしたいところ。
cookieが使えないのであれば1.しか手法がありませんが。

1.hiddenで値を回す(大抵は「値を引き継ぐ」と呼ばれます)
[form.php]
<form action="page1.php" method="POST">
<input type="text" name="name" />
<input type="submit" />
</form>

[page1.php]
<form action="page2.php" method="POST">
↓そのまま$_POSTの値を突っ込むとxssなどバグの温床になるんだけど。
<input type="hidden" name="name" value="<?php echo htmlspecialchars($_POST['name']); ?>" />
<input type="submit" />
</form>

[page2.php]
上記だとHTMLを排除された値が渡っ...続きを読む

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

Q別PHPファイルに変数を渡す

 PHP初心者です。宜しくお願いいたします。

 下記はcheck1.phpです。途中で $check2=1の場合は分岐でcheck2.phpにジャンプさせたいのですが、ジャンプした後は変数がすべて消えてしまうようです。check1.phpで得た変数を、そのままcheck2.phpで利用したい場合はどうすればいいのでしょうか?

--------------------------------------------------

if ($_POST['write']) {

$tuki= get_form($_POST["tuki"]);
$ome = get_form($_POST["ome"]);
$check1 = get_form($_POST["check1"]);
$check2 = get_form($_POST["check2"]);}

if ($check2==1)
{$url="http://localhost/check2.php"; readfile($url);}
else{・・・・・・・・
--------------------------------------------------

 PHP初心者です。宜しくお願いいたします。

 下記はcheck1.phpです。途中で $check2=1の場合は分岐でcheck2.phpにジャンプさせたいのですが、ジャンプした後は変数がすべて消えてしまうようです。check1.phpで得た変数を、そのままcheck2.phpで利用したい場合はどうすればいいのでしょうか?

--------------------------------------------------

if ($_POST['write']) {

$tuki= get_form($_POST["tuki"]);
$ome = get_form($_POST["ome"]);
$check1 = get_form($_POST["check1"]);
$check2 = ge...続きを読む

Aベストアンサー

includeかrequireでどうでしょうか
f ($check2==1) {
include("check2.php");
exit;
}
else{・・・・・・・・

QリダイレクトでPOST

教えてください。

リダイレクトの際、POSTで次のページにデータを渡すことは可能でしょうか?

GETだと
header("Location: "a.php?no=".$no);
と、問題なくできるのですが、
できれば、パラメータを隠したいと思います。

以上ですが、よろしくお願いします。

Aベストアンサー

多分できないです。
それに、結局クライアント側に情報を送信しているのだから、POSTにしたところでパラメータを隠した事にはならないですし。
本当に隠すならサーバ側でセッション情報を引き継ぐような形にしないとダメでしょう。

AJAXのかたちにして、ページ遷移を見えなくするというのが手っ取り早いかも。

QPHPの関数実行

<?php
function disp(){
echo "hello world";
}
?>

<form>
<input type="text">
<input type="button" onclick="<?php disp() ?>">
</form>

といったソースを書いてみたのですが、ボタンを押してみるのですが作動しません。
どこか間違えているのでしょうか、それとも作動しないのでしょうか・・・。
当方としては、formのinputボタンを押したらPHPの関数が実行させるようにしたいのですが・・・。
どなたかご助言をお願いします。

Aベストアンサー

ウソつきました
出来ましたー

<?php

if($_REQUEST[submit] == TRUE){
function disp(){
echo "hello world";
}
}

else{
function disp(){
echo "";
}
}

?>

<form method="post" action="">
<input type="text" value="<?php disp(); ?>">
<input name="submit" type="submit"value="押せ">
</form>

QPermission denied in

PHPを実行するとWarning: fopen failed to open stream Permission denied inと
表示されてしまいます。
インターネットを使い、調べてはいますが、
上記のように表示してしまいます。
ファイルです。パーミッションは606にしました。

このWarningを表示させないようにするには、どのようにすれば
良いのか教えて頂けると嬉しいです。

Aベストアンサー

あとは
> PHPを実行するユーザーとそのグループはどうなってますか?

PHPを直接コマンドラインから実行するのなら、ユーザーはあなたですが、httpサーバーでモジュールやCGIとして実行するなら別の権限(nobodyとか)になっていると思います。

あとは
ディレクトリのパーミッションを 707 にする
ディレクトリとファイルのオーナーをPHPを実行するユーザーにする
とかでしょうか。

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報