如何通过表单将数据发布到同一文件,将AJAX调用同步到php文件?

时间:2017-09-18 08:43:15

标签: javascript php jquery ajax

我的问题是update.php只获取发布的表单数据(post_edit)。之前通过AJAX发布的变量不会通过

Notice: Undefined index: id_to_edit in ...\update.php on line 5

Notice: Undefined index: column_to_edit in ...\update.php on line 6

我想做的事情:

我有一个回调函数,可以追踪鼠标在桌子上的位置。这样做是为了检测列和用户想要编辑的单元格的id - id整数和列字符串通过AJAX发布到php文件,并在SQL查询中使用,使用两个值(对于坐标)用户想要更新的数据(通过表单发布,稍后将详细介绍)。

编辑是这样完成的:当用户将鼠标悬停在单元格上时,表单会在里面创建,填写该表单应该发布数据以更新SQL表中的相应条目(通过使用来自回调函数)。鼠标移除会删除表单。

稍微解释一下

如何将坐标和表单数据发布到php文件,以便所有这些值都可以在SQL查询中使用?如果我所做的事情从根本上被打破了,还有另一种方式吗?

$(function(){

    $("td")
    .hoverIntent(
        function(e){            
        var id_of_edit = $(e.target).siblings('th').text();
        var $clicked_column_i = $(e.target).index() + 1;
        var column_of_edit = $("#tableheader").children("th:nth-child(" + $clicked_column_i + ")").text();

        $.ajax({
            type: 'POST',
            dataType: 'text',
            url: 'update.php',
            data: { 
                'id_of_edit': id_of_edit,
                'column_of_edit': column_of_edit
                },

        });

        var $edit_button = $('<form action="update.php" method="post"><input type="text" name="post_edit"/></form>');

        $(e.target).append($edit_button);

        console.log(e.target.innerText + " was clicked");
        console.log(id_of_edit + " is the ID");
        console.log(column_of_edit + " is the column name");       
        //just to check the tracer function is working correctly
        },  

        function(e){            
        $id_of_edit = $(e.target).siblings('th').text();
        $clicked_column_i = $(e.target).index() + 1;
        $column_of_edit = $("#tableheader").children("th:nth-child(" + $clicked_column_i + ")").text();

        $(e.target).children('form').remove();
        });

});

update.php:

<?php

include 'config.php';

echo $_POST['id_to_edit'];
echo $_POST['column_to_edit'];
echo $_POST['post_edit'];


$stmt = $pdo->prepare('UPDATE food SET :column = :edit WHERE id = :id');
$stmt->execute([
    'id' => $_POST['id_to_edit'],
    'column' => $_POST['column_to_edit'],
    'edit' => $_POST['post_edit']
]);

?>

1 个答案:

答案 0 :(得分:0)

通过标准回发的ajax请求和表单提交是两个单独的 HTTP请求。你的&#34; update.php&#34;脚本将执行两次 - 每个单独的请求执行一次,并且每个请求将根据您在该请求上发送的内容具有单独的POST变量集。变量不会在请求之间保留 - 只是因为您将它们发送到相同的端点脚本并不重要。

总结一下:HTTP请求是无状态 - 它们是隔离存在的,任何给定的请求都不知道以前或将来的请求。每一个都会导致命名的PHP脚本从头到尾运行,就像它以前从未运行过一样,并且可能永远不会再运行。它没有回忆过去,对未来一无所知,除非你明确地做了些什么。

如果你想要在请求之间保持值,你必须自己存储它们 - 在数据库,会话,cookie,等等(它由你决定) - 然后在你需要时检索它们。

话虽如此,看看你的服务器代码,你不清楚为什么你还想要两个单独的请求 - 你在SQL中做了一个UPDATE语句,所以使用一个HTTP请求会更有意义将所有数据传输到服务器,然后执行运行UPDATE的脚本。除非在UI中有某些原因,为什么不能这样做,在这种情况下,您需要在请求之间的某处保留值。根据您的描述,您可能会将单元格/列ID捕获到您生成的表单中的隐藏字段中,而不是通过ajax立即将它们发送到服务器。然后,在提交主表单时,隐藏字段值将与用户生成的值一起发布到服务器。

另外,如果你真的使用鼠标的位置来确定单元格,这听起来非常不可靠 - 浏览器窗口可以调整大小。当然,将ID放在单元格的HTML标记内(例如作为数据属性),然后在单击单元格/鼠标单元格时可以读取该标记会更可靠吗?