2011-04-06 63 views
0

幫助!我有一些麻煩,獲取一些條件語句到我的PHP腳本的表單。只有在_POST填入時纔將內容發送到變量

這是HTML的要點:

<input type="text" name="address1" id="address1" class="required" /> 
<input type="text" name="address2" id="address2" /> 
<input type="text" name="city" id="city" /> 
<input type="text" name="postcode" id="postcode" class="required" /> 

,而PHP的看起來有點像這樣:

$address1 = $_REQUEST["address1"] ; 
$address2 = $_REQUEST["address2"] ; 
$city = $_REQUEST["city"] ; 
$postcode = $_REQUEST["postcode"] ; 

$message = 
"address: $address1, " . 
"$address2, " . 
"$city, " . 
"$postcode" . 

$sent = mail($to, $subject, $message, 'From:' . $email_address) ; 

我已經有了 '地址1' 和 '郵政編碼',所以一些jQuery驗證他們不是一個問題,因爲他們總是會返回一個值。如果「地址2」和「城市」未填寫(也許填表人沒有第二行到他們的地址,或者沒有按照他們的想法放入城市 - 正確 - 郵政編碼是足夠的在找到他們的地址時),他們仍然在電子郵件上返回一個值('沒有')。

我想要發生的是對於留空的表單輸入,根本沒有電子郵件。換句話說,如果$ address2變量是空的,不要給我發送「空格」。例如,如果這一切都完成我得到這個,這是偉大的:

地址:1測試大街,倫敦西區,測試城市,AB1 23C

如果有一個領域缺少我會得到這一點,這是一個有點亂:

地址:1測試街,試驗城市,AB1 23C

,但我想這一點,因爲它的漂亮整潔:

地址:1測試街,測試城,AB1 23C

我一直試圖讓我的頭圍繞isset函數,但沒有任何運氣。我也嘗試了一個基本的'如果'的聲明,但似乎無法得到任何地方。我必須承認,php不是我的強項,我花了很多時間在這方面沒有成功。非常感激你的幫助!

非常感謝,

馬丁。

+2

您的代碼似乎易受電子郵件標頭注入的影響。另外:''我在'address1'和'postcode'上有一些jQuery驗證,所以它們不是問題,因爲它們總是會返回一個值。「」你不能相信客戶端驗證按照你的意願工作如果他們願意,用戶可以繞過它或製作自己的表格。 – Hammerite 2011-04-06 12:13:09

+0

如果您使用客戶端來首先顯示錶單,則可以繞過它。 – 2011-04-06 13:10:43

回答

1

對於這種「參數過濾」有問題,我喜歡使用PHP數組函數。

例如:

<?php 
$aMessage = array(); 

$aMessage[] = $_REQUEST["address1"] ; 
$aMessage[] = $_REQUEST["address2"] ; 
$aMessage[] = $_REQUEST["city"]  ; 
$aMessage[] = $_REQUEST["postcode"] ; 

$aMessage = array_filter($aMessage); 

$message = (implode(', ', $aMessage)); 

echo $message; 
?> 

作用:

  1. 填充陣列與型動物 參數。
  2. array_filter功能
  3. 打印用 逗號(implode功能)級聯的值刪除空值 。

使用此方法,即使您有很多參數,代碼仍然易於閱讀。

+0

感謝Guillaume--完美的作品!有沒有可能只用一個變量來做到這一點?即。如果我有一個不屬於組的組成部分的盒子,就像地址一樣,它可能會也可能不會被填充。如果是,我需要查看電子郵件中的內容,如果不是,我不要不想在郵件中顯示任何內容。 – Martin 2011-04-06 15:30:12

0

定義導入之前一個新的PHP變量DB

$address=$_REQUEST["address1"]; 

if (trim($_REQUEST["address2"]!='')) 
$address.=','.$_REQUEST["address2"] 
0

isset()函數,如果變量已經設置返回true - 即,是已經宣佈並具有非NULL值爲。除了那個關於NULL的位之外,isset()沒有提及該變量的內容

要測試變量是否真正空的(一個空字符串,NULL,FALSE,0,空數組等)中,使用適當命名空():)

實施例:

$a = NULL; 
$b = ''; 
// $c we won't declare 
echo isset($a); // False - $a has a NULL value 
echo isset($b); // True - $b is set to a non-NULL Value. empty() will return True too. 
echo isset($c); // False - $c is not set. 

做的另一種方式上面提到的什麼隊長:

$address = ""; 
foreach(array("address1", "address2", "address3") as $param) 
{ 
    $param = trim($_REQUEST[$param]); 
    $address .= !empty($param) ? ', '.$param : ""; 
} 

方式工作的:

  1. 定義您想要的$ _REQUEST數組中 中元素的名稱。
  2. 您循環遍歷每個元素,將 的值從$ _REQUEST中抽出,剝離 任何零散的空格(使用 trim())。
  3. 如果該參數不爲空,則將 附加到$地址。
  4. 如果它爲空,則附加一個空的 字符串。

如果你以前沒有見過它,condition ? expr_if_true : expr_if_false語法被稱爲三元運算符

一點點清潔,國際海事組織。更少if/else語句運行。

+0

正如Hammerite上面提到的那樣,在將其注入到mail()調用(或將其放入數據庫或將其打印回屏幕等)之前,先對此輸入進行消毒。始終認爲來自客戶的任何和所有輸入都是邪惡的。 – Adam 2011-04-06 12:17:43

+0

你可以選擇上尉的代碼,這似乎是個訣竅。唯一的問題是分隔數組項的逗號出現在每個項目之前,這意味着在'address1'之前有一個逗號。內爆功能會改變嗎? – Martin 2011-04-06 15:11:30

+0

或者將'address1'從數組中取出並將其與'address'連接起來? – Martin 2011-04-06 15:15:29