2016-11-22 3 views
0

Интересная проблема здесь.Select2 - написать mulitple в базе данных, двойную запись

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

Поле выбора является частью модальности, которое после нажатия кнопки SAVE отправляется через AJAX в файл ajax.php, где обрабатывается вставка. Тот же подход развертывается несколько раз на веб-сайте без проблем, проблема возникает только в том случае, если это поле multiple.

HTML

<!-- Department --> 
<label>Department Name:</label> 
<div class="input-group"> 
    <span class="input-group-addon"><i class="fa fa-bars"></i></span> 
    <input type="text" class="form-control" id="addDeptName" name="addDeptName" /> 
</div> 
<!-- /.Department --> 

<p> </p> 

<!-- Positions --> 
<label>Department Positions:</label> 
<div class="input-group"> 
    <span class="input-group-addon"><i class="fa fa-briefcase"></i></span> 
    <select class="form-control select2" style="width:100%;" id="addDeptPositions" name="addDeptPositions" multiple> 
     <option value="Option1">Option1</option> 
     <option value="Option2">Option2</option> 
     <option value="Option3">Option3</option> 
     <option value="Option4">Option4</option> 
    </select> 
</div> 
<!-- /.positions --> 

JS

// ADD NEW RECORD TO DATABASE   
$("#NewDepartmentButton").click(function() { 
    $("#addDeptName").focus(); 

    // check that input fields are not empty 
    if($("#addDeptName").val()!="" && $("#addDeptPositions").val()!="") { 

     $.ajax({ 
      url: "../../plugins/MySQL/ajax_action.php", 
      type: "POST", 
      //async: true, 
      data: { action:"new_department",Department_Name:$("#addDeptName").val(),Department_Positions:$("#addDeptPositions").val()}, // form data to post goes here as a json object 
      dataType: "html",   

      success: function(data) { 
       $('#department_output').html(data); 
       drawVisualization(); 
      }, 
     }); 
    } else { 
     //notify the user they need to enter data 
     alert("Please enter a valid Department Name."); 
     return; 
    } 

    // close modal and refresh page 
    $('#NewDepartmentModal').modal('hide'); 
    setTimeout(function(){location.reload()}, 2000); 

    // Reload Datatables 
    //$('#department_table').DataTable().ajax.reload(); 

    // refresh entire website 
    //location.reload(); 

    return; 
}); 

PHP

if(isset($_POST['action']) && ($_POST['action']=='new_department')) { 

    // include connection details 
    include 'connect_db.php'; 

    //Open a new connection to the MySQL server 
    $db = new mysqli($dbhost,$dbuser,$dbpass,$dbname); 

    //Output any connection error 
    if ($db->connect_error) { 
     die('Error : ('. $db->connect_errno .') '. $db->connect_error); 
    } 

    // get variables and sanitize 
    $addDeptName = mysqli_real_escape_string($db,$_POST['Department_Name']); 
    $addDeptPositions = $_POST['Department_Positions']; 

    // create new record 
    foreach ($addDeptPositions as $c) { 
     $sql = "INSERT INTO `qci_departments` (`Department`,`Positions`) VALUES ('".$addDeptName."', '".mysqli_real_escape_string($db, $c)."')"; 
     $db->query($sql); 
    } 

    if (!$db->query($sql)) { 
     echo " 
      <div class=\"alert alert-danger alert-dismissible\"> 
       <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button> 
       <h4><i class=\"icon fa fa-ban\"></i> Error!</h4> 
       There was an error while excuting this query.<br /> 
       (" . $db->errno . ") " . $db->error . " 
       </div>"; 
    } 

    echo " 
     <div class=\"alert alert-success alert-dismissible\"> 
      <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button> 
      <h4><i class=\"icon fa fa-check\"></i> Alert!</h4> 
      Success, record updated successfully. Refreshing database now... 
     </div>"; 

    //close connection 
    $db->close(); 

} 

База данных Результат: например. если позиции «Менеджер счета» и «Счет дебиторов Officer» выбираются из множественного поля: enter image description here

EDIT: проблема кажется связанным с представлением массива, так как это то, что следует выбрать значение выглядит следующим образом:

Array ([0] => Accounting Manager [1] => Accounts Receivable Officer) Array ([0] => Accounting Manager [1] => Accounts Receivable Officer) 

EDIT 2: addded в return; к коду JS

+1

печати массив '$ addDeptPositions' и вставить его в вопрос. Также добавьте код select2 jquery, если он добавлен. – RJParikh

+0

, если вы используете select с несколькими параметрами, вы не думаете, что 'name =" addDeptPositions "должно быть' name = "addDeptPositions []" ' –

+0

@HappyCoding, когда оно напрямую отправляется через элемент'

', да. Тем не менее, я отправляю через AJAX. Если я добавлю '[]' к имени выбора, переменная '$ _POST ['Department_Positions'] больше не будет распознана. – Armitage2k

ответ

0

проблема, как представляется, были с взаимодействием AJAX, более конкретно с mysqli_real_escape() и заявление SQL.

Я изменил цикл foreach на это, и он чудесным образом работал, хотя изменение состоит только в переименовании переменной SQL и удалении escape-строки (которую я позже добавил и все еще работает).

// create new record 
foreach ($addDeptPositions as $c) { 
    $sql2 = "INSERT INTO `qci_departments` (`Department`,`Positions`) VALUES ('".$addDeptName."', '".mysqli_real_escape_string($db,$c)."')"; 
    $db->query($sql2); 
} 

Не уверен, почему это, но теперь работает :)

+0

Вы также можете добавить уникальный индекс в поле «Департамент». Это гарантирует, что строки с одинаковым значением для поля «Департамент» не будут добавлены. –