我有一个在foreach循环中创建几个文本输入的表单,如下所示:
<?php $results = $wpdb->get_results( "SELECT * FROM wp_results WHERE event_id = '$event' AND div_id = '$division'" ); ?>
<form action="" method="post">
<?php foreach ($results as $entry) { ?>
<p>
<?php echo $entry_name;?>
<input type="hidden" name="entry_id" value="$entry->user_id">
<input type="text" name="position" value="">
<input type="text" name="points" value="">
</p>
<?php }?>
<input type="submit" name="submit" value="Save Changes" class="button">
</form>
<?php
if ( isset( $_POST['submit'] ) ){
$entry_id = sanitize_text_field($_POST['entry_id']);
$position = sanitize_text_field($_POST['position']);
$points = sanitize_text_field($_POST['points']);
$wpdb->update('wp_results',
array(
'position' => $position,
'points' => $points,
),
array(
'user_id' => $entry_id,
)
);
}
?>
结果是一个html表单,如下所示:
<form action="" method="post">
<p>Aiden Hopkins
<input type="hidden" name="entry_id" value="98">
<input type="text" name="position" value="">
<input type="text" name="points" value="">
</p>
<p>Asha Sykes
<input type="hidden" name="entry_id" value="75">
<input type="text" name="position" value="">
<input type="text" name="points" value="">
</p>
<p>Ffion Hughes
<input type="hidden" name="entry_id" value="66">
<input type="text" name="position" value="">
<input type="text" name="points" value="">
<input type="submit" name="submit" value="Save Changes" class="button">
</form>
我遇到的问题是,当我尝试提交表单并将每个用户的结果写入数据库时,它只输入循环的最后一个实例的详细信息并忽略其他实例。
我在这里查看了其他答案,例如How to loop through an array of inputs in a form?,但是当我尝试这个时,我得到了所有数据库条目的'数组'。
我确信有一种简单的方法可以使用foreach或者其他东西来做这件事,但我只是搞砸了它而且我必须承认,数组不是我的强项!
答案 0 :(得分:1)
如果您要提交具有相同名称的多个输入,则必须将其声明为array
:<input type="hidden" name="entry_id[]" value="<?=$entry->user_id; ?>">
。然后,您可以迭代您的POST:
<?php $results = $wpdb->get_results( "SELECT * FROM wp_results WHERE event_id = '$event' AND div_id = '$division'" ); ?>
<form action="" method="post">
<?php foreach ($results as $entry) { ?>
<p>
<?php echo $entry_name;?>
<input type="hidden" name="entry_id[]" value="<?=$entry->user_id; ?>">
<input type="text" name="position[]" value="">
<input type="text" name="points[]" value="">
</p>
<?php }?>
<input type="submit" name="submit" value="Save Changes" class="button">
</form>
<?php
if ( isset( $_POST['submit'] ) ){
// Iterate over POST values
foreach ($_POST['entry_id'] as $key => $val) {
$entry_id = sanitize_text_field($_POST['entry_id'][$key]);
$position = sanitize_text_field($_POST['position'][$key]);
$points = sanitize_text_field($_POST['points'][$key]);
$wpdb->update('wp_results',
array(
'position' => $position,
'points' => $points,
),
array(
'user_id' => $entry_id,
)
);
}
}
?>
答案 1 :(得分:0)
正如@Anonymous所提到的,您的问题是您使用相同的名称作为输入。您应该使用唯一的名称。
您可以使用[]
命名输入以指示值数组。
例如:
<input type="text" name="array[]" value=1>
<input type="text" name="array[]" value=2>
<input type="text" name="array[]" value=3>
发布上述输入将为您提供:
$_POST['array'][0] = 1
$_POST['array'][1] = 2
$_POST['array'][2] = 3
在您的情况下,您可能会发现按ID分组数据很有帮助:
[
98 => [
'position' => 'value',
'points' => 0
],
75 => [
'position' => 'value1',
'points' => 11
],
66 => [
'position' => 'value2',
'points' => 22
],
]
在这种情况下你的PHP看起来像:
<?php foreach ($results as $entry) { ?>
<p>
<?php echo $entry_name;?>
<input type="text" name="person[$entry->user_id][position]" value="">
<input type="text" name="person[$entry->user_id][points]" value="">
</p>
<?php }?>