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

你的$_POSTsuperglobal 实际上是这样的:

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 )您将循环遍历每个字段,而不是您预期的每一行字段。因此,你得到的大部分是空白(我猜你提交了一个空白表格来测试它),然后是来自 Submit 的“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 回答