iT邦幫忙

0

PHP 用 POST 方式轉傳 $_POST 資料

  • 分享至 

  • xImage

表單用 POST 方式傳送資料到 A.php 頁面,A.php 頁面用 $_POST 接收資料後,要如何再用 POST 方式把 $_POST 資料傳送到 B.php 頁面?
謝謝!
( 我只要用 POST 方式,不要用新表單傳送資料,也不要用 GET、SESSION )

=======================================================
謝謝大家的回覆,
我發現我沒說清楚我想要的東西,
我想要的程式流程如下:

步驟 1.
在 form.php 用 POST 方式送出表單資料到 A.php

步驟 2.
在 A.php 接收 $_POST,並作一些處理後,
會判斷要留在 A.php 並顯示頁面,
還是要把 $_POST 資料重新傳送到 B.php,同時跳轉到 B.php 並顯示頁面

而我想問的是步驟 2,
如果我要跳轉到 B.php 的情況時,
該怎麼把 $_POST 資料重新傳送過去,並顯示頁面?

看更多先前的討論...收起先前的討論...
pickuse iT邦新手 3 級 ‧ 2024-05-29 14:10:12 檢舉
你會不會是想做某種 wizard? 或是 steps? 所以才會想要一頁傳一頁
samjam iT邦新手 3 級 ‧ 2024-05-29 17:49:30 檢舉
謝謝您的回覆,
我原本的問題沒表達清楚,
我在最上方重新整理了,
請您再看一下,
謝謝。
archer9080 iT邦研究生 3 級 ‧ 2024-05-29 18:02:48 檢舉
如果原本預想的流程非必要
1. A拆成兩頁,form頁先ajax到A-1處理並判斷後回傳回form,再submit 到A-2或B
2. A、B合一起
恩....感覺好像都不是好辦法
froce iT邦大師 1 級 ‧ 2024-05-30 10:42:02 檢舉
你這樣都會得把$_POST送回前端,你的流程應該簡化成
步驟 1.
在 form.php 用 POST 方式送出表單資料到 res.php

步驟 2.
在 res.php 接收 $_POST,並作一些處理後,
判斷是要傳回 A.function的html 或是 B.function的html

別那麼直好嗎? 不是進到特定路由後就一定只能傳回某個固定格式的html
動用ajax來回送訊息啊,不會刷新畫面
samjam iT邦新手 3 級 ‧ 2024-05-31 10:34:26 檢舉
謝謝大家的回覆,問題已解決囉
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2024-05-29 13:16:41
最佳解答

其實並不太清楚你真的需要的。

如果你是要發送POST然後轉到B.php上。
基本並不太可能不使用表單。

但如果只是單純的拿頁面資料。而不轉到 B.PHP 的話。
是可以用 CURL的方式來處理。如 Felix 教你的那樣。

但看到你自已寫的還加上了

header( "location: B.php" );

代表你其實是想要轉頁的。
但認真來說,你用了 location 。原本跑的CURL就沒意義了。

但其實可以利用一下PHP輸出JS的方式。來去生成表單。
也就是由A.PHP去生成好的資料後,再去用JS去觸發 submit 事件。
倒也是可以做到。
但這樣子其實又違反了你說不想用表單的方式。

所以....再不清楚你真正要的東西。目前實在沒辦法給你有效的答案。

看更多先前的回應...收起先前的回應...
samjam iT邦新手 3 級 ‧ 2024-05-29 17:49:24 檢舉

謝謝您的回覆,
我原本的問題沒表達清楚,
我在最上方重新整理了,
請您再看一下,
謝謝。

土法鍊鋼法
在 A.PHP
用如下的方式寫法。

<form id="myForm" action="B.php" method="POST">
<?php foreach($_POST AS $key=>$value):?>
        <input type="text" 
            name="<?php echo $key;?>" 
            value="<?php echo $_POST['pizza'];?>" 
        />
<?php endforeach;?>
</form>
<script>
        window.addEventListener('load', function() {
            var form = document.getElementById('myForm');
            form.submit();  // 触发表单的 submit 事件
        });
</script>

我猜你是要處理某個遊戲的表單傳送方式。
基本上來說。如果真的需要POST到B.PHP。
表單處理是避免不了的。
但可以用PHP來生成表單資料並自動發送。

淺水員 iT邦大師 6 級 ‧ 2024-05-29 21:11:51 檢舉

