【问题标题】:PHP/MySQL only update input fields that have been changedPHP/MySQL 仅更新已更改的输入字段
【发布时间】:2013-10-28 15:27:31
【问题描述】:

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

这是我的方法:

1) jQuery 监听改变的输入字段,然后分配 name 属性 user-field-updated

2) PHP 检测到 user-field-updated 已设置。

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

jQuery 客户端更新名称属性:

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

生成类似于简单版phpmyadmin的HTML管理表:

<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 知道我想用字段输入更新哪一行。


基于 jacouh 创建的解决方案

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 本身的各种方法。我认为这个解决方案对于简单的更改来说是最紧凑的。

【问题讨论】:

  • 你的 PHP 部分,sql 查询中的 $name 变量是什么?它总是“用户字段”吗?
  • 一方面,您需要将id = $ID" 更改为id = '$ID'"
  • 我认为我没有正确提出或提出这个问题。但无论如何,我的 JS 将用户字段更改为用户字段更新。这是一种让 PHP 知道该变量是否已设置的方法。我想知道我是否应该让 PHP 创建一个新数组,然后在 SQL 更新中循环遍历它。
  • 每行总是有一个字段,还是每行有多个字段可以更改?如果每行仅更改一个字段,则答案会有所不同,而对于多个字段,您的输入需要某种数组语法。
  • 没有详细查看 PHP 部分,但我注意到您的表单 actionPOST,相反,method 应该是 POSTaction 应该是服务器端脚本的 url。

标签: php jquery mysql


【解决方案1】:

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

由于所有记录都在一个表单中,我们必须单独识别每条记录,例如“user-field123-updated”:

js:

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

HTML while () {} 循环,用户名将由 user-field123 识别:

<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(); 
        }
    }

};

【讨论】:

  • 我看不到发生了什么变化。
  • 这对 OP 的问题没有帮助。
  • 我看到了这个:$q->execute($db->prepare($sql));可能是错误的?并且字符串 $value 没有被引用。
  • 是的,那是一个错误,但显然这不是真正的 OP 代码,而是一些假冒的想法。
  • 是的,这里没有任何变化。我有点要求有人修复我的代码来做我想做的事,这可能不是 Stack Overflow 的好处。 foreach 部分无法区分哪个 ID 转到哪个用户计数。这就是问题所在。
【解决方案2】:

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

尝试类似的东西: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
    }

【讨论】:

  • 哦,有趣!只需将所有变量作为属性存储到每个输入标签中。我不知道 PHP 可以读取它们。
  • @liquified PHP 读取 namevalue。因此,您将所有需要的属性存储在 name 中,然后对其进行解析。我建议用@除,还有其他方法。
【解决方案3】:

可能是解决方案:

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

  var id = row.find('input[name=id]' ).val();
  alert(id);

【讨论】:

  • 我已经使用这种 jQuery 技术将所有值整理到一个隐藏的输入字段中。但是在这种情况下,我很好奇是否存在“纯” PHP/HTML 方式。
【解决方案4】:

在 HTML 中更改

 <input type="hidden" name="ID">

 <input type="hidden" name="ID[]">

对循环中的每个输入执行此操作

你操作的 PHP 页面将在数组中收到 $_POST 值

1) 如果 name="ID" $_POST['ID'] = string;

2) 如果 name="ID[]" $_POST['ID'] = 字符串数组; 然后你可以循环设置这样的东西

$counter = 0;
foreach($_POST['ID'] as $k => $v) {
  // do something
  // like $sql = "update `table` set a = b where id = '{$v}';";
  $counter++;
}

这项技术对我有很大帮助:)

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多