0

ブートストラップアコーディオンを使用しています。各行を展開して、追加情報を含む「詳細セクション」と、その行をデータベースから削除するボタンを表示できます。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)

4

1 に答える 1

1

次のように、入力送信の名前属性を一意にします
<input class="btn" type="submit" name="btnDelete<?php echo $row['idnbr']; ?>" id="btnDelete" value="Delete">

その後:

  if(!empty($_POST))
  {
     $idnr = str_replace('btnDelete','',array_search('Delete', $_POST));
  }
于 2013-06-03T18:16:01.313 に答える