2017-01-09 176 views
0

我的網頁有一個下拉框和三個輸入框。每當我在我的下拉框中進行選擇時,它會自動將信息填充到文本框中。每個文本框旁邊還有一個「保存」按鈕。這使我可以更新該字段,如果它需要更改一次我點擊保存按鈕。因此,例如,如果我將下拉框的值硬編碼到我的更新語句中,它就可以工作,但我無法在不對其進行硬編碼的情況下使其工作。所以我認爲我只需要讓Javascript讀取我的下拉框中選擇的值。我怎樣才能解決這個問題?根據輸入值更新數據庫

下拉框代碼:

<div> 
<div id="vendor"> 
<strong>Vendor:</strong> 
</div> 

<div class="align"> 
<select name="vendor_dropdown" id="ven" onChange="updateinput();"> 
    <option value="">Choose a Vendor</option> 
     <?php foreach($users->fetchAll() as $user): ?> 
      <option 
        data-name="<?php echo $user['MR_POC_N'];?>" 
        data-email="<?php echo $user['MR_POC_E'];?>" 
        data-phone="<?php echo $user['MR_POC_P'];?>" 
      > 
       <?php echo $user['MR_Name'];?> 
      </option> 
     <?php endforeach; ?> 
</select> 
</div> 

</div> 

聯繫信息代碼,該代碼自動填充:

<div> 
<div id="contact_info"> 
<strong>Contact Information:</strong><br> 
</div> 

<div class="align1"> 
<table align="left" id="contact"> 
    <tr> 
     <td align="left">Name:</td> 
     <td><input type="text" id="name" class="name" name="name" style="margin-left: 5px"></td> 
     <td><input type="button" class="edit" name="edit" value="Save"></td> 
    </tr> 
    <tr> 
     <td align="left">Email:</td> 
     <td><input type="email" id="email" class="email" name="email" style="margin-left: 5px"></td> 
     <td><input type="button" class="edit" name="edit" value="Save"></td> 
    </tr> 
    <tr> 
     <td align="left">Phone Number:</td> 
     <td><input type="tel" id="tel" class="tel" name="number" style="margin-left: 5px"></td> 
     <td><input type="button" class="edit" name="edit" value="Save"></td> 
    </tr> 
</table> 
</div> 

</div> 

的JavaScript編輯信息:

// ----- Edit Contact Info ----- 

$(document).on("click", "#contact .edit", function() { 
    var $this = $(this); 
    var tds = $this.closest('tr').find('td').filter(function() { 
    return $(this).find('.edit').length === 0; 
    }); 
    if ($this.val() === 'Edit') { 
    /*if($this.id !== '.mr_id') { 
     tds.not('.mr_id').not('.mr_name').prop('contenteditable', true); 
    }*/ 
    } else { 
    var isValid = true; 
    var errors = ''; 
    $('#myDialogBox').empty(); 
    var elements = tds; 
    if (tds.find('input').length > 0) { 
     elements = tds.find('input'); 
    } 
    var dict = {}; 
    elements.each(function (index, element) { 
     var type = $(this).attr('class'); 
     var value = (element.tagName == 'INPUT') ? $(this).val() : $(this).text(); 
     console.log(type); 
     // ----- Switch statement that provides validation for each table cell ----- 
     switch (type) { 
     case "ven": 
       dict["MR_Name"] = value; 
      break; 
     case "name": 
      if (value == value.match(/^[a-zA-Z\s]+$/)) { 
       dict["MR_POC_N"] = value; 
      break; 
      } 
      else { 
      isValid = false; 
      errors += "Please enter a valid Name\n"; 
      } 
      break; 
     case "email": 
      if (value == value.match(/^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/)) { 
       dict["MR_POC_E"] = value; 
      break; 
      } 
      else { 
      isValid = false; 
      errors += "Please enter a valid Email\n"; 
      } 
      break; 
     case "tel": 
      if (value == value.match('^[0-9()+/-]{10,}$')) { 
       dict["MR_POC_P"] = value; 
      break; 
      } 
      else { 
      isValid = false; 
      errors += "Please enter a valid Phone Number\n"; 
      } 
      break; 
     } 
    }) 

    if (isValid) { 
     console.log(dict); 
     //$this.val('Save'); 
     //tds.prop('contenteditable', false); 
     var request = $.ajax({ 
      type: "POST", 
      url: "update.php", 
      data: dict 
     }); 

     request.done(function (response, textStatus, jqXHR){ 
      if(JSON.parse(response) == true){ 
      console.log("Data saved"); 
      } else { 
      console.log("Data failed to save"); 
      console.log(response); 
      console.log(textStatus); 
      console.log(jqXHR); 
      } 
     }); 

     // Callback handler that will be called on failure 
     request.fail(function (jqXHR, textStatus, errorThrown){ 
      // Log the error to the console 
      console.log(textStatus); 
      console.log(jqXHR); 
      console.error(
       "The following error occurred: "+ 
       textStatus, errorThrown 
      ); 
     }); 

     // Callback handler that will be called regardless 
     // if the request failed or succeeded 
     request.always(function() { 

     }); 
    } else { 
     alert(errors); 
    } 
    } 
}); 

