【问题标题】:How to prevent rows with default values being submitted to MySQL database如何防止将具有默认值的行提交到 MySQL 数据库
【发布时间】:2011-10-22 09:18:57
【问题描述】:

我有一个包含 2 个部分的表单,每个部分从一行开始,可以使用脚本向其中添加更多行。你可以在this page底部看到表格。

表单使用默认值,我正在寻找一种不提交包含默认值的行的方法(通过电子邮件和 MySQL 数据库)。因为人们可能只完成一行(即以带薪或不带薪的费率),所以我通常只希望提交一行信息。表单的当前代码如下。

提前感谢您的帮助,

尼克

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\">";
}
?>

【问题讨论】:

  • 警告 - 您的代码容易受到 SQL 注入的影响!
  • 谢谢。你能告诉我我需要做些什么来使它更安全吗?
  • 使用准备好的语句。
  • @Nick 这里是文档的链接php.net/manual/en/book.pdo.php

标签: php forms default-value


【解决方案1】:

我会在 PHP 中使用 IF 语句,假设您的任何验证都没有返回错误。

例如

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

我会为每个默认值执行此操作,允许我从默认值中插入我需要或想要的内容,并删除或更改其余部分。这也意味着用户数据保持不变。

我希望这可以帮助您走上正轨:)

【讨论】:

  • 谢谢瑞恩。我还没有制定出验证方法(这是下一步!)。如果我按照您对所有默认值的建议进行操作,并且一行仅包含默认值,是否会在我的 MySQL 数据库中添加一个空白行?此外,对于 PHP 生成的电子邮件,我仍然会有一个只有默认值的行的条目,所以我仍然需要弄清楚如何防止这种情况发生。
  • 在我看来,我认为您以错误的方式进行编码,我会分解每个部分并独立使用它进行开发,首先要知道我需要什么数据用于什么目的,这个告诉我需要进行哪些验证,然后我将编写验证,然后插入数据库,最后发送电子邮件。这个订单的原因是我可以在编程中正确处理数据,我可以先保存数据,所以如果电子邮件出现故障,数据已经存储并且可以在需要时重新发送,然后通知需要知道的人。这对你有意义吗?
  • 谢谢瑞恩。我非常愿意相信我的编码方式错误!就我想要的数据而言,对于用户添加数据的任何给定行,所有字段都需要填写(即没有默认值)并且电子邮件应该是有效的。因为我在每个 section 中有 1 行,而用户可能只想完成 1 行,所以我需要弄清楚如何处理这个问题。要么我为每一行添加一个删除按钮,然后获取验证代码以阻止所有默认值,强制用户删除不需要的行,要么我跳过只有默认值的行的验证,并且不将这些行提交到电子邮件/ MySQL。
  • @Nick 我不相信鳕鱼总是有正确和错误的方式,只是更好而不是那么好的方式(除非你有编码错误!)。如果我是你,我会进行数据验证,在没有验证错误的情况下提交到处理脚本,该脚本将删除任何默认值,然后处理插入到 mySQL 的数据,然后发送电子邮件。我认为这样说很简单:) 很抱歉延迟回复你。希望我的反馈对您有所帮助。另外,如果您认为我的回答很好,您可以接受吗?干杯队友
  • 感谢 Ryan,很抱歉回复您的速度很慢。您防止将默认值输入 MySQL 数据库的方法效果很好。我还在根据您的建议实施一种验证方法,并试图找出如何最好地结合这些方法来获得我需要的数据。
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 2011-09-21
  • 2012-02-19
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多