Я следую учебному пособию, чтобы сделать простое веб-приложение, и я очень удобен для редактирования на месте.
все работает нормально, за исключением того, что новое значение не сохраняется в базе данных. журнал 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!";
}
}
Я часами пытался понять это. Я надеюсь, что кто-то может помочь мне. Спасибо!
Почти год спустя, но … я уже 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(){/**/});
и так далее.
Других решений пока нет …