2011-08-08 128 views
0

我有一個表格,其中有兩個部分,每個部分從一行開始,並且可以使用腳本添加更多行。你可以在this page的底部看到表格。如何防止默認值提交到MySQL數據庫的行

該表格使用默認值,我正在尋找一種不提交包含默認值(對MySQL數據庫和通過電子郵件)的行的方式。因爲人們只能填寫一行(即Waged或Unwaged費率),所以我通常只需要提交一行信息。下面是表單的當前代碼。

感謝提前任何幫助,

尼克

HTML:

<form method="post" name="booking" action="bookingengine.php"> 
    <fieldset> 
     <h2>Waged/Organisation Rate</h2> 
     <p> 
      <input type="text" name="name[]"> 
      <input type="text" name="email[]"> 
      <input type="text" name="organisation[]"> 
      <input type="text" name="position[]"> 
     </p> 
     <p><span class="add">Add person</span></p> 
    </fieldset> 

    <fieldset> 
     <h2>Unwaged Rate</h2> 
     <p> 
      <input type="text" name="name2[]"> 
      <input type="text" name="email2[]"> 
     </p> 
     <p><span class="add">Add person</span></p> 
    </fieldset> 

    <p><input type="submit" name="submit" id="submit" value="Submit and proceed to payment page" class="submit-button" /></p> 

</form> 

腳本:

<script> 
$(function() { 
    var defaults = { 
     'name[]':   'Name', 
    'name2[]':   'Name', 
     'email[]':   'Email', 
    'email2[]':   'Email', 
     'organisation[]': 'Organisation', 
     'position[]':  'Position' 

    }; 

    // separating set and remove 
    // note that you could add "defaults" as an arg if you had different 
    // defaults for different fieldsets 
    var setDefaults = function(inputElements) { 
     $(inputElements).each(function() { 
      var d = defaults[this.name]; 
      if (d) { 
       // set with jQuery 
       // we don't need the data - just check on the class 
       $(this).val(d) 
        .addClass('default_value'); 
      } 
     }); 
    }; 

    var removeDefaults = function(inputElements) { 
     $(inputElements).each(function() { 
      if ($(this).hasClass('default_value')) { 
       $(this).val('') 
        .removeClass('default_value'); 
      } 
     }); 
    }; 

    setDefaults(jQuery('form[name=booking] input')); 

    $("span.add").click(function() { 
     // get the correct fieldset based on the current element 
     var $fieldset = $(this).closest('fieldset'); 
     var $inputset = $('p', $fieldset) 
       .first() 
       .clone() 
       .insertBefore($('p', $fieldset).last()); 
     // add a remove button 
     $inputset.append('<span class="remove">Remove</span>'); 
     setDefaults($('input', $inputset)); 
     // return false; (only needed if this is a link) 
    }); 

    // use delegate here to avoid adding new 
    // handlers for new elements 
    $('fieldset').delegate("span.remove", { 
     'click': function() { 
      $(this).parent().remove(); 
     } 
    }); 

    // Toggles 
    $('form[name=booking]').delegate('input', { 
     'focus': function() { 
      removeDefaults($(this)); 
     }, 
     'blur': function() { 
      // switch to using .val() for consistency 
      if (!$(this).val()) setDefaults(this); 
     } 
    }); 
}); 
</script> 

PHP:

<?php 

$emailFrom = "****"; 
$emailTo = "****"; 
$subject = "****"; 

$body = "****" . "\n\n"; 
$row_count = count($_POST['name']); 
$row_count2 = count($_POST['name2']); 

$values = array(); 

