使用ajax为每个输入字段更新mysql中的数据

Posted

技术标签:

【中文标题】使用ajax为每个输入字段更新mysql中的数据【英文标题】:Update data in mysql for every input field using ajax 【发布时间】:2016-04-01 12:59:04 【问题描述】:

我有 mysql 数据库。在我的页面上,当我单击一个按钮时,我从数据库中检索数据。所有数据都显示在页面上。我得到一行 id,一行带有名称,一行带有数字(在输入字段中)。所以一个例子是我得到:

51

表格

200


52

320


53

玻璃

456


因为所有值编号(第 3 行)都在输入字段中,所以可以更改它们。我创建了提交按钮,以便可以提交更改的值。 这是我的js代码:

$(document).ready(function () 
        $("#submit2").click(function () 
        event.preventDefault();
        $('form#list_prices_form input[type=number]').each(function () 
        default = $("#default").val();
        var value = $(this).val();
        var id = $(this).attr("name");
        console.log(id);
        console.log(value);
        );

        $.ajax(
                    type: "POST",
                    url: "save.php",
                    data: default: default, value: value, id: id,
                    success: function (response) 
                        default = $("#default").val();
                    $.ajax(
                        type: "POST",
                        url: "retrive.php",
                        data: default: default,
                        success: function (response) 
                            $('#list').html(response);
                          
                    );
                    
                );
                return false;
        );
        );

所以在控制台中我得到了所有必要的字段。它们为每个字段显示正确的 ID 和值。但它在控制台中显示错误:Uncaught ReferenceError: value is not defined

和php代码:

        $default = $_POST['default'];
        $value = $_REQUEST['value'];
        $id = $_REQUEST['id'];

        $result = $conn->query("SELECT * FROM tbl_name WHERE default = '$default'";
            $query = "UPDATE tbl_name SET (value_row) VALUES(?) WHERE id='$id'";
            $statement = $conn->prepare($query);
            $statement->bind_param('i', $value);
            if ($statement->execute()) 
                echo 'Changed';
               //print 'Success! ID of last inserted record is : ' . $statement->insert_id . '<br />';
             else 
                die('Error : (' . $conn->errno . ') ' . $conn->error);
            
            $statement->close();

【问题讨论】:

我可以看到您正在创建多个数字框,但是在执行 Ajax 时您只是传递了单行。这是为什么呢? 嗯...我为每个 .value 类分配了每个函数,所以我传递了每一行? 哦..对不起...我没见过.each。我建议不要传递多个ajax,而是传递一个数组。并在服务器端读取该数组并让for 循环遍历传入数组。 【参考方案1】:

第一个问题似乎是您的&lt;input&gt; 没有名字。因此浏览器不会提交该元素。这是根据W3 spec for successful controls

不要设置id,而是尝试设置name 属性。

例如

echo "$x: <input class='value' id='$id' name='$ID' value='$y' />";

请注意,通过 POST 而不是 GET 提交这些变量要好得多。这样做意味着 URI 中的数据不太可能被任何中间件记录。因此,您的 JQuery AJAX 看起来像:

$.ajax(
  type: 'post',
  url: "update.php",
  data: id: id, value: value,
  success: function(responseData) 
    console.log("Result" + responseData);
  
);

现在,由于您发布的是 JSON 而不是表单编码的数据,因此您需要从 PHP 脚本中读取 JSON:

$json = file_get_contents('php://input');
$obj = json_decode($json);
var_dump($obj); // show what data is in there for your debugging.

看起来有点像:

$obj->id; // the id POST'ed
$obj->value; // the value POST'ed

通过在 POST 之前聚合要发送的字段来减少您发出的 POST 请求的数量也可能是有益的。

例如

var values = [];
$(".value").each(function () 
  var getId = $('.value').prop('id');
  var id = $(getId).val();
  var getValue = $('.value').prop('value');
  var value = $(getValue).val();
  values.push(id: id, value: value);
);

$.ajax(
  type: 'get',
  url: "update.php",
  data: values,
  success: function(responseData) 
    console.log("Result" + responseData);
  
);

如果您这样做,那么您的 PHP 代码将需要如下所示:

$postData = file_get_contents('php://input');
$postJson = json_decode($postData);
$results = [];
foreach($postJson as $row) 
  // $row->id  and $row->value
  $sql = "UPDATE table SET y='$row->value' WHERE ID = '$row->id'";

  if ($conn->query($sql) === TRUE)
    $results[$row->id] = 'updated';
   else 
    $results[$row->id] = 'error';
  

$conn->close();
echo json_encode($results); // Return a list of ID => success/error

注意:鉴于您的数据库等,以上所有内容都完全未经测试

更重要的是,这段代码没有解决任何注入漏洞。在运行任何数据库操作之前,您应该转义并验证您的输入数据

【讨论】:

您好,感谢您的回答,但点击提交后没有任何反应。我将所有变量推送到数组中,然后在我的 update.php 中添加了您的一段 php 代码。但同样的事情......控制台没有错误,但行没有更新...... 我在为 foreach() 提供的 php 参数中发现错误【参考方案2】:

你的 jQuery 应该是这样的:

$(document).ready(function()
    $('#submit').click(function(e) 
        e.preventDefault();
        $(".value").each(function()
            var id = $(this).attr('id');
            var value = $(this).attr('value');
            $.ajax(
                type: 'get',
                url: "update.php",
                data: id: id, value: value,
                success: function()

                
            );
        );
    );
);

【讨论】:

@KondukterCRO 我用更新的 jQuery sn-p 部分地 重新创建了这个问题,它对我来说工作正常。您现在面临的问题是什么? 仍然没有任何反应。页面不会重新加载,但值不会更新。 @KondukterCRO 首先,在浏览器中安装firebug addon 以查看您是否正确传递了值。其次,table 是一个MySQL reserved keyword,所以你必须用反引号来转义它,就像这样:$sql = "UPDATE `table` SET y='$value' WHERE ID = '$id'";。第三,请用您的表格table 更新您的问题,以便我可以准确地重新创建问题。 感谢您的努力。我更新了我的问题,所以你可以看到我得到了什么。 @KondukterCRO 我的意思是用您的表格内容更新您的问题,即您在表格table 中的任何内容,因为只有在看到表格后我才能准确地重新创建问题。

以上是关于使用ajax为每个输入字段更新mysql中的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 AJAX 和 PHP 更新表单字段

update出现部分字段没有更新?

内联可编辑行以使用 ajax php 更新数据库 mysql 中的每个记录

使用 datepicker jquery ajax php 更新 mysql 数据库字段

复选框状态更改时如何更新mysql字段?使用 jquery (ajax)、php 和 mysql

选择总和直到设定数量,然后更新mysql数据库中的字段