ブートストラップアコーディオンを使用しています。各行を展開して、追加情報を含む「詳細セクション」と、その行をデータベースから削除するボタンを表示できます。PHPを使用して行IDと名前が割り当てられ、これが問題の原因となっているようです。隠しフィールドを使用して名前をエコーできますが、それは常にアコーディオンの最後の行の名前です。
PHP を使用して、どの行が展開されているかを検出し、その div の名前を取得するにはどうすればよいですか?
PHP/HTML
<?php
if (isset($_POST['btnDelete'])) {
$idnbr = $_POST['hid'];
echo $idnbr; // No matter which row is selected, always echoes last row's name
}
?>
<div id="div1">
<?php
// SQL and SQL connection stuff
while ($row = odbc_fetch_array($data)) {
?>
<div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#div1"
href="#<?php echo $row['idnbr']; ?>">Delete</a>
</div>
<div id="<?php echo $row['idnbr']; ?>" name="<?php echo $row['idnbr']; ?>"
class="accordion-body collapse">
<input type="hidden" id="hid" name="hid"
value="<?php echo $row['idnbr']; ?>">
</div>
<!-- Accordion body -->
<div>
<input class="btn" type="submit" name="btnDelete"
id="btnDelete" value="Delete">
</div>
<?php
}
?>
</div>
JS
// Hides/shows correct row
$('.accordion-toggle').click(function() {
var $acc = $('#div1');
$acc.on('show', '.collapse', function() {
$acc.find('.collapse.in').collapse('hide');
});
});
$('input#btnDelete').click(function() {
// Get the id of the selected row
var $selrow = $('#div1').find('.collapse.in');
var $attrid = $selrow.attr('name');
if (!confirm("Are you sure you want to Delete?")) {
event.preventDefault();
return;
} else {
$('#hid').val($attrid);
alert($attrid'); // Able to alert the correct row
}
});
私のjQueryでは、隠しフィールドの値を設定した後、ページが投稿されないようにしてコンソールで値を確認すると、それは正しいです。ページを投稿してコンソールで HFs 値を確認すると、[削除] をクリックした行に関係なく、常に最初の行の名前になります。したがって、最後の行の名前がエコーされ、最初の行の名前が隠しフィールドに設定されます。
DB
Desc | idnbr
-------------------
Desc 1 | 10
Desc 2 | 20
Desc 3 | 30
したがって、上記の例の DB を使用すると、ページに 3 つのアコーディオン行 (Desc 1、Desc 2、Desc 3) が表示されます。2 番目の行 (Desc 2) を展開して [削除] をクリックすると、次のようになります。
Alert: 20
Hidden Field: 10
Echo: 30
正しい値をエコーするために何をする必要がありますか、それとも完全に間違っていますか? (この場合は 20)