52249


どうかお教え願いませんでしょうか。以下のようにb.php内で計算された結果である変数$amountをa.phpへリアルタイムで渡したいのですがどうしてもできません。（a.phpとb.phpは異なる階層間にあります。）

この様な場合、何に問題があると考えられるのか、設定などをどのように変更すれば目的を達成できるか、あるいは全く異なる方法など、アドバイス、ご教授頂けませんでしょうか。

：追記

x.js

[code]

    $.ajax({
    type:"POST",
    url:"a.php",
    data:"type=price",
    success:function($amount){
    $("#amount").val($amount);
    }});
    
[/code]

a.php

[code]

    case 'price':   
    require_once(PATH.'/b.php');
    // 追記：$amount = "232321" 試しに左の様な設定にすると、問題が解決された結果になります。
    echo $amount;
    
    break;
    
[/code]

b.php

[code]

    追記：
    // $amount = "237272"; 左記の様に値をfunction amount($db,$sum,$stay)の外に設定するとhtml上で237272が設定されますので、算出された実行結果である$amountの受け渡しは別として、php間、そしてjs、htmlでの値の受け渡しが確認されました。
    
    function amount($db,$sum,$stay){
    // 追記：global $amount; を試しましたが、$amountをa.phpで取得できていない様です。
    //global $amount;
    
    //諸々の計算
    $sub_total1 = sum1 + $tax;
    $sub_total2 = sum2 + $margin;
    $amount =  $sub_total1 + $sub_total2;
    
    // echo $amount;　この記述によって、$amountの値が上記の同じページの違う箇所に表示されます。   
    
    //追記 html上の表示箇所。
    
    if($type == 'html'){
    //諸々のhtml上の設定。
    $tem .= "<td>".number_format($sub_total1)."円</td>";
    $tem .= "<td>".number_format($sub_total2)."円</td>";
    $tem .= "<td>".number_format($amount)."円</td>";
    
    return $tem  
    } 
    
    }
    
[/code]

  * システムフロー上はa.phpに$amountが渡った後、js、そしてhtmlに渡りそこで設定されますが、以上のa.phpで$amountがb.phpから渡っていれば私が抱える問題は解決されます。

  * $_SESSIONも試しましたが、周回遅れ（前回）の計算結果が表示される様で、値の表示されるタイミングが合わないです。（リアルタイムに反映されない。）

  * 以下の様な設定にすると、html上でb.phpの全記述が表示されますのでパス自体には問題がないと思われます。

a.php

[code]

    case 'price':
    $amount = file_get_contents(PATH.'/b.php');
    echo $amount; 
    break;
    
[/code]

  * 追記：  
a.phpを起動させる元のファイルは上記のx.jsです。data:"type=price",という形式でa.phpのcase
'price':を呼び、結果が得られれば#amountをhtmlに渡します。

  * 追記：  
function
amount()内での計算は全てこのfunction内で情報を取得し、計算されたものになります。かなり長い計算の為、ここでは混乱を回避する為に簡略化させて頂きましたが、必要とされる情報は提示していると思われます。

  * 追記：  
b.php内のfunction
amount($db,$sum,$stay)内の実行結果である$amountをグローバル変数にする方法が分かりません。あるいは、上記にも記しましたが、この実行結果である$amountを算出直後にfunction
amount($db,$sum,$stay)の”外”に設定できれば、php,php,js,htmlと値が受け渡せると思われます。

-最新-

  * 追記：  
最初に情報提供できなく申し訳ございません。function
amount内にhtml表示をする箇所がありreturn値はそのhtmlに返されます。このhtml用の戻り値（return $tem）を削除し、return
$amountにすると、php,php,js,htmlと$amoutnが渡り、当初の目的が実現されますが、そのhtmlは削除できません。よって、return
$amountを使用できないと思われますが、本件の様なhtmlを使用している場合、複数の戻り値を返す様なことはできるのでしょうか。

  * 追記：  
Classを使用すると、システムの他の記述が影響を受ける様でかなり大掛かりに変更をかけない限り機能しませんので、現時点では保留にした方が良さそうです。

  * 追記：  
グローバル変数がリスクが皆無で、本システムでも機能しているのであれば、一番簡単に実装できそうなのですが、現時点で機能させることができていない以上、同じことになるかもしれませんが、function
amount2の様な新たな$amount用のための関数を作成し、そこでfunction
amountの$amountを取得し、a.phpへ渡すなどっといった方法はありませんでしょうか。


CC BY-SA 4.0
2019-01-22T08:12:23.823
52204
2019-01-24T20:10:24.917
2019-01-24T20:10:24.917
19211
19211
question
php
phpファイル間での関数内の実行結果の即時受渡し


まず原因ですが、require_onceはあくまで別のファイルを読み込んでいるのであって、実行しているわけではありません。

case文の中でb.phpを読み込んではいますが、ソース上は

[code]

    case 'price':
      function amount($db,$sum,$stay){
        $amount =  $sub_total1+$sub_total2;
      }
      echo $amount;
      break;
    
[/code]

となっているだけでfunction amountは呼ばれておらず、無視されている状態となっています。

現状の情報ではアドバイスが難しいので、もう少しソースコードを見せることは可能ですか？


CC BY-SA 4.0
2019-01-22T09:05:11.667
52207
2019-01-22T09:05:11.667
29533
52204
answer


案１：戻り値を使う  
a.php

[code]

    //Require
    require_once(PATH.'/b.php');
    //実行
    $amount = amount($db,$sum,$stay);
    //出力
    echo $amount;
    
[/code]

b.php

[code]

    function amount($db,$sum,$stay){
        //諸々計算
        $sub_total1 = sum1 + $tax;
        $sub_total2 = sum2 + $margin;
        //計算結果をなんか変数に代入
        $res =  $sub_total1 + $sub_total2;
        //値を返却
        return $res;
    }
    
[/code]

* * *

案２：グローバル変数に保存する（非推奨）  
a.php

[code]

    //Require
    require_once(PATH.'/b.php');
    //念のためグローバル変数初期化
    $amount = '';
    //実行
    amount($db,$sum,$stay);
    //出力
    echo $amount;
    
[/code]

b.php

[code]

    function amount($db,$sum,$stay){
        global $amount;
        //諸々計算
        $sub_total1 = sum1 + $tax;
        $sub_total2 = sum2 + $margin;
        //計算結果をなんか変数に代入
        $amount =  $sub_total1 + $sub_total2;
    }
    
[/code]

* * *

特に理由もなくグローバル変数を汚すことはオススメしません。  
可能であれば処理スコープ内で変数をクローズするべきかと思います。

* * *

**追記**

案3：Classを使う  
a.php

[code]

    //Require
    require_once(PATH.'/b.php');
    //class初期化
    $smp = new Sample();
    //実行
    $smp->amount($db,$sum,$stay);
    //出力
    echo $smp->val;
    
[/code]

b.php

[code]

    Class Sample{
        public $val = '';
    
        public function amount($db,$sum,$stay){
            //諸々計算
            $sub_total1 = sum1 + $tax;
            $sub_total2 = sum2 + $margin;
            //計算結果をなんか変数に代入
            $this->val =  $sub_total1 + $sub_total2;
        }
    }
    
[/code]


CC BY-SA 4.0
2019-01-23T07:31:59.710
52249
2019-01-24T01:40:03.120
2019-01-24T01:40:03.120
7676
7676
52204
answer