2017-01-23 3 views
1

Je suis un tutoriel pour faire l'application web simple et je suis joignable pour l'édition en place. Tout fonctionne correctement, sauf que la nouvelle valeur n'est pas enregistrée dans la base de données. le journal de MySQL me porte à croire que le « ListItemId » ne passe pas, car il montre la déclaration qui est exécutée comme suit:Jeditable nouvelle valeur ne pas enregistrer à la base de données

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

J'ai dans mon index.php:

bindAllTabs("#list li span"); 

cela est dans mon dossier js:

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"} 
    }); 

} 

j'ai dans mon lists.php

<?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; 
} 

?> 

et ceci dans class.lists.inc.php:

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!"; 
    } 
} 

J'ai passé des heures à essayer de comprendre cela. J'espère que quelqu'un peut m'aider. Merci!

Répondre

0

Presque un an de retard, mais ... J'ai couru pendant 2 jours avec ce problème, essayant de travailler le même tutoriel.

Comme vous l'avez découvert, le problème est que jEditable n'est pas capable de traiter l'ID de l'élément en cours et que $ _POST ['ListItemID'] finit par être vide.

Dans la fonction bindAllTabs jEditable va accepter des paramètres supplémentaires dans le domaine submitdata:

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

Mais le problème est que l'appel jEditable n'est pas lié à un événement qui nous permettra d'utiliser this.id - et donc nous permettre d'obtenir l'ID de l'article en cours, nous cliquons. Vous pouvez coder en dur la valeur et voir que puis définit $ _POST ['ListItemID'] (qui est purement un test académique) ... et il n'y a aucun moyen de saisir l'ID actuel à la volée et l'insérer dans submitdata . Je ne suis pas un génie mais j'ai presque tout essayé.

SOLUTION J'ai trouvé le correctif en modifiant le code de jEditable lui-même. Cette ligne (je le vois à la ligne 176 à jEditable.js):

submitdata[settings.id] = self.id; 

... est où l'erreur se produit. Il est blanking parce que self.id ne trouve rien. Swap sur cette ligne avec ce morceau de code:

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

L'utilisation submitdata: { action: "update", ListItemID: $(self).parent().attr('id') } lui-même ne sera pas travail.

Vous devez également mettre à jour d'autres bits dans le didacticiel, car jQuery a désapprouvé certaines choses, mais vous l'avez peut-être déjà fait. Par exemple .live(/**/) est mis à jour à .on('click' , null, function(){/**/}); et ainsi de suite.