Jeditable новое значение не сохраняется в базе данных

Я следую учебному пособию, чтобы сделать простое веб-приложение, и я очень удобен для редактирования на месте.

все работает нормально, за исключением того, что новое значение не сохраняется в базе данных. журнал mysql заставляет меня поверить, что «listItemID» не проходит, потому что он показывает оператор, который выполняется следующим образом:

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

У меня есть это в моем index.php:

    bindAllTabs("#list li span");

это в моем файле 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"}
});

}

у меня есть это в моем 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;
}

?>

а затем это в 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!";
}
}

Я часами пытался понять это. Я надеюсь, что кто-то может помочь мне. Спасибо!

1

Решение

Почти год спустя, но … я уже 2 дня бегаю с этой проблемой, пытаясь работать над тем же учебным пособием.

Как вы обнаружили, проблема в том, что jEditable не может обработать идентификатор текущего элемента, и поэтому $ _POST [‘ListItemID’] в итоге становится пустым.

В функции bindAllTabs jEditable будут принять дополнительные параметры в submitdata поле:

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

Но проблема в том, что вызов jEditable не связан с событием, которое позволит нам использовать this.id — и, следовательно, позволяют нам получить идентификатор текущего элемента, который мы нажимаем. Вы можете жестко закодировать значение и увидеть, что оно затем устанавливает $ _POST [‘ListItemID’] (который является чисто академическим тестом) … и нет никакого способа получить текущий идентификатор на лету и вставить его в submitdata, Я не гений, но я попробовал почти все.

РЕШЕНИЕ
Я нашел исправление, отредактировав код самого jEditable. Эта строка (я вижу это в строке 176 в jEditable.js):

submitdata[settings.id] = self.id;

…где ошибка происходит. Это гаснет, потому что self.id ничего не придумывает. Поменяйте местами эту строку с этим битом кода:

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

С помощью submitdata: { action: "update", ListItemID: $(self).parent().attr('id') } сам не будет Работа.

Также вы должны обновить некоторые другие части в руководстве, поскольку jQuery устарел, но вы, возможно, уже сделали это. Например .live(/**/) обновляется до .on( 'click' , null, function(){/**/}); и так далее.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]