2017-07-16 12 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 ... idフィールドを想定し

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は2行でも動作するはずです。$ iは0から5までの範囲です。 – inarilo

+0

代わりに項目名の数を調べるにはどうすればよいですか? –

答えて

0

はあなたのInvoicesテーブルの自動インクリメントの主キーです:挿入時に、その1つのままにしておきます。あなたの現在のコードは、常にすべてのリクエストに対して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. 
     "')"); 
} 

あなたのdb-connectionライブラリはわかりませんが、現在のところあなたのコードはSQLインジェクション攻撃を受けやすいです。準備文とパラメータ化を使用する必要があります。 Bobby Tablesの言葉をご覧ください。

+0

これはちょうど私にエラーを与える、SQLの注入防止それは私がまだ見ている何かです –

+0

誰がエラーをもたらした? PHP?データベース?どの行?どのようなメッセージですか? –

+0

PHP内部サーバーエラー –

0

未定義の項目数を入力できる実際の動的フォームを使用するには、JavaScriptが必要です。 しかし今のところ、私はこのような何かに自分のフォームを変更することをお勧め:ので、あなたの$ _POSTデータ構造は次のようになります

<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]'> 

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では、あなたがauto_incrementにidフィールドを設定することもできますので、あなたのクエリに含める必要はありません:とあなたのループは次のようになります。

のように、あなたが扱っているものを知りたい場合はvar_dump()としてください。

+0

もし私が知っていれば私はJavaScriptを使用する、私は少なくともPHPのいくつかの理解を持っています。私はまた、このソリューションを使用して内部サーバーエラーを取得し、forループで閉じる}を欠席しているためではありません –

+0

@Tÿlerはサーバーのエラーログをチェックしましたか? –

+0

残念ながら私のサーバーのエラーログにアクセスできません –

関連する問題