我只是从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_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
我希望我能解释我的问题,所以如果有人可以在这里帮助我,我将不胜感激。
答案 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>