update.php:

<?php 

    $MR_Name = $_POST['MR_Name']; 
    $MR_POC_N = $_POST['MR_POC_N']; 
    $MR_POC_E = $_POST['MR_POC_E']; 
    $MR_POC_P = $_POST['MR_POC_P']; 

    $host="xxxxxxx"; 
    $dbName="xxxxxxxxx"; 
    $dbUser="xxxx"; 
    $dbPass="xxxxxxxx"; 

    $pdo = new PDO("sqlsrv:server=".$host.";Database=".$dbName, $dbUser, $dbPass); 

    $sql = "UPDATE Stage_Rebate_Master SET MR_POC_N = :MR_POC_N, MR_POC_E = :MR_POC_E, MR_POC_P = :MR_POC_P WHERE MR_Name = :MR_Name"; 

    $stmt = $pdo->prepare($sql); 
    $stmt->bindValue(':MR_Name', $MR_Name); 
    $stmt->bindValue(':MR_POC_N', $MR_POC_N); 
    $stmt->bindValue(':MR_POC_E', $MR_POC_E); 
    $stmt->bindValue(':MR_POC_P', $MR_POC_P); 
    $result = $stmt->execute(); 
    echo json_encode($result); 

?> 

回答

0

我認爲沒有必要做所有這些來創建更新表單。處理這種情況最好的辦法是先在DB基於特定的id從該ID獲取的所有數據,然後用這些數據填寫表格值的選擇查詢。

之後,你已經得到了一個完整的從數據庫中的數據的形式。在頁面末尾放置一個提交按鈕(僅一個)。編輯您喜歡的每個字段並單擊更新。

對所有字段進行更新查詢,表單中的所有字段發生更改,它們將用值更新,如果不是,它們將被更新,但僅與之前的值一起更新,甚至與表單中的空值一起更新。

0

我剛剛創建了一個非常類似的形式。我有一個提交按鈕在頁面的頂部。 在提交:對於每一行我檢查是否有數據庫和輸入框(這是由用戶改變)之間的任何變化 那麼如果(且僅當)它們是不同的我用該行的更新表查詢。這很簡單,工作得很好。

這裏是一個PHP的例子:

if (isset($_POST['submit']) and !empty($_POST['submit'])){ 
    $column_1 = $_POST['Col1']; 
    $column_2 = $_POST['Col2']; 
    foreach ($_POST['KeyColumn'] as $key => $variable){ 
     $select = "SELECT * FROM tblTable WHERE KeyColumn='".$variable."'"; 
     $result = $conn->query($select); 
     if ($result->num_rows>0){ 
      while ($row=$result->fetchassoc()){ 
       $same = true; 
       if (($row['Col1'] != $Col1[$key]) or ($row['Col2'] != $Col2[$key])){ 
        $same = false; 
       } 
       if (!$same){ 
        /* update sql on this line */ 
       } 
      } 
     } 
    } 
} 

注:我使用了許多循環,因爲我有電子表格不是一種形式。但是,它的工作原理沒有循環一樣,只是簡單得多