Объект <select> и перенос в таблицы..

Daimonos

Новичок
Здравствуйте! Создавая проект я столкнулся с такого рода трудностью. Есть основная таблица в БД с именем `content`, есть так же таблица с именем `archive` в которую по задумке должны отправляться ненужные мне строки. Эти строки должны были опеределяться путем выбора из выпадающего меню специального пункта. Всего в выпадающем меню 4 пункта. Норма, выбыл, удален, заблокирован. в 2 последних вариантах запись из БД вообще должна удаляться, если выбрана норма - то строка остается в таблице `content`, если "выбыл" то должна переместиться в таблицу `archive` и там какое то время находится, с возможностью вернуть данные в основную таблицу. Ниже структуру таблиц приведу.
И вот как я пытался решить данную проблему:
PHP:
if(isset($red_status)=='Выбыл')

        {

            $sql =   "INSERT INTO archive SELECT * FROM content WHERE id='$rid';";
            $sql .=  "DELETE FROM content WHERE id='$rid'; ";
            if (!$mysqli->multi_query($sql)) {
                echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error;
            }
            else{
                echo "Executed successfully";
            }
        }
Затем я попытался это сделать посредством оператора switch , ну и вот собственно код самого файла, который отвечает за редактирование строки в таблице

PHP:
<?php
session_start();

require "config.php";
if(isset($_SESSION['id']))
{
    if(isset($_POST['redsub']))
    {
        $rid=$_POST['rid'];
        $red_name=$_POST['rname'];
        $red_birth=$_POST['rbirth'];
        $red_sps= mysqli_real_escape_string($db, $_POST['rsps']);
        $red_temph=$_POST['rtemph'];
        $red_prevacc=$_POST['rprevacc'];
        $red_date=$_POST['rdate'];
        $ndate;
        $red_status=$_POST['rstatus'];
        $statusdate=date('Y-m-d');

        //Установка следующей даты
        switch ($red_prevacc)
        {
            case 'Значение1':
                $dateAt = strtotime(' + 6 months', strtotime($red_date));
                $ndate = date('Y-m-d', $dateAt);
                break;
            case 'Значение2':
                $dateAt = strtotime(' + 6 months', strtotime($red_date));
                $ndate = date('Y-m-d', $dateAt);
                break;

            case 'Значение3':
                $dateAt = strtotime(' + 6 months', strtotime($red_date));
                $ndate = date('Y-m-d', $dateAt);
                break;

            case 'Значение4':
                $dateAt = strtotime(' + 6 months', strtotime($red_date));
                $ndate = date('Y-m-d', $dateAt);
                break;

            case 'Значение5':
                $dateAt = strtotime(' + 3 months', strtotime($red_date));
                $ndate = date('Y-m-d', $dateAt);
                break;

            case 'Значение6':
                $dateAt = strtotime(' + 3 months', strtotime($red_date));
                $ndate = date('Y-m-d', $dateAt);
                break;

            default:
                $dateAt = strtotime(' + 12 months', strtotime($red_date));
                $ndate = date('Y-m-d', $dateAt);
                break;

        }

        switch ($red_status) {
            case 'Выбыл':
                $sql =   "INSERT INTO archive SELECT * FROM content WHERE id='$rid';";
                $sql .=  "DELETE FROM content WHERE id='$rid'; ";
                break;

            case 'Удален':
                $sql .=  "DELETE FROM content WHERE id='$rid'; "; ...
                break;

            case 'Заблокирован':
                $sql .=  "DELETE FROM content WHERE id='$rid'; "; ...
                break;

            default:
                $query6 = "UPDATE content SET `name` = '$red_name', `birth` = '$red_birth', `sps` = '$red_sps', `temph` = '$red_temph', `prevacc` = '$red_prevacc', `date` = '$red_date', `next_date` = '$ndate', status = '$red_status', date_status = '$statusdate' WHERE `id` = '$rid'";
        if($result1 = mysqli_query($db, $query6))
        {
            header("Location:".$site_url);
        }
        else
        {
            echo "Ошибка: " . mysqli_error($db);
        }
                break;
        }
    }
    else
    {
        echo "Некорректные данные";
    }
    mysqli_close($db);
}
else
{
    header("Location:".$site_url);
}
?>
Сам файл редактирования таблицы работал. Но вот когда попытался добавить в него же функцию т.н. "архивирования" начались траблы... Помогите пожалуйста разобраться в чем ошибка.
 

Вложения

Последнее редактирование:

Valick

Новичок
Я так понимаю о законах нормализации вы не слышали и принципов создания архитектуры БД вы не понимаете?
 

Daimonos

Новичок
Я так понимаю о законах нормализации вы не слышали и принципов создания архитектуры БД вы не понимаете?
Какие то общие представления есть об создании бд. На работе нагрузили вот, теперь ковыряюсь... Осталось совсем немного, но.... Пока вот трудности. А что нормализовать тут? Вроде бы код более ли менее сносно написан...
 

Valick

Новичок
Я не про код, я про архитектуру бд. 50% работы над проектом - это создание правильной архитектуры БД.
Опишите подробнее функционал этого приложения или ТЗ если оно есть.
 

Daimonos

Новичок
Функционал - больше как напоминалка наверное, с базой. Т.е. есть например ФИО и есть даты, и согласно этих дат отсчитывается следующая дата, для проведения работы. Поскольку этих ФИО будет много, то рук-во прибегло к такому варианту. Ну а тех кто выбыл на какое то время - перемещать в архив. В идеале бы дату, которая вот вот подойдет еще подсвечивать каким нибудь желтым цветом, а просроченные красным.
 

AmdY

