Как вставить несколько записей в MySQL из HTML-формы на основе количества событий и даты - PullRequest
0 голосов
/ 13 апреля 2019

Я только начинаю с PHP, поэтому, пожалуйста, потерпите меня.У меня, казалось бы, легкое задание, с которым я застрял.Я пытался найти какую-то помощь, но не смог найти то, что мне нужно.И что мне нужно сделать, это вставить несколько записей в таблицу mysqli из формы HTML на основе выбранного количества записей и выбранной даты.

Это своего рода повторяющееся событие, но без каких-либо календарей или событий на стороне сервера.,Просто вставив новые записи в существующую таблицу.

Я создал форму, которая выглядит следующим образом:

<form action="" method="post" id="form_pay" name="form_pay" >           
<input type="text" name="pay_client_id[]" value="<?php echo $client_id; ?>" />
<input type="text" name="pay_amount[]"  />
<input type="text" name="pay_number[]" />
<input type="text" name="pay_due_date[]" />

<input type="submit" id="submit_pay" name="submit_pay" value="Create Table" />  
</form> 

, а таблица БД называется pay_schedules:

=====================================================  
pay_id | client_id |  amount |  due_date 
=====================================================  

и, наконец,начало php:

if(isset($_POST["submit_pay"])){    

$client_id      = $_POST['pay_client_id']; 
$amount     = $_POST['pay_amount']; 
$due_date   = date('Y-m-d',strtotime($_POST['pay_due_date'])); 
$pay_number     = $_POST['pay_number'];                                                             


//connection details
$servername = "localhost";
$username = "my_user";
$password = "my_password";
$dbname = "my_db";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } 

// insert into table
$sql =  "INSERT INTO pay_schedules 
            (client_id, amount, due_date) 
                VALUES ( '$client_id', '$amount', '$due_date' ) ";  

// messages
if ($conn->query($sql) === TRUE) { } else { $conn->error; }
$conn->close(); 

}

Очевидно, что PHP не завершен, и я знаю, что должен обернуть запрос в цикл, но я сталкиваюсь со следующими проблемами:

  • как вставить числозаписей на основе поля pay_number (например, 4 записи, 10 записей, 24 записи и т. д.)
  • как создать цикл foreach, который увеличивает месяц +1 с каждой вставленной записью до номера выбранного поля pay_number
  • все вставленные записи должны начинаться с due_date и иметь тот же день, но последовательный месяц (например, 2019-11-20, 2019-12-20, 2020-01-20), но как избежать проблем с последним днем ​​месяцаесли 28-е, 29-е, 30-е или 31-е выбраны для месяцев без этих дней?

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

  • оплата_client_id: 1001
  • номер_платы: 5
  • pay_amount: 150.25
  • pay_due_date: 2019-10-31
  • pay_id: автоинкремент PK

финальный стол:

=====================================================  
pay_id  | client_id |  amount   |  due_date 
=====================================================  
1   | 1001      | 150.00    | 2019-10-31
2   | 1001      | 150.00    | 2019-11-30    
3   | 1001      | 150.00    | 2019-12-31
4   | 1001      | 150.00    | 2020-01-31
5   | 1001      | 150.00    | 2020-02-29

Надеюсь, я объяснил свою проблему, поэтому, если кто-нибудь сможет мне здесь помочь, я буду очень признателен.

Ответы [ 4 ]

1 голос
/ 13 апреля 2019

это мое окончательное решение:

<form action="" method="post" id="form_pay" name="form_pay">
    <input type="text" name="pay_client_id" placeholder="ID" />
    <input type="text" name="pay_amount" placeholder="AMOUNT" />
    <input type="text" name="pay_number" placeholder="NUMBER" />
    <input type="text" name="pay_due_date" placeholder="DATE" />

    <input type="submit" id="submit_pay" name="submit_pay" value="Create Table" />
</form>


<?php


if (isset($_POST["submit_pay"])) {

    // post from form
    $client_id      = $_POST['pay_client_id'];
    $amount         = $_POST['pay_amount'];    
    $pay_number     = $_POST['pay_number'];


    //connection details
    $servername = "localhost";
    $username = "pm_app_user_2018";
    $password = "qEFoaD=m_g7Iny*jIg1^GLjJ";
    $dbname = "propertymode_app_db_2018";

    //connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }



    // time interval function come here
    // https://gist.github.com/pavlepredic/6220041#file-gistfile1-php 
    // by pavle predic      



    //due date from form
    $due_date       = new DateTime($_POST['pay_due_date']);

    //query
    for ($i = 0; $i < $pay_number; $i++) {

        //time interval function implementation
        $int            = new TimeInterval(0+$i, TimeInterval::MONTH);
        $future         = $int->addToDate($due_date, true); 

        // date string for mysqli
        $due_date_str   = $future->format('Y-m-d');

        // insert into table
        $sql =  "INSERT INTO pay_schedules 
            (client_id, amount, due_date)
                VALUES ( ?, ?, ? ) ";

        $stmt = $conn->prepare($sql);
        $stmt->bind_param("sss", $client_id, $amount, $due_date_str);
        //echo $sql;
        // messages
        $stmt->execute();
        $stmt->close();

        // checking results
        echo $future->format('Y-m-d'); echo ' | ';
    }

    //closing 
    $conn->close();
}
?>