for($i = 0; $i < $row_count; $i++) { 
    // variable sanitation... 
    $name = trim(stripslashes($_POST['name'][$i])); 
    $email = trim(stripslashes($_POST['email'][$i])); 
    $organisation = trim(stripslashes($_POST['organisation'][$i])); 
    $position = trim(stripslashes($_POST['position'][$i])); 

    // this assumes name, email, and telephone are required & present in each element 
    // otherwise you will have spurious line breaks. 
    $body .= "Name: " . $name . " Email: " . $email . " Organisation: " . $organisation . " Position: " . $position . "\n\n"; 

    //prepare the values for MySQL 
    $values[] = '(\'' . $name . '\',\'' . $email . '\',\'' . $organisation . '\',\'' . $position . '\')'; 

} 

mysql_select_db($database, $connection); 

$query1 = "INSERT INTO conference (Name, Email, Organisation, Position) VALUES " . implode(',', $values); 

$result1 = mysql_query($query1); 
if (!$result1) { 
    die('Invalid query: ' . mysql_error()); 
} 


$body .= "****" . "\n\n"; 

$values = array(); 

for($i = 0; $i < $row_count; $i++) { 
    // variable sanitation... 
    $name = trim(stripslashes($_POST['name2'][$i])); 
    $email = trim(stripslashes($_POST['email2'][$i])); 

    // this assumes name, email, and telephone are required & present in each element 
    // otherwise you will have spurious line breaks. 
    $body .= "Name: " . $name . " Email: " . $email . "\n\n"; 

    //prepare the values for MySQL 
    $values2[] = '(\'' . $name . '\',\'' . $email . '\')'; 
} 
$query2 = "INSERT INTO conference (Name, Email) VALUES " . implode(',', $values2); 

$result2 = mysql_query($query2); 
if (!$result2) { 
    die('Invalid query: ' . mysql_error()); 
} 

// send email 
$success = mail($emailTo, $subject, $body, "From: <$emailFrom>"); 

// redirect to success page 
if ($success){ 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=/conference/payment.html\">"; 
} 
else{ 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=error.htm\">"; 
} 
?> 
+2

警告 - 您的代碼易受SQL注入影響! –

+0

謝謝。你能告訴我我需要做些什麼來使它更安全嗎? – Nick

+0

使用準備好的語句。 –

回答

0

我會在PHP中使用IF語句,假設您有任何驗證都沒有返回錯誤。

例如

// SET VARIABLES 
$name2 = $_POST['name2']; 
// SET CORRECT VALUES 
if($name2 == "Surname") { $name2 = ""; } 
// RUN DB FUNCTIONS 

我會爲每一個默認值允許我剛插入我需要什麼或者想從默認值,並刪除或更改其餘做到這一點。這也意味着用戶數據保持完整。

我希望這可以幫助您走上正確的軌道:)

+0

謝謝瑞安。我還沒有制定一個驗證方法(這是下一步!)。如果我按照您對所有默認值的建議進行操作,並且一行僅包含默認值,那麼是否會將空行添加到我的MySQL數據庫中?另外,對於PHP生成的電子郵件,我仍然會有一個只有默認值的行的條目,所以我仍然需要解決如何防止這種情況。 – Nick

+1

在我看來,我認爲你會以錯誤的方式進行編碼,我會分解每個部分並獨立進行開發,首先知道需要哪些數據以達到目的,這告訴我需要什麼驗證到位後,我會寫驗證,然後插入數據庫並最終發送電子郵件。這個命令的原因是,我可以在編程中正確處理數據,我可以先保存數據,如果電子郵件發生故障,數據已經存儲並且可以在需要時重新發送,然後通知誰需要知道。這對你有意義嗎? – Ryan

+0

謝謝瑞恩。我非常願意相信我的編碼方式是錯誤的!根據我想要的數據,對於用戶添加數據的任何給定行,需要完成所有字段(即沒有默認值),並且電子郵件應該是有效的。因爲我在每個_section_中都有1行,並且用戶可能只想完成1行,所以我需要解決如何處理這個問題。我可以爲每行添加一個刪除按鈕,然後獲取驗證代碼以阻止所有默認值,強制用戶刪除不需要的行,或者跳過僅使用默認值的行的驗證,並且不要將這些行提交到電子郵件/ MySQL的。 – Nick