【问题标题】:How do I add data from a form with a variable number of rows into a MySQL table?如何将具有可变行数的表单中的数据添加到 MySQL 表中?
【发布时间】:2011-08-03 23:01:30
【问题描述】:

我在网页上的两个部分中有一个表单。每个部分包含可变数量的行(用户可以添加更多行)。我有一个 PHP 页面,它将表单作为电子邮件处理,但我现在正在寻求扩展它,以便将信息添加到我拥有的 My SQL 数据库中。下面是表单和php处理页面的代码。

我已经开始在 PHP 页面底部包含用于将数据提交到 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>

这里是预订引擎.php:

<? include 'connection.php'; ?>

<?php

$emailFrom = "****";
$emailTo = "****";
$subject = "Booking for Soteria Conference";

$body = "The following people have booked for the Soteria Conference in Derby:" . "\n\n" . "Waged/Organisation Rate:" . "\n\n";
$row_count = count($_POST['name']);
$row_count2 = count($_POST['name2']);



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

$body .= "Unwaged Rate:" . "\n\n";

for($j = 0; $j < $row_count2; $j++)
{
  // variable sanitation...
  $name2 = trim(stripslashes($_POST['name2'][$j]));
  $email2 = trim(stripslashes($_POST['email2'][$j]));

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

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

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

?>

下面是connection.php的结构:

<?php

$hostname = "localhost";
$database = "****";
$username = "****";
$password = "****";

$conn = mysql_connect($hostname, $username, $password) or die ('Error connecting to mysql');
mysql_select_db($database);

?>

【问题讨论】:

    标签: php mysql forms variables


    【解决方案1】:

    我不确定你的意思。但是你的 HTML 代码应该更像这样:

    <p>
      <input type="text" name="persons[][name]">
      <input type="text" name="persons[][email]">
      <input type="text" name="persons[][organisation]">
      <input type="text" name="persons[][position]">
    </p>
    

    然后在你的 PHP 脚本结束时

    $values = array();
    foreach ($_POST['persons'] as $person) {
        // Sanitize your datas
        ...
        // SQL VALUES TO INSERT
        $values[] = '(' . $person['name'] . ',' . $person['email'] . ',' . $person['organisation'] . ',' . $person['position'] . ')';
    }
    $query = "INSERT INTO person (name, email, organization, position) VALUES " . implode(',', $values);
    

    同样的逻辑也适用于无工资率

    如果要保留 HTML,请编辑

     $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 . ')';
    }
    $query = "INSERT INTO person (name, email, organization, position) VALUES " . implode(',', $values);
    
     And for unwaged rate
    
     $values = array();
    
     for($i = 0; $i < $row_count; $i++) {
         // variable sanitation...
         $name = trim(stripslashes($_POST['name'][$i]));
         $email = trim(stripslashes($_POST['email'][$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
         $values[] = '(' . $name . ',' . $email . ')';
    }
    $query = "INSERT INTO person (name, email) VALUES " . implode(',', $values);
    

    【讨论】:

    • 谢谢。只是为了澄清。开启预约系统的页面可见here。我有一个包含 4 列的 MySQL 数据库:“名称”、“电子邮件”、“组织”和“职位”。我希望将表单上提交的数据(每个部分的行数可变)添加到数据库中。因为行数是可变的,所以我不确定如何构造 PHP 来输入所有必要的数据。
    • 我澄清了我的代码。您的页面很干净 :) 但是对于您的 html,您应该更像我告诉您的那样命名您的值。因此,您可以更轻松地在 php 代码foreach ($_POST['persons'] as $person) { ... } 中访问它们并且 SQL 请求应该看起来像我告诉您的那样,您可以插入几行,例如 `INSERT INTO tablename (col1, col2, col3) VALUES ( val1, val2, val3), (val1, val2, val3) ...等 不知道能不能回答你的问题?
    • 再次感谢。我想你在回答我的问题,但我对 PHP 不是很聪明,所以我还是有点困惑!您是否建议我将for($i = 0; $i &lt; $row_count; $i++)... 替换为foreach ($_POST['persons'] as $person) {....?在我看来,您不仅建议对我已有的代码进行添加(以便可以将数据提交到 MySQL),而且还建议更改构建电子邮件的代码。是这样吗?
    • 非常感谢。我们正在到达那里。我已经使用您包含的代码设置了所有内容,其中包含我的 HTML。电子邮件发送正常,但没有任何内容添加到我的 MySQL 数据库中。我现在已将 connection.php 包含在原始问题的底部,以防这是问题所在。我确信所有的设置都是正确的。在 PHP 主页面中,我只是在顶部有 &lt;? include 'connection.php'; ?&gt;。我认为这就是建立联系所需要做的一切。
    • 你的 SQL 请求怎么样?
    【解决方案2】:

    如果您需要多个输入,我建议使用多维数组(您目前正在这样做 - 但效果不佳):

    <fieldset id="1">
       <legend>Row 1</legend>
       <input type="text" name="name[1]"/>
       <input type="text" name="email[1]"/>
       <input type="text" name="address[1]"/>
    </fieldset>
    <fieldset id="2">
       <legend>Row 2</legend>
       <input type="text" name="name[2]"/>
       <input type="text" name="email[2]"/>
       <input type="text" name="address[2]"/>
    </fieldset>
    

    您可以使用 JavaScript(如 jQuery)来追加更多行(例如,如果他们单击按钮)。您可以使用字段集 ID 填充新行的数组键。这是我要使用的 PHP:

    foreach ($_POST['name'] as $row_number => $value){
       $query = 'INSERT INTO table (name' . $row_number . ', user_id) VALUES (' . $value . ', ' . $user_id . ')';  
    }
    

    如果您希望有 很多 行,您可以设置一个表格,将每个名称列为单独的行(带有 user_id 列)而不是表格中的列列出每个用户的行。所以不要这样做:

    user_id | name1 | name2 | name 3
    
    1 | James | John | Jimbob
    2 | Sandy | Samm | Sandra
    

    你可以这样做:

    id | order | user_id | value
    
    1 | 1 | 1 | James
    2 | 2 | 1 | John
    3 | 3 | 1 | Jimbob
    4 | 1 | 2 | Sandy
    5 | 2 | 2 | Samm
    6 | 3 | 2 | Sandra
    

    【讨论】:

    • 谢谢。只是为了澄清。可以在此处看到带有预订系统的页面。如您所见,我已经有一种向表单的每个部分添加行的方法,以及一种从表单中通过电子邮件发送数据的方法。现在我想将表单链接到我的 MySQL 数据库。我有一个包含 4 列的数据库:“姓名”、“电子邮件”、“组织”和“职位”。我希望将表单上提交的数据添加到数据库中。因为行数是可变的,所以我不确定如何构造 PHP 来输入所有必要的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多