Пью пиво
Команда форума
Почему бы просто не помечать флагом архивные записи, а не делать отдельную таблицу?
 

ksnk

прохожий
если не выполняется несколько запросов сразу - ну и не надо, у нас есть машинган!
PHP:
$sql=[]; // массив!!!

// заполняем нужными запросами
$sql[] =   "INSERT ...";
$sql[] =   "DELETE ...";

// выполняем запросы
while(!empty($sql) && ($result1 = mysqli_query($db, array_shift($sql))))
{}; // до конца списка запросов или до первой ошибки

if(!$result1) {
   echo "Ошибка: " . mysqli_error($db);
} else {
    header("Location:".$site_url);
}
 

Тугай

Новичок
Ты запрос собираешь в переменную $sql и не выполняешь его.

Идея выбывших удалять и писать в другую такую же таблицу , а потом их иногда возвращать плохая.

Просто не показывай их или показывай только выбывших это и есть вторая таблица.
У тебя выбыл это и есть в архиве. :)
 

Daimonos

Новичок
Да тут дело не в флагах, тут уже гораздо больше одной таблицы вырисовывается.
В БД всего 3 таблицы:
- 1 - авторизация, ее я вообще не учитываю в данной ситуации..
- 2 - основная таблица `content`
- 3 - предположительно архивная таблица...
ФИО - да, это те, с которыми работать..

если не выполняется несколько запросов сразу - ну и не надо, у нас есть машинган!
PHP:
$sql=[]; // массив!!!

// заполняем нужными запросами
$sql[] =   "INSERT ...";
$sql[] =   "DELETE ...";

// выполняем запросы
while(!empty($sql) && ($result1 = mysqli_query($db, array_shift($sql))))
{}; // до конца списка запросов или до первой ошибки

if(!$result1) {
   echo "Ошибка: " . mysqli_error($db);
} else {
    header("Location:".$site_url);
}
Через массив пытался, но у меня ошибки лезли ☹


Ты запрос собираешь в переменную $sql и не выполняешь его.

Идея выбывших удалять и писать в другую такую же таблицу , а потом их иногда возвращать плохая.

Просто не показывай их или показывай только выбывших это и есть вторая таблица.
У тебя выбыл это и есть в архиве. :)
Вот мне надо, чтобы их не было видно, однако, некоторые из т.н. выбывших чтобы при случае чего могли бы быть возвращены в основную таблицу...
 

Valick

Новичок
Забудьте вы про архивную таблицу, вы совершенно не на том акцентируете внимание.
Вы пытаетесь построить красивый дом на кривом фундаменте. Организация таблиц в БД и связь между ними, это и есть фундамент вашего приложения.
Таблица пользователей будь то сотрудники, будь то клиенты должна быть одна, для разделения существуют роли.
Отдельно должна быть таблица состояний (норма, выбыл, удалён, заблокирован). Ваша таблица content в которой я так понимаю должны быть работы запланированные для клиента. И отдельная таблица с датами (аля логирование)
 

Daimonos

Новичок
Забудьте вы про архивную таблицу, вы совершенно не на том акцентируете внимание.
Вы пытаетесь построить красивый дом на кривом фундаменте. Организация таблиц в БД и связь между ними, это и есть фундамент вашего приложения.
Таблица пользователей будь то сотрудники, будь то клиенты должна быть одна, для разделения существуют роли.
Отдельно должна быть таблица состояний (норма, выбыл, удалён, заблокирован). Ваша таблица content в которой я так понимаю должны быть работы запланированные для клиента. И отдельная таблица с датами (аля логирование)
Хмм.. То есть нужно этот выпадающий список, который отвечает за "норма, удален, заблокирован" подвязать к еще одной таблице ?
 

Valick

Новичок
Отпустят из больницы, покажу как надо. Кстати как устанавливается следующая дата?
 

Daimonos

Новичок
Отпустят из больницы, покажу как надо. Кстати как устанавливается следующая дата?
Есть дата проведенного уже мероприятия, есть выпадающий список и в зависимости от него следующая дата варьируется от 3 месяцев до года:
//Установка следующей даты
switch ($red_prevacc)
{
case 'Значение1':
$dateAt = strtotime(' + 6 months', strtotime($red_date));
$ndate = date('Y-m-d', $dateAt);
break;
case 'Значение2':
$dateAt = strtotime(' + 6 months', strtotime($red_date));
$ndate = date('Y-m-d', $dateAt);
break;

case 'Значение3':
$dateAt = strtotime(' + 6 months', strtotime($red_date));
$ndate = date('Y-m-d', $dateAt);
break;

case 'Значение4':
$dateAt = strtotime(' + 6 months', strtotime($red_date));
$ndate = date('Y-m-d', $dateAt);
break;

case 'Значение5':
$dateAt = strtotime(' + 3 months', strtotime($red_date));
$ndate = date('Y-m-d', $dateAt);
break;

case 'Значение6':
$dateAt = strtotime(' + 3 months', strtotime($red_date));
$ndate = date('Y-m-d', $dateAt);
break;

default:
$dateAt = strtotime(' + 12 months', strtotime($red_date));
$ndate = date('Y-m-d', $dateAt);
break;

}
 

AmdY

Пью пиво
Команда форума
Нужно купить хорошую книжку "PHP и MySQL" и прочитать её полностью, для начала.
Сейчас модно курсы и видеоуроки. Просто поражает, сколько времени и денег люди готовы тратить лишь бы не читать книгу.
Я до войны пил пиво с инфоцыганами, общались о работе. Там же всё делается для галочки, и преподы не сильно многому могут научить, и клиенты не сильно то хотят учиться. Главное обоим сторонам отсидеть, выдать-получить бумажку и всё.
 
Сверху