php
  • jquery
  • mysql
  • pdo
  • jeditable
  • 2017-01-23 1 views 1 likes 
    1

    간단한 웹 응용 프로그램을 만들기위한 자습서를 따르고 있으며 편집을 위해 jeditable을 사용하고 있습니다.Jeditable 새 값이 데이터베이스에 저장되지 않습니다.

    새로운 값이 데이터베이스에 저장되지 않는다는 점을 제외하면 모든 것이 정상적으로 작동합니다.

    bindAllTabs("#list li span"); 
    
    : 내 index.php를이이

    UPDATE list_items 
    SET ListText='Test123' 
    WHERE ListItemID='' 
    LIMIT 1 
    

    : MySQL의 로그는 다음과 같이 실행되는 문을 보여줍니다 때문에 "listItemID은"통과하지 않는 것을 믿고 날 리드

    이 내 JS 파일에 있습니다 : 난 내 lists.php이이

    function bindAllTabs(editableTarget) { 
        // CLICK-TO-EDIT on list items 
        $(editableTarget).editable("db-interaction/lists.php", { 
         id  : 'listItemID', 
         indicator : 'Saving...', 
         tooltip : 'Double-click to edit...', 
         event  : 'dblclick', 
         submit : 'Save', 
         submitdata: {action : "update"} 
        }); 
    
    } 
    

    <?php 
    
    session_start(); 
    
    include_once "../inc/constants.inc.php"; 
    include_once "../inc/class.lists.inc.php"; 
    
    if(!empty($_POST['action']) 
    && isset($_SESSION['LoggedIn']) 
    && $_SESSION['LoggedIn']==1) 
    { 
        $listObj = new ColoredListsItems(); 
        switch($_POST['action']) 
        { 
         case 'add': 
          echo $listObj->addListItem(); 
          break; 
         case 'update': 
          $listObj->updateListItem(); 
          break; 
         case 'sort': 
          $listObj->changeListItemPosition(); 
          break; 
         case 'color': 
          echo $listObj->changeListItemColor(); 
          break; 
         case 'done': 
          echo $listObj->toggleListItemDone(); 
          break; 
         case 'delete': 
          echo $listObj->deleteListItem(); 
          break; 
         default: 
          header("Location: /"); 
          break; 
        } 
    } 
    else 
    { 
        header("Location: /"); 
        exit; 
    } 
    
    ?> 
    

    다음이 class.lists.inc.php에 5,:

    public function updateListItem() 
    { 
        $listItemID = $_POST['listItemID']; 
        $newValue = strip_tags(urldecode(trim($_POST["value"])), WHITELIST); 
    
        $sql = "UPDATE list_items 
          SET ListText=:text 
          WHERE ListItemID=:id 
          LIMIT 1"; 
        if($stmt = $this->_db->prepare($sql)) { 
         $stmt->bindParam(':text', $newValue, PDO::PARAM_STR); 
         $stmt->bindParam(':id', $listItemID, PDO::PARAM_INT); 
         $stmt->execute(); 
         $stmt->closeCursor(); 
    
         echo $newValue; 
        } else { 
         echo "Error saving, sorry about that!"; 
        } 
    } 
    

    나는이 문제를 알아 내려고 시간을 보냈습니다. 누군가가 나를 도울 수 있기를 바랍니다. 감사!

    답변

    0

    거의 1 년이 지났지 만 ...이 튜토리얼을 계속 사용해 보려고이 문제로 2 일 동안 뛰었습니다.

    발견 한대로 jEditable은 현재 요소의 ID를 처리 할 수 ​​없으므로 $ _POST [ 'ListItemID']가 비어있게됩니다. bindAllTabs에서

    submitdata 필드에 추가 매개 변수를 받아 들일 것입니다 jEditable 기능 :

    submitdata: { action: "update", ListItemID: this.id } 
    

    그러나이 가진 문제는 jEditable 호출이 우리가 사용할 수 있도록 이벤트에 구속되지 않는 것입니다 this.id - 클릭하면 현재 항목의 ID를 가져올 수 있습니다. 값을 하드 코딩하여 을 확인한 다음은 $ _POST [ 'ListItemID']를 설정합니다 (이는 순전히 학업 테스트입니다). 현재 ID를 즉시 가져 와서 submitdata에 삽입 할 방법이 없습니다 . 나는 천재는 아니지만 거의 모든 것을 시도했습니다.

    해결책 jEditable 코드 자체를 편집하여 수정되었습니다. 이 줄 (jEditable.js의 176 줄에 있습니다) :

    submitdata[settings.id] = self.id; 
    

    ... 여기서 오류가 발생합니다. self.id은 아무것도 나오지 않으므로 공백이 있습니다. 코드의이 비트와 함께이 라인을 스왑 : 자체 하지 않습니다 작업을 submitdata: { action: "update", ListItemID: $(self).parent().attr('id') }를 사용

    submitdata[settings.id] = $(self).parent().attr('id'); 
    

    .

    또한 jQuery에서 일부 기능을 사용하지 않으므로이 자습서의 다른 비트를 업데이트해야하지만 이미 완료했을 수 있습니다. 예를 들어 .live(/**/).on('click' , null, function(){/**/}); 등으로 업데이트됩니다.

    관련 문제