2015-11-25 17 views
-1

我有3個PHP頁面,第一個是我有一個表單,用戶可以輸入他的帳戶(電子郵件地址)和他想從他的帳戶中扣除的金額。 第二我有功能和成功消息顯示的調用。 在第三頁上,函數send()完成,它打開數據庫連接,更改帳戶的金額並保存。成功頁面的PHP重新加載(F5)將再次調用數據庫更新

第一頁:

<form action="send_exec.php" method="post"> 
Amount: <input type="number" size="24" maxlength="4" 
name="points_send" min="0"><br><br> 
Account<input type="text" size="24" maxlength="50" 
name="email"><br><br> 
<input type="submit" value="Send"> 
</form> 

第二頁(send_exec.php):

<?php 
include("update_send.php"); 
$email = $_POST["email"]; 
$points_send = $_POST["points_send"]; 
settype ($points_send, "integer"); 
send($email, $points_send); 
echo ("Success"); 
?> 

第三頁(update_send.php):

//some calculations are done before this to get $new_points 
function send($email, $points_send) 
{ 
$mysql_update_points = "UPDATE user SET points = ('$new_ponints') WHERE email = ('$email')"; 
$mysql_update = mysql_query($mysql_update_points); 
} 

問題是現在,當我在第一頁上執行操作,然後結束第二頁:如何在我的瀏覽器中單擊F5/reload時禁用該操作行動被再次調用?

+5

與其他人一樣:將瀏覽器移至其他頁面。 –

+0

最簡單的方法是將瀏覽器重定向到成功的其他頁面;移動'echo(「Success」);'到一個新的頁面/腳本(我們將其命名爲'success.php')並將其替換爲'header('Location:/success.php');'in'send_exec.php' 。 – axiac

+0

參見例如https://en.wikipedia.org/wiki/Post/Redirect/Get – VolkerK

回答

0

創建一個名爲「done.php」的第四頁。

代碼:

<?php 
$pageMsg = isset($_GET['msg']) ? $_GET['msg'] : ''; 

if($pageMsg === "success"){ 
     echo "Success"; 
    } else { 
     echo "Error"; 
    }; 
?> 

然後在第三頁上你的源改成這樣:

//some calculations are done before this to get $new_points 
function send($email, $points_send) 
{ 
$mysql_update_points = "UPDATE user SET points = ('$new_ponints') WHERE email = ('$email')"; 
$mysql_update = mysql_query($mysql_update_points); 

if($mysql_update === FALSE) { 
    //die(mysql_error()); //Remove comment if you want to get the error. 
    header("Location: done.php?msg=error"); 
} else { 
    header("Location: done.php?msg=success"); 
    }; 
} 

Lastely改變你的第二頁(send_exec.php)來源:

<?php 
include("update_send.php"); 
$email = $_POST["email"]; 
$points_send = $_POST["points_send"]; 
settype ($points_send, "integer"); 
send($email, $points_send); 
echo ("Success"); 
?> 

爲此:

<?php 
require_once("update_send.php"); 
$email = $_POST["email"]; 
$points_send = $_POST["points_send"]; 
settype ($points_send, "integer"); 
send($email, $points_send); 
?> 
+0

不要將重定向放入'send()'函數。讓它返回一個布爾值(數據庫操作的結果)並讓調用代碼決定下一步做什麼(重定向到不同的頁面)。這樣,函數可以在不同的上下文中再次使用,其中延續可以不同。 – axiac

+0

非常感謝!這對我非常有幫助! – Schwallo

+0

@ emil-elkjær-nielsen 有沒有辦法在這裏返回一個值: 'else {header}(「Location:done.php?msg = success」); };' 像Return($ new_points); 但我怎麼做,我得到的值給頁面done.php? – Schwallo

-2

我想你需要檢查表單是否提交。

您可以通過使用代碼檢查: 如果($ _ SERVER [ 「REQUEST_METHOD」] == 「POST」){...}

要繼續,請先檢查form validations ...

+0

這不是頁面刷新的工作方式。當用戶要求瀏覽器刷新頁面時,先前的請求將按原樣重新發送(使用與以前相同的方法和參數)。 – axiac

+0

那麼在這種情況下,我們可以使用header('location:filename.php'),它將返回到帶有表單的原始頁面。對? –

+0

這種情況通常是在表單提交成功處理後,通過重定向瀏覽器(使用header('Location:...');確實)到另一個頁面來處理。這個新頁面顯示提交處理的結果。它可以通過GET參數或cookie(會話)瞭解處理過程。當提交的數據無效時,顯示錶單頁面是有意義的,而且當應用程序邏輯允許再次用不同的數據提交表單時也是如此。 – axiac

相關問題