创建一个我在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知道我想用字段输入更新哪一行。
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本身。我认为这个解决方案对于简单的更改来说非常紧凑。
答案 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++;
}
这项技术对我很有帮助:))