2010-10-05 3 views
0

У меня есть небольшая проблема, я надеюсь, что вы сможете мне помочь.Вставьте несколько строк в БД, нажав только одну кнопку отправки

Прежде всего моей БД таблицы, вовлеченная выглядеть следующим образом:

+---------------+--------------+------+-----+-------------------+----------------+ 
| 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 |    | 
+---------------+--------------+------+-----+-------------------+----------------+ 

Say я получил 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

Ваш вопрос читается как побег из математического экзамена. Может быть, вы хотели бы использовать пример реальной жизни? – Extrakun

+0

Вопрос немного неясен. Разумеется, я понимаю: вы просто хотите найти каждую строку, где значение «Обработка» равно Y, и заменить «Обработка» Q? Почему не просто 'UPDATE table SET Handling = Q WHERE Handling = Y'? – stevendesu

ответ

2

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

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

    • Вставьте другую строку с обработкой = gået, tidspunkt = Теперь()

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

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

Это работает. Большое спасибо :) У меня есть небольшой бонусный вопрос. Можно ли автоматизировать этот процесс, поэтому я запускаю его самостоятельно каждый день в определенное время. – nickifrandsen

+0

Всегда готов помочь другому скандинавскому .. Зависит от того, в какой системе вы находитесь и какой у вас доступ. Не может быть сделано в чистом php/mysql. Задания Cron создаются для этого, если вы работаете в системе unix/linux. –

+0

Кстати, вы можете проверить http://www.setcronjob.com/, что они могут вызывать ваш скрипт (любой заданный URL) с заданным интервалом времени, ваш сценарий должен быть бесплатным. Возможно, это будет более простой вариант. –

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) 
    } 

} 

На этом пути вам потребуется метод, чтобы получить результаты (обработки «у» ==)

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

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

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

Я вижу вашу точку зрения, но это создаст проблему с точки зрения вставки пути больше, чем нужно. Рассмотрите его как функцию входа/выхода из системы. Если пользователь вошел в систему, а затем выйдите из системы, ничего не сделайте. Кроме того, я хочу быть всем, чтобы сделать это для всех, кто «вошел в систему» ​​в мгновение ока ... Обратите внимание, что это не функция входа/выхода, но она имеет некоторое сходство для регистрации действий от пользователя. – nickifrandsen

+0

Я, к сожалению, не способен преобразовать «это больше, чем нужно» в фактическое ограничение. Какие поля _other_ мы должны ограничить, каковы их данные, можем ли мы получить это в предложение WHERE? Должны ли мы получать только записи, для которых тип _last_ Handling был «Kommet», а не _any_ Handling? – Wrikken

+0

Я редактировал исходный вопрос, который я надеюсь немного прояснить. Проблема с вашим предложением состоит в том, что он вставляет значение строки «Gået» foreach, где «Обработка» равна «Kommet». Но это создает проблему, если последняя «Обработка» для «Medlemsnummer»/user_id уже равна «Gået». – nickifrandsen

Смежные вопросы