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

时间:2013-10-20 00:05:14

标签: php jquery mysql

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

这是我的方法:

1)jQuery侦听已更改的输入字段,然后分配名称属性user-field-updated

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

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

jQuery客户端更新名称属性:

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

生成HTML管理表,就像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知道我想用字段输入更新哪一行。


基于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本身。我认为这个解决方案对于简单的更改来说非常紧凑。

4 个答案:

答案 0 :(得分:3)

您可以先尝试更正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");
  }
})

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保存在DB中,语法:

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

};

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

可能是解决方案:

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

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

答案 3 :(得分:0)

在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++;
}

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