如何将数据插入到表中的多行使用相同输入名称变量的数据库中?

问题描述:

我目前正试图设计一个发票生成器。本质上,页面在表格的旁边有输入字段,允许您创建额外的行来输入更多的数据。如何将数据插入到表中的多行使用相同输入名称变量的数据库中?

我需要这个数据被存储在数据库中的未来被调用来变成一个可下载的.pdf

我现在的问题是如何从表中的数据到数据库中。到目前为止,我的代码只输入第一行数据。我对此有完全错误的看法吗?

<tr id="item0" class="item"> 
    <td> 
     1 
    </td> 
    <td> 
     <input name='item_name[0]' type='text' placeholder='Name' class='form-control input-md' /> 
    </td> 
    <td> 
     <input name='quantity[0]' type='text' placeholder='0' class='form-control input-md' /> 
    </td> 
    <td> 
     <input name='price[0]' type='text' placeholder='&pound;0.00' class='form-control input-md' /> 
    </td> 
    <td> 
     total 
    </td> 
</tr> 
<tr id="item1" class="item"> 
    <td> 
     1 
    </td> 
    <td> 
     <input name='item_name[1]' type='text' placeholder='Name' class='form-control input-md' /> 
    </td> 
    <td> 
     <input name='quantity[1]' type='text' placeholder='0' class='form-control input-md' /> 
    </td> 
    <td> 
     <input name='price[1]' type='text' placeholder='&pound;0.00' class='form-control input-md' /> 
    </td> 
    <td> 
     total 
    </td> 
</tr> 

,而PHP的...

if (isset($_POST['submit'])) { 
    print_r(array_values($_POST['item_name'])); 
} 
$i = 0; 
foreach($_POST as $val) { 
    $item_name = $_POST['item_name'][$i]; 
    $quantity = $_POST['quantity'][$i]; 
    $price = $_POST['price'][$i]; 

    $sqlConnect - > query("INSERT INTO `Invoices` (`id`, `item_name`, `quantity`, `price`) VALUES ('".$i. 
     "', '".$item_name. 
     "', '".$quantity. 
     "', '".$price. 
     "')"); 
    $i++; 
} 
} 
else { 
    die('No item data to process'); 
} 
+3

为什么你迭代'$ _POST'? '$ _POST'中的键数量可能不等于您的项目名称的数量。 –

+0

循环错误,但@u_mulder它应该仍然适用于两行 - $我将范围从0到5. – inarilo

+0

我将如何得到有关查找项目名称的数量呢?经过数小时的研究,我发现了这个循环示例 –

假设id字段是你Invoices表的自动递增的主键:离开的那一个,插入时。您当前的代码总是试图为每个请求插入1或2作为id。

如果它不是一个自动增量,你需要在你的应用程序中生成一个有效的id,$i本身不会做到这一点。

foreach ($_POST['item_name'] as $index => $itemName) { 
    $quantity = $_POST['quantity'][$index]; 
    $price = $_POST['price'][$index]; 

    // DONT DO THIS! Its prone to SQL injection 
    $sqlConnect->query("INSERT INTO `Invoices` (`item_name`, `quantity`, `price`) VALUES ('".$itemName. 
     "', '".$quantity. 
     "', '".$price. 
     "')"); 
} 

不知道你的数据库连接库是什么,但目前你的代码很容易发生SQL注入攻击。您应该使用准备好的语句和参数化。请看Bobby Tables说什么。

+0

这只是给了我一个错误,至于SQL注入预防这是我还没有看到的东西 –

+0

谁给出了一个错误? PHP的?数据库?什么线?什么信息? –

+0

php内部服务器错误 –

要有一个真正的动态表单,可以输入未定义的项目数,您需要JavaScript。 但现在,我会建议改变你的形式是这样的:

<input name='items[1][name]'> 
<input name='items[1][quantity]'> 
<input name='items[1][price]'> 
<!-- and for second item: --> 
<input name='items[2][name]'> 
<input name='items[2][quantity]'> 
<input name='items[2][price]'> 

所以你的$ _ POST数据结构是这样的:

items:[ 
     [ 
      quantity: 
      price: 
      name: 
     ], 
     [ 
      quantity: 
      price: 
      name: 
     ], 
] 

这样,您就可以遍历项目,而不是项目属性。和你的循环将是这样的:

if (isset($_POST['submit'])) { 
    var_dump($_POST); 
    foreach($_POST['items'] as $item){ 
     $sql = 'INSERT INTO invoices (name, quantity, price) 
       VALUES ($item['name'], $item['quantity'], $item['price'])'; 
     $sqlConnect->query($sql); 
    } 
} else { 
    die('No item data to process'); 
} 

注意,在MySQL中,你可以id字段设置为auto_increment,所以没必要把它列入您的查询。

另外,使用var_dump()知道你在处理什么,如var_dump($_POST);

+0

我会使用JavaScript,如果我知道如何,我至少有一些理解的PHP。我也使用这个解决方案得到了一个内部服务器错误,这不是因为你错过了for循环中的关闭} –

+0

@Tÿler你有没有检查过服务器的错误日志? –

+0

不幸的是,我无法访问我的服务器上的错误日志 –