Как добавить данные из формы с переменным количеством строк в таблицу MySQL? - PullRequest
0 голосов
/ 01 августа 2011

У меня есть форма в двух разделах на веб-странице.Каждый раздел содержит переменное количество строк (пользователь может добавить больше строк).У меня есть страница PHP, которая обрабатывает форму как электронное письмо, но сейчас я хочу расширить ее, чтобы информация добавлялась в имеющуюся у меня базу данных My SQL.Ниже приведен код формы и страницы обработки php в ее нынешнем виде.

Я начал включать код для отправки данных в таблицу MySQL внизу страницы PHP, но я не уверенкак это сделать, учитывая, что в двух разделах есть переменное количество строк, и будем благодарны за любую помощь в получении этой работы.

Вот 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\">";
}

?>

Вот структура соединения .php:

<?php

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

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

?>

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Я не уверен, что вы имеете в виду.Но ваш 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);
0 голосов
/ 01 августа 2011

Если вам нужно несколько входов, я рекомендую использовать многомерные массивы (что вы в настоящее время делаете, но не эффективно):

<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), чтобы добавить больше строк (еслиони нажимают на кнопку, например).Вы можете использовать идентификатор набора полей, чтобы заполнить ключ массива для новой строки.Вот 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...