2017-07-16 59 views
1

我目前正試圖設計一個發票生成器。本質上,頁面在表格的旁邊有輸入字段,允許您創建額外的行來輸入更多的數據。如何將數據插入到表中的多行使用相同輸入名稱變量的數據庫中?

我需要這個數據被存儲在數據庫中的未來被調用來變成一個可下載的.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

我將如何得到有關查找項目名稱的數量呢?經過數小時的研究,我發現了這個循環示例 –

回答

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內部服務器錯誤 –

0

要有一個真正的動態表單,可以輸入未定義的項目數,您需要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

不幸的是,我無法訪問我的服務器上的錯誤日誌 –

相關問題