如何根据事件数和日期从HTML表单向mysqli插入多个记录

时间:2019-04-13 09:48:44

标签: php html forms mysqli

我只是从PHP开始,所以请多多包涵。我有一个看似简单的任务,但我一直坚持。我试图寻找一些帮助,但找不到真正需要的东西。我需要做的是根据选定的记录数和选定的日期,从HTML表单向mysqli表插入多个记录。

这是一种重复事件,但没有任何日历或服务器端事件。只需将新记录插入现有表中即可。

我创建了如下形式的表格:

<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日(不含该天)的月份,则选择一个月?

所以我实际上想要实现的是一个基于以下假设的表格,如下所示:

  • pay_client_id:1001
  • 支付编号:5
  • 付款金额:150.25
  • 付款截止日期: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 个答案:

答案 0 :(得分:1)

这可能是解决您问题的方法:

// 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()函数的代码(在PHP: Adding months to a date, while not exceeding the last day of the month中归功于Crend King):

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 Sheikh的提醒。

答案 1 :(得分:1)

这是我的最终解决方案:

<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

所以最终结果正是我所需要的。

这也适用于不同的时间间隔:年,月,周,日,时,分和秒。

谢谢大家!

答案 2 :(得分:0)

您尝试了什么?似乎您只是想让我们为您完成工作,因为这些问题的研究不会太困难?

”如何根据pay_number字段插入记录数(例如4条记录,10条记录,24条记录等) 如何创建foreach循环,使每个插入的记录增加第+1个月,最多达到所选的pay_number字段的数目”

这是同一回事,您只需要创建一个循环,例如

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

关于日期的工作,您应该可以通过搜索类似“如何将日期增加1个月php”和“如何检查一个月是否包含一天”之类的内容轻松找到,然后使用循环比较

您应该对每个单独的问题进行一些重新评估,然后您将快速找到解决方案。我会给您一些有关进行多次插入的提示,一种好的方法是将它们存储在这样的数组中:

$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语句做类似的事情),如果您不这样做,则应该使用不知道在继续之前应该怎么研究

答案 3 :(得分:0)

尝试一下,

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>