Пример результата в таблице БД:

==================================================
pay_id      | client_id     | amount    | due_date
==================================================
1           | 10001C        | 100.25    | 2019-01-31
2           | 10001C        | 100.25    | 2019-02-28
3           | 10001C        | 100.25    | 2019-03-31
4           | 10001C        | 100.25    | 2019-04-30
5           | 10001C        | 100.25    | 2019-05-31
6           | 10001C        | 100.25    | 2019-06-30
7           | 10001C        | 100.25    | 2019-07-31
8           | 10001C        | 100.25    | 2019-08-31
9           | 10001C        | 100.25    | 2019-09-30
10          | 10001D        | 275.50    | 2019-01-12
11          | 10001D        | 275.50    | 2019-02-12
12          | 10001D        | 275.50    | 2019-03-12
13          | 10001D        | 275.50    | 2019-04-12

Итак, конечный результат - именно то, что мне было нужно.

Это также работает для различных интервалов: год, месяц, неделя, день, час, минута и секунда.

Спасибо всем!

1 голос
/ 13 апреля 2019

Это может быть возможным решением ваших проблем:

// change this to DateTime
$due_date   = new DateTime($_POST['pay_due_date']);
// ... other vars

$sql = '';
for($i = 0; $i < intval($pay_number); $i++) {
  $due_date_str = $due_date->format('Y-m-d');
  $sql .=  "INSERT INTO pay_schedules (client_id, amount, due_date) VALUES ( ?, ?, ?);";
  $stmt = $conn->prepare($sql);

  $stmt->bind_param("sss", $client_id, $amount, $due_date);
  $stmt->execute();
  $stmt->close();

  $due_date = add($due_date, 1);
}

Это код для (адаптированной) функции add() (кредиты для Crend King в PHP: добавление месяцев к дате, но не более последнего дня месяца ):

function add($date, $months) {    
  $start_day = $date->format('j');
  $date->modify("+{$months} month");
  $end_day = $date->format('j');

  if ($start_day != $end_day) {
    $date->modify('last day of last month');
  }

  return $date;
}

Пожалуйста, ознакомьтесь с PHP mysqli :: prepare в документации, чтобы избежать SQL-инъекций подготовленными операторами.

РЕДАКТИРОВАТЬ: Добавлены подготовленные заявления, спасибо @Shoyeb Шейх за напоминание.

0 голосов
/ 13 апреля 2019

Попробуйте это,

if (isset($_POST["submit_pay"])) {

    $client_id      = $_POST['pay_client_id'];
    $amount     = $_POST['pay_amount'];    
    $pay_number     = $_POST['pay_number'];


    //connection details
    $servername = "localhost";
    $username = "my_user";
    $password = "my_password";
    $dbname = "my_db";

    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    for ($i = 0; $i < $pay_number; $i++) {
        $due_date   = date('Y-m-t', strtotime("first day of +".($i)." months", strtotime($_POST['pay_due_date'])));
        // insert into table
        $sql =  "INSERT INTO pay_schedules 
            (client_id, amount, due_date)
                VALUES ( ?, ?, ? ) ";
        $stmt = $conn->prepare($sql);

        $stmt->bind_param("sss", $client_id, $amount, $due_date);
        //echo $sql;
        // messages
        $stmt->execute();
        $stmt->close();

    }

    $conn->close();
}

?>

<form action="" method="post" id="form_pay" name="form_pay">
    <input type="text" name="pay_client_id" />
    <input type="text" name="pay_amount" />
    <input type="text" name="pay_number" />
    <input type="text" name="pay_due_date" />

    <input type="submit" id="submit_pay" name="submit_pay" value="Create Table" />
</form>
0 голосов
/ 13 апреля 2019

что вы пробовали?Похоже, вы просто хотите, чтобы мы выполнили эту работу за вас, так как эти вопросы не слишком сложно исследовать?

"как вставить количество записей на основе поля pay_number (например, 4 записи,10 записей, 24 записи и т. Д.) Как создать цикл foreach, который увеличивает месяц +1 с каждой вставленной записью до номера выбранного поля pay_number "

это одно и то же, вам просто нужно создать цикл такойкак

while($i <= $payNumber){
//build your query
} 

, что касается вашей работы с датами, вы можете легко найти это, прибегая к помощи чего-то вроде «как увеличить дату на 1 месяц php» и «как проверить, содержит ли месяцдень "или что-то, а затем используйте сравнение внутри вашей петли

Вы должны сделать некоторые исследования для каждой отдельной проблемы, и вы быстро найдете решение.Я дам вам 1 совет по выполнению нескольких вставок, но хороший способ сделать это состоит в том, чтобы сохранить их в массиве, подобном следующему:

$inserts= [];
$values = [];
`$i` = 0;
while(condition) {
   $inserts[] = "(:value1_$i,:value2_$i,:value3_$i)";
   $values[':value1_$i'] =$value1; //..... (etc) 
}

, тогда вы можете использовать implode(',',$inserts) для создания строки запроса ивыполнить массив

execute ($ values);

обратите внимание, что я использовал метки здесь, чтобы побудить вас использовать подготовленный оператор (это настроено для PDO - но я уверен, что выможет сделать что-то похожее с выражениями mysqli_prepared), которые вы, безусловно, должны использовать, если не знаете, как следует исследовать это, прежде чем идти дальше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...