Вставить несколько строк с помощью Implode - PullRequest
1 голос
/ 06 октября 2011

Мне трудно заставить мой код работать. Я понимаю основную концепцию, но не могу заставить ее работать. У меня есть форма с несколькими строками:

<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. Спасибо.

Ответы [ 3 ]

1 голос
/ 06 октября 2011

Ваш $_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' из Submit.

Вы можете сделать это так, как хотите, но сначала вам нужно транспонировать ваши значения $_POST. Этот ответ имеет очень простую функцию транспонирования. (он называет ее "перевернутой по диагонали", но это типичная транспонирование).

Используя функцию из связанного ответа, вы можете сделать так:

$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'].")";
}
0 голосов
/ 06 октября 2011

Вы не хотите перебирать все переменные POST. Вместо этого вы хотите перебрать массивы $ _POST ["field_PK"].

0 голосов
/ 06 октября 2011

Попробуйте

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-инъекций, убедитесь, что ваш ввод отфильтрован!

...