2013-06-27 392 views
0

我是PHP的新手,並試圖編寫一些代碼,然後將該帖子提交給數據庫,然後在同一頁上驗證表單。PHP驗證表單不能返回正確的響應

我想要的代碼是;

  1. 問,如果任何字段已經充滿
  2. 如果是檢查是否有任何字段都是空的(是這樣輸出的消息)
  3. 如果沒有經過一系列的數據的驗證檢查每次將任何錯誤添加到數組中。
  4. 終於問是否已被發現的任何錯誤
  5. 如果不將數據插入到數據庫(這段代碼是寫而不是在代碼中,我在下面提供所示。

因此,這裏是我的代碼:

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Untitled Document</title> 
</head> 


if(isset($_POST['title']) || isset($_POST['content']) || isset($_POST['comment_option'])); 

{ 


$title = $_POST['title']; 
$content = $_POST['content']; 
$comment_option = $_POST['comment_option']; 
$form_errors = array(); 

if (empty($title) || empty($content) || empty($comment_option)) 
{ 

    $form_errors[] = "All fields are required!"; 

} else { 

    if (strlen($title < 3)){ 

     $form_errors[] = "The title is too short!"; 

    } 

    if (strlen($title > 50)){ 

     $form_errors[] = "The title is too long!"; 

    } 

    if (strlen($content < 50)){ 

     $form_errors[] = "Post is a bit short!"; 

    } 
} 


if(!empty($form_errors)) { 

print_r($form_errors); 


}else{ 

//insert data into database 

} 

} 
?> 

<form action="add_post.php" method="post"> 

Title: <input type="text" name="title"><br> 

Content: <input type="text" name="content"><br> 

Comments enabled?<br> 

<input type="radio" name="comment_option" value="true">Yes<br> 
<input type="radio" name="comment_option" value="false">No<br> 

<input type="submit"> 


</form> 




<body> 
</body> 
</html> 

當網頁加載完畢後,我得到的,其中i設置$標題$內容系未定義指數的三個錯誤和$ comment_option變量,如果我只是點擊提交,然後我只得到了一個錯誤。在哪裏設置$ comment_option變量,但我確實看到「所有字段ar e需要「。如果任何字段沒有填寫,我也會看到這個錯誤,所以這部分工作。

如果所有字段填寫。無論在什麼長度,我總是看到「標題太短」和「博客文章是有點短」,即使他們不..

㈣花了一段時間看着這個,只是不能弄清楚什麼是做錯了!

任何幫助將不勝感激!

感謝, 最大

回答

2

你已經把函數調用內部的< 3比較strlen(另兩個爲好)。因此,改變從

if (strlen($title < 3)){ 

if (strlen($title) < 3){ 

和類似的其他比較。

未定義指數誤差可以固定通過改變變量的設置是這樣的:

$title = isset($_POST['title']) ? $_POST['title'] : ''; 
+0

啊確定這就是排序的驗證位和多數民衆的工作,謝謝!問題是我仍然得到未定義的索引錯誤。是因爲如果$ _POST ['?']沒有任何內容,即時設置一個沒有任何內容的變量? – Max

+0

這是因爲你正在檢查是否設置了任何變量,然後假設他們都是。因此,如果設置了$ _POST ['title']'並且$ _POST ['content']'不是,當您嘗試設置'$ content = $ _POST ['content']' – Niro

0

看起來你正在做的strlen的條件是錯誤的。

你這樣做:

if (strlen($title < 3)) 

當你應該這樣做:

if (strlen($title) < 3) 

你的條件語句是失敗的原因是因爲你得到的strlen($title < 3)的結果,這將導致strlen(true) ,這導致了1(我相信)的回答,因此有條件的被視爲true

在這裏的糾正情況是怎麼樣的條件的作用:

我們使用strlen函數來計算的$title的長度,這可以說是「測試」。這樣做strlen($title)將產生4。現在條件變爲4 < 3,這導致false

+0

哦,我明白了。一個nooby錯誤的位x)。謝謝你告訴我這件事。 – Max

0

你必須在你的第一個IF語句的結束分號:

|| isset($_POST['comment_option']));

這意味着,如果該聲明是真實的,什麼也不做。然後它總是執行它下面的塊。

+0

好的謝謝,在開始時擺脫了未定義的索引錯誤,但如果我不按下單選按鈕上的某些東西,我仍然會收到與comment_option有關的錯誤。我猜是因爲收音機是真的還是假的? – Max

+0

單選按鈕可以是「」選中「或」「」「。如果您需要確保至少有一個選中狀態,則將HTML修改爲默認的單選按鈕之一,以「檢查」。 –

+0

在你的情況下,你有兩個同名的單選按鈕。不是一個好主意。我將其中一個名字改爲'yes_btn',另一個改爲'no_btn',然後檢查'$ _POST ['yes_btn']'或'$ _POST ['no_btn']'中的哪一個被設置爲'「」 。 –

0

如果這不需要服務器基礎設施,我認爲提交表單並在服務器端(PHP端)執行這些驗證並不是一個好主意。您仍然可以使用JavaScript進行這些驗證。

+0

是的,但如果用戶關閉JavaScript或嘗試使用curl或其他方式提交表單呢?您仍然需要服務器端驗證。 – Gohn67

+0

我不知道任何JavaScript和wouldnt知道如何去關於它任何其他方式:/ – Max

0

首先,命名您的form

<form action="add_post.php" method="post" name="myForm">

然後你的基礎首先if聲明關form的名稱,並刪除了 ';'在該行的末尾:

if(isset($_POST['myForm'])){ . . . }

裏面,如果,檢查並設置每個$_POST變量,你是:

if(isset($_POST['title']) && isset($_POST['content']) && isset($_POST['comment_option'])) 
{ 
$title = $_POST['title']; 
$content = $_POST['content']; 
$comment_option = $_POST['comment_option']; 
} 
else 
{ 
$form_errors[] = "All fields are required!"; 
} 

等爲其他變量。

做其他答案中提到的長度驗證。

+0

使用此如何會輸出一個消息,當不是所有的字段保存數據?感謝您的建議。 – Max

+0

已更新,檢查所有變量不爲空。 – Niro

0

整個問題是你在if語句結尾處有「;」。 if(isset($_POST['title']) || isset($_POST['content']) ||
isset($_POST['comment_option']));

刪除它!

另一個問題是在條件:if (strlen($title < 3)){ 這應該是if(strlen($title) < 3){ 等等....

strlen的返回一個整數,只有這樣,你可以檢查的條件。 你在這段代碼中寫的是:if(1)或其他任何數字....總是這樣!

希望它可以幫助....