2011-08-08 93 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