1

コードを機能させるのに苦労しています。基本的な考え方は理解できたが、うまく動かない。複数の行を持つフォームがあります:

<form action="multiscript.php" method="post" id="form">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><input type="text" name="field_PK[]" id="field_PK" /></td>
<td><input type="text" name="sql_fk[]" id="sql_fk" /></td>
<td><input type="text" name="account_fk[]" id="account_fk" /></td>
<td><input type="text" name="field_code[]" id="field_code" /></td>
<td><input type="text" name="field_name[]" id="field_name" /></td>
<td><input type="text" name="field_px[]" id="field_px" /></td>
<td><input type="text" name="field_order[]" id="field_order" /></td>
</tr>
<tr>
<td><input type="text" name="field_PK[]" id="field_PK" /></td>
<td><input type="text" name="sql_fk[]" id="sql_fk" /></td>
<td><input type="text" name="account_fk[]" id="account_fk" /></td>
<td><input type="text" name="field_code[]" id="field_code" /></td>
<td><input type="text" name="field_name[]" id="field_name" /></td>
<td><input type="text" name="field_px[]" id="field_px" /></td>
<td><input type="text" name="field_order[]" id="field_order" /></td>
</tr>
</table>
<input type="submit" name="button" id="button" value="Submit" />
</form>

次に、mysql データベースに複数の行を挿入するフォームを処理するスクリプトを作成します。私のスクリプトは次のようになります。

<?php 
$values = array();?>
<?php
foreach( $_POST as $row ) { 
$values[] =  "(" . $row['field_PK'] . "," . $row['sql_fk'] . "," . $row['account_fk']. "," . $row ['field_code']. "," . $row['field_name']. "," . $row['field_px']. "," . $row['field_order'].")";
}
if( !empty($values) ) {
$query = "INSERT INTO `Table_fields` (field_PK, sql_fk, account_fk, field_code, field_name, field_px, field_order) VALUES ". implode(',',$values);

mysql_query($query);
}
?>

クエリを「印刷」すると次のようになるため、何か問題があることはわかっています。

INSERT INTO `Table_fields` (field_PK, sql_fk, account_fk, field_code, field_name, field_px, field_order) VALUES (,,,,,,),(,,,,,,),(,,,,,,),(,,,,,,),(,,,,,,),(,,,,,,),(,,,,,,),(S,S,S,S,S,S,S) 

誰かが私のフォームとスクリプトを見て、私が間違っていることと、implode メソッドを使用して複数の行をデータベースに挿入しない理由を教えてください。ありがとうございました。

4

3 に答える 3

1

スーパー$_POSTグローバルは実際には次のようになります。

Array
(
    [field_PK] => Array
        (
            [0] => value1
            [1] => value2
        )
    [sql_fk] => ...
    [account_fk] => ...
    [field_code] => ...
    [field_name] => ...
    [field_px] => ...
    [field_order] => ...
    [button] => Submit
)

foreach( $_POST as $row )そうするとき、期待どおりにフィールドの各行ではなく、各フィールドをループしています。そのため、ほとんどが空白になり (テストのために空白のフォームを送信したと推測されます)、次に [送信] から 'S' が返されます。

好きなようにできますが、$_POST最初に値を転置する必要があります。 この回答には、非常に単純な転置機能があります。(彼はこれを「flipDiagonally」と呼んでいますが、これは典型的な転置です)。

リンクされた回答の関数を使用すると、次のようにすることができます。

$transposed = transpose( $_POST );

foreach( $transposed as $index => $row ) { 
    $values[] = "(" . $row['field_PK'] . "," . $row['sql_fk'] . "," . $row['account_fk']. "," . $row ['field_code']. "," . $row['field_name']. "," . $row['field_px']. "," . $row['field_order'].")";
}
于 2011-10-06T19:50:24.537 に答える
0

試す

foreach($_POST as $index => $row)

とは対照的に

foreach($_POST as $values)

もちろん、SQL インジェクション攻撃などに関するよくある話を忘れないでください。

編集:

空かどうかに関係なく、すべてのフィールドがテキスト型であることを確認すると、送信されます。また、同じインデックスを共有しているため、よりエレガントな方法で入力できます。

foreach($_POST['field_pk'] as $index => $values)
{
    $values[] =  "(" . $_POST[$index]['field_PK'] . "," . $_POST[$index]['sql_fk'] . "," . $_POST[$index]['account_fk']. "," . $_POST[$index]['field_code']. "," . $_POST[$index]['field_name']. "," . $_POST[$index]['field_px']. "," . $_POST[$index]['field_order'].")";

}

正しく読まなかったために間違った答えを出してしまったことを認めなければなりません。同じ SQL インジェクション防止ルールが適用されます。入力がフィルタリングされていることを確認してください。

于 2011-10-06T19:33:10.827 に答える
0

すべての POST 変数を反復処理する必要はありません。代わりに、$_POST["field_PK"] 配列を反復処理します。

于 2011-10-06T19:34:54.070 に答える