我不知道他為什麼有這種要求
但如果在意的是那個網址好像可以:

  1. 在 A.php 裡面直接 require B.php 然後中止
  2. B.php 裡面有 javascript 在不轉跳頁面下修改網址(History API

以前我有串過類似的(某個遊戲廠商的API)
其實B.PHP並不是他做的,而是某個類似API的應用。
所以它需要POST到B.PHP上
但可能需要先在A.PHP事前做一些事。才能POST到B.PHP
才需要這樣的要求。

我那時的做法是建立了一個VIEW給A.PHP讀取。
VIEW裏面其實就是FROM跟SUBMIT的自動發送。
那只要傳送URL及要POST的資料給這個VIEW就行了。

當然,我只是猜測這樣的可能性,要不然如果不是。
我也搞不懂為何要這樣做就是了。

samjam iT邦新手 3 級 ‧ 2024-05-30 12:14:53 檢舉

我是要做一個銷貨程式,
簡化的程式碼如下:

product.php
列出所有產品讓使用者選擇

<form action="edit.php" method="POST">
    <input type='checkbox' name='id[]' value='1' />p1
    <input type='checkbox' name='id[]' value='2' />p2
    <input type='checkbox' name='id[]' value='3' />p3
    <input type='checkbox' name='id[]' value='4' />p4
    <input type='checkbox' name='id[]' value='5' />p5
    <input type="submit" />
</form>

edit.php
如果使用者在 product.php 選擇 p1、p2 產品,
這邊就列出來並讓使用者輸入數量,
但是設置了 2 個 submit 按鈕

<form action="complete.php" method="POST">
    p1<input type='text' name='qty[]' />
    p2<input type='text' name='qty[]' />
    <input type="submit" value='完成' />
    <input type="submit" value='加入產品' />
</form>

complete.php
在這邊要判斷使用者按下的是 "完成" 還是 "加入產品"。

  1. 如果使用者按下 "完成",
    那就顯示此頁面,
    這邊沒問題。

  2. 有問題的是,
    如果使用者按下 "加入產品",
    就要把目前已有的產品數據 p1、p2,
    轉傳給 product.php,
    並在 product.php 設定隱藏欄位記錄這些原本的產品,
    這樣使用者加入其他產品後 ( 例如 p5 ),
    送出表單到 edit.php,
    可以取得 p1、p2、p5 的數據。

所以想要知道如何從 complete.php 轉傳 $_POST 到 product.php

froce iT邦大師 1 級 ‧ 2024-05-30 14:44:47 檢舉

雖然你這不一定是結帳,但我直接用結帳比喻了:
我倒是覺得你把流程弄簡單點,都只留加入產品這功能...
畢竟是要花錢,讓客戶花錢時能多確認一下商品訂購的對不對。

要不然你就是得弄個購物車頁面,加入商品的功能用ajax去做,直接結帳再用傳統的post後跳轉。

samjam iT邦新手 3 級 ‧ 2024-05-31 10:36:23 檢舉

謝謝大家的回覆,問題已解決囉

0
Felix
iT邦研究生 2 級 ‧ 2024-05-29 09:20:10

不要新表單的話,就只能讓 A.php 代為發送請求:

<?php

$body = http_build_query($_POST);
$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, 'B.php');
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$data = curl_exec($curl);

curl_close($curl); # 關閉資源
samjam iT邦新手 3 級 ‧ 2024-05-29 11:41:31 檢舉

謝謝您的回答!
不過我試了之後,B.php 沒辦法抓到 A.php 送出的 $_POST,請問哪裏有錯誤呢?
以下是我的程式碼:

form.php

    <form action="A.php" method="POST">
        <input type="text" name="food" value="pizza" />
        <input type="text" name="drink" value="water" />
        <input type="text" name="color" value="yellow" />
        <input type="submit" value="確定" />
    </form>

A.php

    <?php
    $body = http_build_query( $_POST );
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL, 'B.php' );
    curl_setopt( $curl, CURLOPT_HEADER, false );
    curl_setopt( $curl, CURLOPT_POST, 1 );
    curl_setopt( $curl, CURLOPT_POSTFIELDS, $body );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
    $data = curl_exec( $curl );
    curl_close( $curl );

    header( "location: B.php" );
    ?>

B.php

    <?php
    echo '<pre>' . print_r( $_POST, 1 ) . '</pre>';
    // 我要在這 B.php 內,處理 $_POST 資料
    ?>

你多了 header( "location: B.php" );

samjam iT邦新手 3 級 ‧ 2024-05-31 10:36:33 檢舉

謝謝大家的回覆,問題已解決囉

我要發表回答

立即登入回答