当前位置: 首页 > 知识库问答 >
问题:

PHP/MySQL仅更新已更改的输入字段

江展
2023-03-14

创建一个在PHP服务器端无法理解的小管理员行更新程序。我希望sql查询只更新页面上已更改的$u POST字段,这样它就不会循环所有100条左右的记录。

我的做法如下:

1) jQuery侦听已更改的输入字段,然后为已更新的用户字段分配名称属性

2) PHP检测已设置更新的用户字段。

3) 在提交重新加载时,PHP检测到该输入,并按行ID更新SQL。如何确保PHP知道哪个输入字段指向哪个行ID?

jQuery客户端更新名称属性:

    $(".listen").keyup(function() { 
        $(this).attr("name", "user-field-updated");
        })

生成超文本标记语言admin表,它类似于phpmyadmin的简单版本:

<form action="post">
<?php while($rows=mysql_fetch_array($result)) : ?>
<tr>
    <td>The editable field: <input class="listen" type="text" name="user-field" size="4" value="<?php echo $rows['Users'] ?>" />
        <input type="hidden" name="ID" value="<?php echo $rows['ID']; ?>" /></td>
</tr>
<?php endwhile; ?>

    <input type="submit" name="submit-button" value="Click to update only fields I changed" />
</form>

在我的页面底部是php脚本,它将在重新加载时触发:

if(isset($_POST['submit-button'])) {

    foreach($_POST as $name => $value) {
        if(isset($_POST['user-count-updated'])){
            $ID = $_POST['ID'];
            $sql = "UPDATE $tbl_name SET $name = $value WHERE id = '$ID'";
            $q->execute($db->prepare($sql)); 
        }
    }

};

一个可能被问到的问题是:在PHP中,如何在表单提交中“分组”相关值,以更新数据库中的不同行?如何让PHP知道要用字段输入更新哪一行。

jQuery改变文本字段的输入名称属性,并插入一个新的隐藏输入来触发下面的isset变量...

    $(".trigger-changed").keyup(function() { 
        $(this).addClass("changed");
        $(this).attr("name", $(this).data("name")).off("keyup");
        $("#mainform").append('<input type="hidden" name="user-updated"></input>')
        })

html

<td><input type="text" size="4" name="nochange" data-name="userfield@<?php echo $rows['ID'] ?>" value="<?php echo $rows['Users'] ?>" class="trigger-changed"></input></td>

php检测输入已更改(只是一个通用全局触发器,不特定于字段本身)。然后继续分析名称值。如果重新加载成功。

if(isset($_POST['user-updated'])) {
    foreach($_POST as $key => $value) {
        if($name != 'nochange'){
            $name = strtok($key, '@');
            $ID = strtok("\n");
            $sql = "UPDATE $tbl_name SET Users = $value WHERE ID = '$ID'";
            $result = mysql_query($sql);
            if($result){
                echo "<meta http-equiv=\"refresh\" content=\"0;URL=index.php\">";
                }
        }
    }
}

我还咨询了一位朋友,他提出了很多方法,从构造新数组到将隐藏的输入标记打印到html本身。我认为这个解决方案对于一个简单的改变来说是最紧凑的。

共有3个答案

申辉
2023-03-14

可能是解决方案:

  var row = $(this).parents(\"tr:first\")
  or
  var row = $(this).closest('tr');

  var id = row.find('input[name=id]' ).val();
  alert(id);
秦宏盛
2023-03-14

您可以先尝试更正somme错误,因为使用AJAX调用时很难看到PHP脚本错误。

由于所有记录均为单一形式,我们必须单独标识每个记录,如“user-field123-updated”:

js:

$(".listen").keyup(function() {
  var myname = $(this).attr("name");
  if(! myname.match(/updated/i)) {
    $(this).attr("name", myname + "-updated");
  }
})

超文本标记语言 () {} 循环时,用户名将由user-field 123标识:

<form action="post">
<?php while($rows=mysql_fetch_array($result)) { ?>
<tr>
    <td>Whatever this row name is: <?php echo $rows['Name']; ?>
        <input type="hidden" name="ID" value="<?php echo $rows['ID']; ?></td>
    <td>The editable field: <input class="listen" type="text" name="user-field<?php echo $rows['ID']; ?>" size="4" value="<?php echo $rows['Users']; ?>"></input></td>
</tr>
<?php } ?>
    <input type="submit" name="submit-button" value="Click to update only fields I changed"></input>
</form>

PHP保存在数据库中,语法:

//
// Users table $tbl_name must be set before:
//
if(isset($_POST['submit-button'])) {
    //
    // IDs is an array:
    //
    $IDs = $_POST['ID'];
    foreach($IDs as $ID) {
       if(isset($_POST['user-field' . $ID . '-updated'])){
            $value = $_POST['user-field' . $ID . '-updated'];
            $sql = "UPDATE $tbl_name SET Users = '$value' WHERE id = $ID";
            $q = $db->prepare($sql);
            $q->execute(); 
        }
    }

};
陶裕
2023-03-14

您在循环中打印了一堆同名的输入,在提交时无法区分它们。

试试类似的东西:HTML(我重写了一点,点在输入标记内)

while ($row = mysql_fetch_assoc())
    echo "<input
        name='no'
        data-name='fieldname@" . $row['ID'] . "'
        value='...'>";

JS:

$(".listen").keyup(function() { 
    $(this).attr("name", $(this).data("name")).off("keyup");
})

PHP:

foreach ($_POST as $key => $value)
    if($name != 'no'){
        $name = strtok($key, '@');
        $ID = strtok("\n");
        // here you will have $name
        //      (== "fieldname" from html example), $ID and $value
    }
 类似资料:
  • 我正在尝试用Angular构建一个简单的计算器,如果我想的话,我可以覆盖总数。我有这部分的工作,但当我回去输入一个数字在一个或两个领域的总数没有在该领域的更新。 这是我的jsfiddlehttp://jsfiddle.net/YUza7/2/ 形式 javascript

  • 问题内容: 仅在真正更改数据的情况下,才有可能使用“更新后”触发器。我知道“新旧”。但是使用它们时,我只能比较列。例如“ NEW.count <> OLD.count”。 但我想要类似的东西:如果“ NEW <> OLD”,则运行触发器 一个例子: 关键是,有一个更新,但是 什么都没有改变 。但是无论如何,触发器都在运行。恕我直言,应该有一个没有的方法。 我知道我可以使用 如果现在b <> OLD

  • 我一直在尝试改装,我真的很简单。 然而,我有一个奥化的担忧。我正在为我的后端使用Parse,它有一个纯restapi。 当我想要更新一个对象时,我使用一个,并只在

  • 我想使用POJO作为源来更新JOOQ记录中更改的字段<代码>记录。from(Object)几乎正确,但根据文档 结果记录的所有值的内部“更改”标志都将设置为true。 我只希望实际更改的字段(由对象决定。等于(对象,对象))更新其标志。 这有两个原因: 我不想触发插入

  • 每次鼠标左键单击,递增,因此值始终在变化。我想要显示在条目字段,但我无法实现这一点。 如何使输入字段始终更新并在?

  • 问题内容: 我在SQL Server中运行合并。在我的更新中,我只想更新值已更改的行。版本行在每次更新时都会递增。下面是一个示例: 现在,如果我只想更新行,从而增加版本,则仅在名称更改的情况下。 问题答案: 可以有。另外,无需更新。 如果Last_Name或First_Name可为空,则例如在比较trg.Last_Name <> src.Last_Name时,需要注意值。