可编辑的新值不保存到数据库
Posted
技术标签:
【中文标题】可编辑的新值不保存到数据库【英文标题】:Jeditable new value doesn't save to database 【发布时间】:2017-06-08 14:29:08 【问题描述】:我正在按照教程制作简单的网络应用程序,并且我可以使用 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"
);
我的 list.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 无法处理当前元素的 ID,因此 $_POST['ListItemID'] 最终为空。
在 bindAllTabs 函数中,jEditable将接受 submitdata
字段中的附加参数:
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[settings.id] = $(self).parent().attr('id');
使用submitdata: action: "update", ListItemID: $(self).parent().attr('id')
本身不会工作。
此外,由于 jQuery 已弃用其中一些内容,因此您还必须更新教程中的其他一些内容,但您可能已经这样做了。例如.live(/**/)
更新为.on( 'click' , null, function()/**/);
等等。
【讨论】:
以上是关于可编辑的新值不保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章
在 onblur 期间始终从可编辑的 DataTable 中检索旧值(但不是新值)