Вставьте несколько строк в БД, нажав только одну кнопку отправки

0

У меня есть небольшая проблема, я надеюсь, что вы сможете мне помочь.

В первую очередь моя таблица DB выглядит так:

+---------------+--------------+------+-----+-------------------+----------------+
| Field         | Type         | Null | Key | Default           | Extra          |
+---------------+--------------+------+-----+-------------------+----------------+
| id            | int(11)      | NO   | PRI | NULL              | auto_increment |
| KlubID        | varchar(11)  | NO   |     | 0                 |                |
| Medlemsnummer | varchar(11)  | NO   |     | 0                 |                |
| KlubType      | varchar(128) | NO   |     |                   |                |
| Handling      | varchar(128) | NO   |     |                   |                |
| Tidspunkt     | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
+---------------+--------------+------+-----+-------------------+----------------+

Скажем, я получил записи X, где "Обработка" равно Y в моей таблице позволяет вызывать результаты P. Теперь я хотел бы взять все P и вставить строку foreach P, где значение "Обработка" теперь будет равно Q.

Проблема в том, что я хочу сделать вставку с помощью одной кнопки (submit) не с несколькими формами.

Заранее благодарю вас за помощь. Не стесняйтесь спрашивать больше информации, если это требует большей ясности.

/Nicki

EDIT: для большей ясности

public static function find_todays_children() {
    global $db;
    $sql = "SELECT * 
            FROM (
                SELECT * 
                FROM Handlinger 
                AS a
                WHERE date(Tidspunkt) = curdate() 
                AND Tidspunkt = (
                    SELECT max(Tidspunkt) 
                    FROM Handlinger 
                    AS b
                    WHERE a.Medlemsnummer = b.Medlemsnummer
                    )
                )
            AS c
            ORDER BY handling DESC, medlemsnummer";
    return static::find_by_sql($sql);
}

Этот запрос выше возвращает следующее.

+------+--------+---------------+----------+----------+---------------------+
| id   | KlubID | Medlemsnummer | KlubType | Handling | Tidspunkt           |
+------+--------+---------------+----------+----------+---------------------+
| 5786 | 0      | 1             | FK       | Kommet   | 2010-10-06 13:48:06 |
| 5787 | 0      | 2             | FK       | Kommet   | 2010-10-06 13:48:10 |
| 5789 | 0      | 4             | FK       | Kommet   | 2010-10-06 13:48:16 |
| 5790 | 0      | 3             | FK       | G?et     | 2010-10-06 13:48:27 |
+------+--------+---------------+----------+----------+---------------------+

Затем я хочу иметь возможность вставить 3 строки, где поле "Обработка" - это другое значение. Я могу сделать это с помощью HTML-формы с PHP, но я не могу понять, как сделать все это одним кликом один раз... Важно то, что не вставлять ничего, где последняя запись для определенного "Medlemsnummer" (user_id) уже равна значению "Gået"

Моя форма выглядит следующим образом:

...
    if(isset($action->Handling) != "Kommet") {
        $do_action = "Kommet";
    } else {
        $do_action = "Gået";
    }
...

<section>
    <form action="phineaslog_barn.php" method="post">
        <label for="Status">Klub Navn: </label>
        <input type="text" name="Medlemsnummer" value="<?php echo $child->Medlemsnummer; ?>" />
        <input type="text" name="Handling" value="<?php echo $do_action; ?>" />
        <input type="submit" name="submit" value="<?php echo $do_action; ?>" />
    </form>
</section>
  • 0
    Я принимаю вас за ваше предложение и прошу большей ясности. Используйте реальный пример.
  • 0
    Ваш вопрос читается как сбежавший из математического экзамена. Может быть, вы хотите использовать пример из реальной жизни?
Показать ещё 2 комментария
Теги:

3 ответа

2
Лучший ответ

Мое понимание вопроса:

  • Для каждой строки, которая является окончательной записью для пользователя, где обработка = kommet

    • Вставьте еще одну строку с обработкой = gået, tidspunkt = now()

Итак... чтобы совместить лучшее из двух миров...

INSERT INTO tablename (KlubID,Medlemsnummer,KlubType,Handling,Tidspunkt)
    SELECT KlubID,Medlemsnummer,KlubType,'Gået',NOW()
    FROM Handlinger 
    AS a
    WHERE date(Tidspunkt) = curdate() 
    AND Handling = 'Kommet'
    AND Tidspunkt = (
        SELECT max(Tidspunkt) 
        FROM Handlinger 
        AS b
        WHERE a.Medlemsnummer = b.Medlemsnummer
     )
  • 0
    Это работает. Большое спасибо :) Я получил небольшой бонусный вопрос. Можно ли автоматизировать этот процесс, поэтому я запускаю его самостоятельно каждый день в определенное время.
  • 0
    Всегда готов выручить такого же скандинава. Зависит от того, в какой системе вы находитесь, и какой у вас доступ. Не может быть сделано в чистом php / mysql. Для этого создаются задания Cron, если вы работаете в системе Unix / Linux.
Показать ещё 1 комментарий
0

В сущности, вы хотите запустить этот запрос?

INSERT INTO tablename (KlubID,Medlemsnummer,KlubType,Handling,Tidspunkt)
SELECT KlubID,Medlemsnummer,KlubType,'Gået',NOW()
FROM tablename
WHERE Handling = 'Kommet';

Или, больше в PHP:

$from = $_POST['Handling'] == 'Kommet' ? 'Kommet' : 'Gået';
$to   = $from == 'Kommet' ? 'Gået' :'Kommet';

mysql_query("
INSERT INTO tablename (KlubID,Medlemsnummer,KlubType,Handling,Tidspunkt)
SELECT t1.KlubID,t1.Medlemsnummer,t1.KlubType,'$to',NOW()
FROM tablename t1
LEFT JOIN tablename t2
ON t1.Medlemsnummer = t2.Medlemsnummer
AND t2.Tidspunkt > t1.Tidspunkt
WHERE DATE(t1.Tidspunkt) = CURDATE() AND t1.Handling = '$from' AND t2.id IS NULL");

Или есть ли больше ограничений на какие строки, которые вы хотели бы добавить, кроме Handling?

  • 0
    Я понимаю вашу точку зрения, но это создаст проблему с точки зрения вставки больше, чем необходимо. Считайте, что это функция входа / выхода. Если пользователь вошел в систему, тогда выход из системы ничего не делать. За исключением того, что я хочу быть всем, чтобы сделать это для всех, кто "вошел в систему" мгновенно ... Обратите внимание, что это не функция входа в систему / выхода из системы, но она имеет некоторое сходство для регистрации действий от пользователя.
  • 0
    К сожалению, я не способен перевести «это гораздо больше, чем нужно» в фактическое ограничение. Какие другие поля мы должны ограничить, каковы их данные, можем ли мы включить это в WHERE ? Должны ли мы получать только записи, для которых последний тип обработки был «Kommet», а не какой- либо обработки?
Показать ещё 2 комментария
0

Вы можете сделать что-то вроде этого:

Напишите метод для возврата DataTable

Пример:

private DataTable pResutls()
{
 do your select handling=Y;
 return DataTableWithResult; 
}

в событии нажатия кнопки

DataTable p = pResutls();
foreach(DataRow row in p)
{
   if (row["Handling"].toSring()=='Q')
   {
     then insert this row (write your method to insert)
   }

}

Таким образом вам понадобится метод для получения результатов (обработка == 'y')

Метод, который вставляет строку (вы можете передать параметр DataRow как параметр и выполнить обновление там)

И затем с вашей кнопки вы можете сделать все за один щелчок, как показано выше.

Ещё вопросы

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