2017-02-15 13 views
0

私は複数列のHTMLフォームからMYSQLデータベースに渡される複数の行を挿入するために、以下の配列を作成しました。私が何をしているのか分からないのは、複数の行を正しく挿入するために既に構築したものを変更する方法です。私は以下のコードと例を提供しました。投稿されたPHP配列をMYSQLに挿入

<?php 
     include 'connect.php'; 
      $records= array(
       'palid' => $_POST['LPN'], 
       'auditor' => $_POST['ANAME'], 
       'itnum' => $_POST['Part'], 
       'ordid' => $_POST['Order'], 
       'pckusr' => $_POST['Picker'], 
       'expected' => $_POST['Eaches'], 
       'actual' => $_POST['Actual']); 

    $keys = implode(', ', array_keys($records)); 

    $col = array(); 
    foreach ($records as $rowValues) { 
     foreach ($rowValues as $key => $rowValue) { 
      $rowValues[$key] = $rowValues[$key]; 
     } 

     $col[] = "(" . implode(', ', $rowValues) . ")"; 
    } 

    $query = "INSERT INTO audit ($keys) VALUES " . implode (', ', $col); 
    echo $query; 

    $result = mysqli_query($connection, $query) or die(mysqli_error($connection)); 

    ?> 

echo $ query;下の図は、連結された個々の行ではなく、連結された各列の3行すべての値を示しています。

INSERT INTO audit(palid, auditor, itnum, ordid, pckusr, expected, actual) VALUES(0010070382, 0010070382, 0010070382), (aud01, aud01, aud01), (2616M, 2216T, 1216F), (5167-2, 5167-2, 5167-2), (LION, LION, LION), (30, 300, 402), (30, 300, 402) 

それは次のようになりますと:

INSERT INTO audit(palid, auditor, itnum, ordid, pckusr, expected, actual) VALUES(0010070382, aud01, 2616M, 5167-2, LION, 30, 30), (0010070382, aud01, 2216T, 5167-2, LION, 300, 300), (0010070382, aud01, 1216F, 5167-2, LION, 402, 402) 

私が使うのvar_dump($記録)。配列は以下の情報を渡しますが、3つの行をMYSQLデータベースに渡すために関連する各グループに情報をどのように作成するかをまだ分かりません。

array(7) 
    { 
     ["palid"] => array(3) 
     { 
      [0] => string(10) "0010070382" 
      [1] => string(10) "0010070382" 
      [2] => string(10) "0010070382" 
     } 
     ["auditor"] => array(3) 
     { 
      [0] => string(5) "aud01" 
      [1] => string(5) "aud01" 
      [2] => string(5) "aud01" 
     } 
     ["itnum"] => array(3) 
     { 
      [0] => string(5) "2616M" 
      [1] => string(5) "2216T" 
      [2] => string(5) "1216F" 
     } 
     ["ordid"] => array(3) 
     { 
      [0] => string(6) "5167-2" 
      [1] => string(6) "5167-2" 
      [2] => string(6) "5167-2" 
     } 
     ["pckusr"] => array(3) 
     { 
      [0] => string(4) "LION" 
      [1] => string(4) "LION" 
      [2] => string(4) "LION" 
     } 
     ["expected"] => array(3) 
     { 
      [0] => string(2) "30" 
      [1] => string(3) "300" 
      [2] => string(3) "402" 
     } 
     ["actual"] => array(3) 
     { 
      [0] => string(2) "30" 
      [1] => string(3) "300" 
      [2] => string(3) "402" 
     } 
    } 
+0

はXSS http://stackoverflow.com/questions/568995/best-way-to-defend-against-mysql-injection-and-cross-site-scripting?answertab=active#tab-topを忘れてはいけません –

+1

