可编辑的新值不保存到数据库

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 中检索旧值(但不是新值)

在将编辑内容保存到数据库之前验证 Oracle Apex 可编辑交互式网格

将数据从可编辑表单保存到数据库

jquery实现点击文字可编辑并修改保存至数据库

使用 php 保存可编辑表中的值

angularJS 可编辑下拉选项框