2013-10-27 211 views
0

我在提交表單後加載新鮮的「thankyou.php」文件時出現問題。表單將數據發送給自己,如果所有數據都通過了驗證,則會繼續將它們保存在數據庫中。PHP URL重定向不能按預期方式工作

「thankyou.php」負載很重,但「signup.php」仍然存在,兩個文件的輸出仍保留在同一頁面中。我想要一個新的頁面,但它不會工作。

這裏是我的環境衛生:

if ($_SERVER["REQUEST_METHOD"] == "POST") 
{ 
if (empty($_POST["firstName"])) 
{$Err[] = "* First Name is required";} 
else 
{ 
$name = test_input($_POST["firstName"]); 
// check if name only contains letters and whitespace 
if (!preg_match("/^[a-zA-Z ]*$/",$name)) 
    { 
    $Err[] = "Only letters are allowed in First Name"; 
    } 
} 

if (empty($_POST["email"])) 
{$Err[] = "* Email is required";} 
else 
{ 
$email = test_input($_POST["email"]); 
// check if e-mail address syntax is valid 
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) 
    { 
    $Err[] = "Invalid email format"; 
    } 
} 
} 

而且形式:

<div id = "signupform"> 

「> 郵箱地址 名

和數據庫連接和插入:

try { 
    $conn = new PDO('mysql:host=localhost; dbname=mydb', 'root', ''); 
    $conn->setAttribute(PDO:: ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 

趕上(PDOException $ PE){ 回波( '連接錯誤,這是因爲:'。$ PE->的getMessage()); }

//插入數據到數據庫,如果值不爲空,並進行消毒 如果(!空($ _ POST [ 「名字」])& &!空($ _ POST [ 「電子郵件」])) { $ qry =「INSERT INTO userdetails(email,firstName)values(?,?)」;

$q = $conn->prepare($qry) or die("ERROR: " . implode(":", $conn->errorInfo())); 

$q->bindParam(1, $email); 
$q->bindParam(2, $firstName); 


try { 
    if($q->execute()){ 
    header("Location: invoice.php"); 
    exit; 
    } 
    } 
catch(PDOException $pe) { 
    echo('Connection error, because: ' .$pe->getMessage()); 
} 

}

而這一切,但它仍然不加載新的一頁。

+0

出口是否必需? – Duver

+1

@DuverJaramillo是的建議。 –

+0

你可以試試''if($ q){'而不是'if($ q-> execute()){' –

回答

0

我認爲這個問題是您呼叫$q->execute()兩次,試試這個:

try { 
    if ($q->execute()){ 
     header("Location: thankyou.php"); 
     exit; 
    } 
} catch(PDOException $pe) { 
    echo('Connection error, because: ' .$pe->getMessage()); 
} 
+0

我做到了,但問題仍然是一樣的。 –

+0

@YaxMokwa您是否嘗試過我在[我的評論](http://stackoverflow.com/questions/19614565/php-url-redirection-problema#comment29117021_19614565)上面寫的內容?使用'if($ q){'而不是'if($ q-> execute()){' –

+0

@YaxMokwa向我展示了更多的代碼,您將POST請求發送到signup.php的地方在哪裏? – TrungDQ

0

更多的挖掘和更瞭解你實際上是在做什麼(錯誤的方式),我想到了我的解決方案後, 。幾乎你需要做到這一點,以便MySQL插入語句成爲錯誤驗證的一部分,而不是獨立的。如果你看看我以前的代碼,PDO語句在代碼中沒有真正的地位,它就在那裏。

但是,如果確實沒有$Err,它將運行插入腳本並對該腳本進行錯誤檢查。如果插入正確,則會將用戶重定向到下一頁。

有關驗證碼,請使用提交按鈕進行檢查。

if(isset($_POST["submit"])){if (empty($_POST["firstName"])){$Err[] = "* First Name is required";}else{$name = test_input($_POST["firstName"]);if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $Err[] = "Only letters are allowed in First Name"; }}if (empty($_POST["email"])){$Err[] = "* Email is required";}else{$email = test_input($_POST["email"]);if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)){ $Err[] = "Invalid email format"; }} } 

驗證的錯誤消息:

if (empty($Err) === false) { 
     echo '<h3>'; 
     foreach ($errors as $Err) { 
      echo '<center><li>', $error, '</li></center>'; 
     } 

     echo '<h3>'; 
    } 

你的HTML表單應該是這樣的:

<form method="post" action ="echo $_SERVER['PHP_SELF'];"><table >   
<tr><td>Email Address < input type="text" name="email" value="email" ></td> 
</tr><tr valign="baseline"> 
    <td>First Name <br/>< input type="text" name="firstName" value="" ></td> 
</tr> 
<input type="submit" value="submit" name="submit"> 
</form> 

現在服務器端的查詢操作將只驗證執行:

try { 
    $conn = new PDO('mysql:host=localhost; dbname=mydb', 'root', ''); 
    $conn->setAttribute(PDO:: ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
}catch(PDOException $pe) { 
    echo('Connection error, because: ' .$pe->getMessage()); 
}if (!empty($_POST["firstName"]) && !empty($_POST["email"])){ 
$qry = "INSERT INTO userdetails (email, firstName) values (?, ?)"; 
$q = $conn->prepare($qry) or die("ERROR: " . implode(":", $conn->errorInfo())); 
$q->bindParam(1, $email); 
$q->bindParam(2, $firstName); 
try { 
    if($q->execute()){ 

// You can use Two Way to Redire Server side Depending on version 

     // http_redirect("invoice.php"); 
     //OR (Above & below any 1 line can be workout for you. 
     header("Location: invoice.php"); 
     exit; 
    } 
    } 
catch(PDOException $pe) { 
    echo('Connection error, because: ' .$pe->getMessage()); 
}}