Php html动态表单,通过post和insert mysql传递多个值
我有这个数据库 这个表单是从数据库动态生成的Php html动态表单,通过post和insert mysql传递多个值,php,mysql,post,foreach,form-submit,Php,Mysql,Post,Foreach,Form Submit,我有这个数据库 这个表单是从数据库动态生成的 <table border="1" cellspacing="0" cellpadding="6"> <tr bgcolor="#CCCCCC"> <td><strong>product id</strong></td> <td><strong>product name</strong></td
<table border="1" cellspacing="0" cellpadding="6">
<tr bgcolor="#CCCCCC">
<td><strong>product id</strong></td>
<td><strong>product name</strong></td>
<td><strong>product price</strong></td>
<td><strong>quantity</strong></td>
</tr>
<form method="post" action="insert.php">
<?php
$query = $dbh->query('SELECT * FROM products');
$results = $query->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $row)
{
?>
<tr>
<td><?php echo $row['product_id']; ?></td>
<td><?php echo $row['product_name']; ?></td>
<td><?php echo $row['product_price']; ?></td>
<td><input name="quantity" type="text" value="0"></td>
</tr>
</form>
<?php } ?>
</table>
<br>
<input type="submit" value="Add Records">
产品id
产品名称
产品价格
数量
表单中的数量是一个文本框,因此我可以修改它。
我想输入数量并按下按钮在order_products表中插入值(包括数量)
1) 如何通过post将所有数量和产品id(以及其他)传递到下一页?(直到现在我才知道如何传递单个值)
2) 有没有更好的方法来实现它
3) insert语句应该在同一页中,还是在我获取post变量的页面中
db方案
谢谢
Rob1)首先,您必须将
封装在一个表单中(将
标记移动到
之后,现在的方式是在第一次迭代时关闭
标记),然后通过HTTP POST方法提交。然后,根据您的模式,除了数量
之外,您必须插入的唯一字段是产品id
,您可以在隐藏字段内指定该值,如:
<?php
echo "<input type='hidden' name='pid_$row['product_id']' value='$row['product_id']'>";
echo $row['product_id'];
?>
2)这取决于您的发展重点。有一些框架可以简化您的流程。我建议您将所有DB查询和连接数据保存在一个DB helper类中,并在需要时require
it
3)既然您使用的是PDO,我假设您有一个OOP设计,这意味着在DB helper类中这样做。接收HTTP请求的页面必须
要求您的助手并处理$\u POST
对其查询方法的参数进行解析。别忘了。我建议将产品id放在一个隐藏的表单元素中,如下所示:
<tr>
<input type='hidden' name='product_id' value='<?php echo $row['product_id']; ?>'/>
<td><?php echo $row['product_id']; ?></td>
<td><?php echo $row['product_name']; ?></td>
<td><?php echo $row['product_price']; ?></td>
<td><input name="quantity" type="text" value="0"></td>
</tr>
然后,在插入代码中,您必须查找$\u POST中键以“quantity”开头的所有项目,如果这些项目不为零,则在键前缀“quantity”后获取整数NNN,并获取相应的产品id NNN值以进行插入。使用隐藏元素,您可以将数据发布到第二页。使用计数器变量,您可以添加动态表单元素并将其发布到第二页
<form method="post" action="test2.php">
<table border="1" cellspacing="0" cellpadding="6">
<tr bgcolor="#CCCCCC">
<td><strong>product id</strong></td>
<td><strong>product name</strong></td>
<td><strong>product price</strong></td>
<td><strong>quantity</strong></td>
</tr>
<?php
$query = $con->query('SELECT * FROM product'); //your query goes here
$results = $query->fetchAll(PDO::FETCH_ASSOC);
$i=0; //counter variable
foreach ($results as $row)
{
?>
<tr>
<td>
<?php echo $row['prod_id']; ?>
<input type="hidden" name="prod_id<?php echo $i; ?>" value="<?php echo $row['prod_id']; ?>" />
</td>
<td>
<?php echo $row['prodname']; ?>
<input type="hidden" name="name<?php echo $i; ?>" value="<?php echo $row['prodname']; ?>" />
</td>
<td>
<?php echo $row['price']; ?>
<input type="hidden" name="price<?php echo $i; ?>" value="<?php echo $row['price']; ?>" />
</td>
<td><input name="quantity<?php echo $i; ?>" type="text" value="0"></td>
</tr>
<?php
$i++; //increment counter variable
}
?>
<input type="hidden" name="rows" id="rows" value="<?php echo $i; ?>" />
</table>
<br>
<input type="submit" value="Add Records">
</form>
产品id
产品名称
产品价格
数量
第二点和第三点很清楚。关于第1点)我知道我必须更改名称(quantity1、quantity2等),但我的问题是如何将所有这些值传递到post以及插入到数据库后。如果您的值被分配到隐藏字段,则您的$\u post
将与数量
字段一起接收它们!然后,在action php页面上,您所要做的就是迭代$\u POST
,并将其值作为绑定参数传递给您准备好的语句(我假设您知道如何做,如果不知道,将对此进行研究,因为它在php.net和其他教程站点上有很好的文档记录)在DB Helper上构建一个函数,该函数使用提供的值数组作为参数来准备INSERT语句。搜索绑定参数
,它将出现在您的面前。您的代码易受SQL注入攻击。此外,OP希望插入到order_产品中,而不是产品中。若用户试图使用恶意sql字符串通过http post外部输入验证,则可能会使其数据库崩溃。
$i = 1;
foreach ($results as $row)
{
$product_id_name = 'product_id_'.$i;
$quantity_name = 'quantity_'.$i;
... echo your table row, using $product_id_name in the hidden element, and $quantity_name in your text input
$i++;
}
<form method="post" action="test2.php">
<table border="1" cellspacing="0" cellpadding="6">
<tr bgcolor="#CCCCCC">
<td><strong>product id</strong></td>
<td><strong>product name</strong></td>
<td><strong>product price</strong></td>
<td><strong>quantity</strong></td>
</tr>
<?php
$query = $con->query('SELECT * FROM product'); //your query goes here
$results = $query->fetchAll(PDO::FETCH_ASSOC);
$i=0; //counter variable
foreach ($results as $row)
{
?>
<tr>
<td>
<?php echo $row['prod_id']; ?>
<input type="hidden" name="prod_id<?php echo $i; ?>" value="<?php echo $row['prod_id']; ?>" />
</td>
<td>
<?php echo $row['prodname']; ?>
<input type="hidden" name="name<?php echo $i; ?>" value="<?php echo $row['prodname']; ?>" />
</td>
<td>
<?php echo $row['price']; ?>
<input type="hidden" name="price<?php echo $i; ?>" value="<?php echo $row['price']; ?>" />
</td>
<td><input name="quantity<?php echo $i; ?>" type="text" value="0"></td>
</tr>
<?php
$i++; //increment counter variable
}
?>
<input type="hidden" name="rows" id="rows" value="<?php echo $i; ?>" />
</table>
<br>
<input type="submit" value="Add Records">
</form>
for($i=0;$i<=$_POST['rows'];$i++)
{
$prodid = $_POST['prod_id'.$i];
$pname = $_POST['name'.$i];
$pprice = $_POST['price'.$i];
$con ->exec("insert into product(prod_id,prodname,price)values('$prodid', '$pname','$pprice' )" );
}