2016-05-18 6 views
0

私が直面している課題に対して、誰かが私に提案を与えることを望んでいます。私は私が想像しているようにこれを行うことができるとは確信していないので、より経験豊富な人からアドバイスを探しています。フォーム全体をMySQLデータベースの行にルーピングしますか?

私は約20列のデータベーステーブルを持っています。残念ながら私はそれを変更することはできません。目標はフォームの提出を受け取り、このテーブルに挿入することです。だから私が持っているフィールド名は、データベースの列名と同じです。

従来の$ varWhatever = $ _POST ['whatever']の代わりに、フォーム全体(キーと値)をプルするだけです。 20回。 foreach($ _POST as $ key => $ value)

私の質問は、可能な限り、キーと値を置く方法でforeachループを実行するにはどうすればいいですか?単一のSQL文に変換しますか?

これも可能ですか、上記のより伝統的な方法に戻ってください。

ループを開始する前に、空の行を作成してIDを取得し、ループ内でIDと一致する行で更新クエリを実行することができます。しかし、うんざりする。

+2

。 SQLインジェクションの脆弱性を避けるためには、これらの文字列をホワイトリストに登録する必要があります。また、より洗練されたコードがあります。 –

+0

@ Don'tPanic:引用符で囲んでエスケープします(ただし、エスケープするには文字セットを認識する必要があるため、正しく行うのは難しい)。 – eggyal

答えて

0

ここに私が思いついた解決策があります。最初に、予想される入力のホワイトリストとして機能するフィールド名の配列を定義する必要があります。次に、その配列をループして、送信された値をバインドするためのパラメータ配列を作成します。 implodeクエリを構築するときにコンマで配列を指定します。

$fields = array('field1','field2','field3'); 

$binds = array(); 
foreach ($fields as $field) { 
    $binds[":$field"] = $_POST[$field]; 
} 

$sql = "INSERT INTO table_name (" . implode(',',$fields) . ") VALUES (" . implode(',',array_keys($binds)) . ")"; 

$db->prepare($sql); 
$db->execute($binds); 

これは、PDOを使用していることを前提としています。

+1

カラム名の情報スキーマの問い合わせから '$ fields'を得ることができます。 – eggyal

+0

@eggyalそれは良い考えですが、余分な作業になるようです。たぶんあなたは一度それをクエリし、どこかに列名をキャッシュすることができます。 –

+0

ありがとう、これは役立ちます。 – lpangm03

0

はい、すべてのキーをループすることができます(たとえば、array_keysを実行します)。しかし、提出パラメータを控えめに取ってSQLクエリに入れることはお勧めできません。

代わりに、私はフォームのすべての有効な列のリストを保持し、各値にサニタイズが必要であることを覚えておいてください。例えば

:限り$ _POSTキーからあなたのSQL文字列に列名を追加すると、直接それを行うには安全ではありません

<?php 
$columns = array('column1', 'column2', 'column3', …); 
foreach ($columns as $column) { 
    if (!isset($_POST[$column])) { 
     die("No data for column $column\n"); 
    } 
} 
if (!check_csrf($_POST['csrt_token'])) { … } 

# (setup database connection) 

$SQL = "INSERT INTO table_name (" . implode(", ", $columns) . ") VALUES ("; 
foreach ($column as $column) { 
     $SQL .= "'" . $mysqli->real_escape_string($_POST[$column]) . "',"; 
} 
$SQL[strlen($SQL)-1] = ')'; 
$mysqli->query($SQL); 
関連する問題