**警告**:mysqliを使用する場合は、[パラメータ化されたクエリ](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と['bind_param']( http://php.net/manual/en/mysqli-stmt.bind-param.php)を使用してクエリにユーザーデータを追加します。 **重大な[SQLインジェクションのバグ](http://bobby-tables.com/)を作成したため、文字列の補間または連結を使用してこれを実行しないでください。 ** '$ _POST'や' $ _GET'データを直接クエリに入れないでください。誰かがあなたのミスを悪用しようとすると、非常に危険です。 – tadman

答えて

2

あなただけのデータベースクエリにユーザーが提供する情報をジャミングない、prepared statementsでこれをやるべき。それは非常に悪い考えです!このPDOコードを試してみてください:あなたは、各変数のプレースホルダ?でクエリを構築している

<?php 
$db_name = ""; 
$db_user = ""; 
$db_pass = ""; 
$db = new PDO("mysql:host=localhost;dbname=$db_name", $db_user, $db_pass); 

$stmt = $db->prepare("INSERT INTO audit(palid, auditor, itnum, ordid, pckusr, expected, actual) VALUES (?, ?, ?, ?, ?, ?, ?)"); 

// refactor the POST arrays 
$recordcount = count($_POST["LPN"]); 
for ($i = 0; $i < $recordcount; $i++) { 
    $records[] = [ 
     $_POST["LPN"][$i], 
     $_POST["ANAME"][$i], 
     $_POST["Part"][$i], 
     $_POST["Order"][$i], 
     $_POST["Picker"][$i], 
     $_POST["Eaches"][$i], 
     $_POST["Actual"][$i], 
    ]; 
} 

foreach ($records as $record) { 
    $stmt->execute($record); 
} 

。ループ内では、そのクエリが実行され、これらのプレースホルダーが正しい値に置き換えられます。これはまた、安全でない文字をエスケープする処理も行います。既存のコードでは、誰もあなたのデータベースを簡単に消去することができます。

+0

プレースホルダーに名前を付けることができるので、PDOはこの仕事にとって本当にうれしいです。たくさんのインサートを羅列して、それを一つずつ実行させるのは簡単です。 – tadman

+1

miken32あなたは岩です。 PDOとSQLインジェクションについての助けとヒントをありがとう。 –

-2

@ miken32は、SQLインジェクションを避けるための最も重要な要素の1つを指摘しました。これは間違いなくあなたが使用すべきものです。しかし、これを解決する方法が不思議である場合のために、実装のためのトリックを行うべき解決策がここにあります。

include 'connect.php'; 
    $records= array(
      'palid' => $_POST['LPN'], 
      'auditor' => $_POST['ANAME'], 
      'itnum' => $_POST['Part'], 
      'ordid' => $_POST['Order'], 
      'pckusr' => $_POST['Picker'], 
      'expected' => $_POST['Eaches'], 
      'actual' => $_POST['Actual'] 
    ); 

    $col = []; 
    $keys = []; 
    $valuesForInsert = []; 

    foreach ($records as $recordKey => $rowValues) { 
     $keys[] = $recordKey; 
     foreach ($rowValues as $key => $rowValue) { 
      $valuesForInsert[$key][] = $rowValues[$key]; 
     } 
    } 

    foreach ($valuesForInsert as $rowValue) { 
     $col[] = "(".implode(', ', $rowValue).")"; 
    } 

    $query = "INSERT INTO audit ($keys) VALUES ".implode(', ', $col); 
    echo $query; 
+1

SQLインジェクションにリップサービスを提供することはできません。それからあなたの答えでそれを完全に無視して無視してください。これは悪いコードを化石化するだけです。これは、 'bind_param'呼び出しで正しく修正できます。 – tadman

+0

実際、答え自体は悪くないと思います。あなたが使用することが容認されるときには*強調してください。あなたが入力を制御していると確信できる環境では、実際には関係ありません。パブリックフェイシングや公的にアクセス可能な設定では、これは災害のためのレシピです。ドロップテーブルコメント – ppajer

+0

誰かが新しい何かを学んでいるときに、彼は解決しようとしている特定の問題について質問しています。私は彼のビジョンに従おうとしています、なぜですか?私は彼に言うことができるので、彼の人!これはコントローラに行く必要があります。これをエスケープする必要があります。これを作業者に割り当てることができます。そして...はい、ここで変えることができるものがたくさんあります。しかし、私はちょうどその問題の考え方でこの問題を解決する方法に答えました。また、私はこのコードがSQLInjectionsの影響を受けやすいと指摘しました。学習を楽にする。 – Galileox86

関連する問題