Заявление об обновлении mysql в зависимости от установленного количества флажков - PullRequest
0 голосов
/ 02 сентября 2018

Постановка задачи:

  • У меня есть форма с несколькими полями флажка, я проверил ее так пользователь может выбрать максимум 9 флажок и по крайней мере 1 с JQuery. Form with Multiple Checkbox
  • Я собираю проверенные значения формы, используя метод Post.
  • У меня есть таблица MySQL с 12 столбцами. Mysql Table Image

  • первые 3 столбца: "id", "rollnum", "selectStatus"

  • Через переменные сеанса, созданные во время входа в систему, я получаю число студентов. Таким образом, я могу запустить запрос на обновление для определенной строки.

  • Вопрос: Как обновить эти 9 тематических столбцов в соответствии с проверенными пользователем данными. Примечание: я сохранил эти проверенные значения поля ввода в массиве.

  • Код

    <form action="index.php" id="form-3" method="post">
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="ucs303">UCS303 Operating Systems
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="ucs406">UCS406 Data Structures and Algorithms
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec401">UEC401 Analog Communication Systems
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec612">UEC612 Digital System Design
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec307">UEC307 Electromagnetic Field Theory & Trans Lines
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec502">UEC502 Digital Signal Processing
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec510">UEC510 Computer Architecture
        <button type="submit" name="year-3-submit">Submit Selection</button>
    </form>
    <?php
        if(isset($_POST['year-3-submit'])){
            if(!empty($_POST['year-3-checkbox'])){
                $subjectCheckList = array();
                $subjectCheckList = $_POST['year-3-checkbox'];
            }
        }
    ?>
    
  • Зависит от того, сколько пользователей установлен флажок.

  • Я не знаю, как написать SQL-запрос UPDATE, который обновляет значения числа столбцов == размер массива.

например: Пользователь 1 выбрал 3 флажка и отправил форму, у нас есть массив размером 3 и ОБНОВЛЕНИЕ 3 столбцов таблицы. Пользователь 1 установил флажок 6 и отправил форму, у нас есть массив размером 6 и столбцы ОБНОВЛЕНИЕ 6 таблицы.

  • Я не хочу писать 9 операторов регистра переключателей для всех возможных размеров массива. Любая идея? пожалуйста

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Ну, во-первых, не ясно, что должно быть значением по умолчанию для каждого столбца. Так как ваши столбцы MySQL заданы числами (sub1, sub2 и т. Д.), Ваша форма должна представлять их соответственно с правильным значением. например:

<input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="1">

Таким образом, вы можете легко зацикливаться и обновлять таблицу (я полагаю, что столбцы имеют значение TINYINT (1) DEFAULT NULL):

<?php
    if(isset($_POST['year-3-submit'])){
        if(!empty($_POST['year-3-checkbox'])){
            $subjectCheckList = array();
            $query = "UPDATE table SET ";
            foreach ($_POST['year-3-checkbox'] as $key => $value) {
              $query .= " sub" . $value . " = 1, " 
            }
            $query = substr($query, 0, -1);
        }
    }
?>

Надеюсь, это поможет Guy

0 голосов
/ 02 сентября 2018

Вы также можете использовать array_filter, array_combine и array_slice.

<?php

$subs = [':sub1',
         ':sub2',
         ':sub3',
         ':sub4',
         ':sub5',
         ':sub6',
         ':sub7',
         ':sub8',
         ':sub9'
];

// use $dataFromForm = array_filter($_POST['year-3-checkbox'])

$dataFromForm = ['11111',
                 '222222',
                 '3333333'];

$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '*******');


$sql = 'UPDATE test SET sub1 = :sub1, sub2 = :sub2, sub3 = :sub3, sub4 = :sub4, sub5 = :sub5, sub6 = :sub6, sub7 = :sub7, sub8 = :sub8, sub9 = :sub9';
$sth = $dbh->prepare($sql);
$sth->execute(array_combine(array_slice($subs, 0, count($dataFromForm), $dataFromForm)));
0 голосов
/ 02 сентября 2018

Основываясь на комментариях ОП, вы можете сделать общий код следующим образом:

// Check if atleast one subject has been selected
$selectedSubjects = array_filter($subjectCheckList);

// If no subject selected
if (empty($selectedSubjects)) {
    $sql = "UPDATE subjectmaster 
            SET substatus = 0 
            WHERE rollno = '" . mysqli_real_escape_string($rollnumber) . "'";
} else {
    // Initialize the sql string
    $sql = "UPDATE subjectmaster 
            SET substatus = 1 ";

   $i = 1;
   foreach ($subjectCheckList as $subject) {
       $sql .= ", sub" . $i . " = '" . mysqli_real_escape_string($subject) . "' ";
   }

   $sql .= " WHERE rollno = '" . mysqli_real_escape_string($rollnumber) . "'";
}

Также обратите внимание на использование mysqli_real_escape_string. Это помогает в предотвращении внедрения SQL. Чтобы найти более эффективные способы предотвращения внедрения SQL, вы можете проверить Как я могу предотвратить внедрение SQL в PHP?

...