Как вставить данные в многостолбцовую базу данных из индексированного массива ввода текста имени PHP, используя один foreach?

0

Сначала я надеюсь, что Вы понимаете вопрос, который я задал, потому что я не англичанин. Я делаю простую таблицу футбольной лиги. Поэтому я хочу записать все цели команды между домашней командой и командой гостей, включая помощь игроков и собственные цели, используя форму PHP. проблема в том, что я хочу отправить их в ОДНОМ foreach() вместо foreach() для вставки целей, foreach() для вставки голевых передач и foreach() для вставки собственных целей.

Я пытался использовать foreach(), и я только знаю, что это для ОДНОЙ индексированной переменной массива или ассоциативного массива;

Код цели ввода формы, вспомогательных программ и собственной цели (это из JSON encode):

'.... <td><input class="goal-home form-control col-6" name="goal_home['+data.player[i].id_player+']" type="number" value="0"></td>'+
'<td><input class="assist-home form-control col-6" name="assist_home['+data.player[i].id_player+']" type="number" value="0"></td>'+
'<td><input class="owngoal-home form-control col-6" name="owngoal_home['+data.player[i].id_player+']" type="number" value="0"></td>'+ ....

Код для получения данных со стороны домашней команды:

$goal_home = $this->input->post('goal_home');
$assist_home = $this->input->post('assist_home');
$owngoal_home = $this->input->post('owngoal_home');

И я попытался вставить данные в базу данных примерно так:

 //The code for inserting each player goal
    foreach ($goal_home as $goal => $val) {
                        $this->m->query("UPDATE tbl_player 
                                        SET goal = (goal + $val)
                                        WHERE id_player = $goal
                                        ");
                    }
    //The code for inserting each player assist
    foreach ($assist_home as $assist => $val) {
                        $this->m->query("UPDATE tbl_player 
                                        SET assist = (assist + $val)
                                        WHERE id_player = $assist
                                        ");
                    }
    //The code for inserting each player own goals
    foreach ($owngoal_home as $owngoal => $val) {
                        $this->m->query("UPDATE tbl_player 
                                        SET owngoal = (owngoal + $val)
                                        WHERE id_player = $owngoal
                                        ");
                    }

но я ожидаю что-то вроде этого (я знаю, что это неправильно):

    foreach (($goal_home as $goal => $val1), ($assist_home as $assist => $val2), ($owngoal_home as $owngoal => $val3)) {

$this->m->query("UPDATE tbl_player 
                      SET goal = (goal + $val1), assist = (assist + $val2) ,owngoal = (owngoal + $val3)
                      WHERE id_player = $goal
                     ");

Я знаю, что это было неправильно, но я не знаю лучшего способа объяснить это, я искал подобную проблему, но никто не может решить, или, может быть, я не понимаю. Спасибо

  • 0
    Назовите поля формы по-разному, чтобы создать другую структуру массива. name="data[0][foo]" , name="data[0][bar]" , name="data[1][foo]" , name="data[1][bar]" и т. д. Затем вы можете легко перебрать $_POST['data'] и получить доступ к клавишам foo и bar внутри цикла для каждого элемента.
Теги:
codeigniter

2 ответа

0

Так много обновлений. Это очень неэффективно. Я бы собрал все данные в виде значений SQL, создал бы временную таблицу со всеми данными, а затем обновил бы основную таблицу.

Ваши входные данные имеют одинаковые индексы. Хорошо! Сбор данных:

# assumeing, that $goal_home, $assist_home and $owngoal_home exist
$keys = array_keys($goal_home);
$values = '';

foreach ( $keys as key )
{
    # assume, that all value are integers.
    # '%d' avoids SQL injection

    $key = intval($key);
    $values .= sprintf(',"%s",%d,%d,%d)',
                 $key, $goal_home[$key],
                 $assist_home[$key], $owngoal_home[$key] );
}
$values = substr($values,1); # delete first comma

Теперь мы создаем таблицу TEMPORARY, которая автоматически удаляется после закрытия соединения с базой данных. Но сначала мы отбрасываем таблицу, чтобы разрешить многократное использование.

$this->m->query("DROP TABLE IF EXISTS update_temp");
$query = <<< __EOT__
    CREATE TEMPORAY TABLE update_temp
    (
        id_player int not null primary key,
        goal      int not null,
        assist    int not null,
        owngoal   int not null
    )
__EOT__;
$this->m->query($quote);

Теперь мы заполняем таблицу:

$query = <<< __EOT__
    INSERT INTO update_temp (id_player,goal,assist,owngoal)
    VALUES $values
__EOT__;
$this->m->query($quote);

Теперь мы обновляем основную таблицу

$query = <<< __EOT__
    UPDATE tbl_player p, update_temp t
    SET p.goal    = p.goal    + t.goal,
        p.assist  = p.assist  + t.assist,
        p.owngoal = p.owngoal + t.owngoal
    WHERE p.id_player = t.id_player
__EOT__;
$this->m->query($quote);

Не в последнюю очередь некоторые заметки:

0

Во всех ваших массивах вы используете одни и те же индексы. Таким образом, простым способом было бы выполнить через один из массивов и использовать индекс для получения данных из всех массивов с заданным индексом в каждом цикле.

$goal_home    = $this->input->post('goal_home');
$assist_home  = $this->input->post('assist_home');
$owngoal_home = $this->input->post('owngoal_home');

foreach ($goal_home as $id => $dummy) {
 $this->m->query("UPDATE
                        tbl_player 
                     SET
                        Goal    = (goal    + $goal_home[$id]),
                        assist  = (assist  + $assist_home[$id])
                        owngoal = (owngoal + $owngoal_home[$id])
                   WHERE
                        id_player = $id");
}

Но вы также можете поменять имена полей ввода из

<input name="goal_home['+data.player[i].id_player+']">
<input name="assist_home['+data.player[i].id_player+']">
<input name="owngoal_home['+data.player[i].id_player+']">

в

<input name="player['+data.player[i].id_player+'][goals]">
<input name="player['+data.player[i].id_player+'][assists]">
<input name="player['+data.player[i].id_player+'][owngoals]">

Затем вы получаете один массив со всеми данными в нем, и вы можете пройти через данные, как это:

$data = $this->input->post('player');

foreach ($data as id => $item) {
 $this->m->query("UPDATE
                        tbl_player 
                     SET
                        Goal    = (goal    + $item['goals']),
                        assist  = (assist  + $item['assists'])
                        owngoal = (owngoal + $item['owngoals'])
                   WHERE
                        id_player = $id");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню