2

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

4

4 回答 4

3

您可以先尝试纠正一些错误,因为使用 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(); 
        }
    }

};
于 2013-10-20T00:18:54.293 回答
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
    }
于 2013-10-20T00:43:44.167 回答
1

可能是解决方案:

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

  var id = row.find('input[name=id]' ).val();
  alert(id);
于 2014-02-15T09:06:39.520 回答
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++;
}

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

于 2017-03-11T14:49:18.890 回答