【问题标题】: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!";
    }
}

我花了几个小时试图弄清楚这一点。我希望有一个人可以帮助我。谢谢!

【问题讨论】:

    标签: php jquery mysql pdo jeditable


    【解决方案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(){/**/}); 等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多