代码之家  ›  专栏  ›  技术社区  ›  JamMan9

php foreach循环在数据库中编辑错误记录

php
  •  0
  • JamMan9  · 技术社区  · 6 年前

    很好的一天,

    我的网站有点问题。

    我有一张表格,里面有我数据库里的一张桌子。在每条记录旁边,我有一个“编辑”和“删除”按钮(参见图1)。

    image 1

    图1

    如果单击记录“delete me”旁边的编辑按钮,将出现一个模式,并用可用的当前数据填充每个可编辑字段的值,然后可以编辑每个值并更新数据库。这很管用。

    我遇到的问题是:当我选择其中一个记录时,如果“name”字段与另一个“filling/size”字段重复(例如,如果我选择“filling/size”5),它总是用共享同一“name”的表中第一条记录的数据更新和预填充模式。图2显示了单击记录1-5的“编辑”按钮。

    image 2

    图2

    我试着在foreach循环中创建一个foreach循环,但这只是多次重复每个记录。我的代码在下面。如有任何意见或建议,将不胜感激。

    <div class="card mb-3">
            <div class="card-header">
                <i class="fa fa-table"></i>Items</div>
            <div class="card-body">
                <div class="table-responsive">
                    <table class="table table-bordered" id="dataTable" name="dataTable" width="100%" cellspacing="0">
                        <thead>
                        <tr>
                            <th>Name</th>
                            <th>Filling/Size</th>
                            <th>Category</th>
                            <th>Description</th>
                            <th>Price</th>
                            <th>Edit/Remove</th>
                        </tr>
                        </thead>
                        <tfoot>
                        <tr>
                            <th>Name</th>
                            <th>Filling/Size</th>
                            <th>Category</th>
                            <th>Description</th>
                            <th>Price</th>
                            <th>Edit/Remove</th>
                        </tr>
                        </tfoot>
                        <tbody>
                        <?php foreach ($result as $i => $row) { ?>
                                <tr>
                                    <td><?php echo $row->name; ?></td>
                                    <td><?php echo $row->filling; ?></td>
                                    <td><?php echo $row->category; ?></td>
                                    <td><?php echo $row->description; ?></td>
                                    <td><?php echo $row->price; ?></td>
                                    <td id="editRemoveButtonsCell">
                                        <button id="editButton" type="button" class="btn btn-outline-success" data-toggle="modal" data-target="#editItemModal<?php echo $row->name;?>">Edit</button>
                                        <button id="removeButton" type="button" class="btn btn-outline-danger" data-toggle="modal" data-target="#removeItemModal<?php echo $row->name;?>">Remove</button></td>
                                </tr>
    
                                <!-- Delete Modal -->
                                <div class="modal" id="removeItemModal<?php echo $row->name;?>">
                                    <div class="modal-dialog">
                                        <form>
                                            <div class="modal-content">
    
                                                <!-- Modal Header -->
                                                <div class="modal-header">
                                                    <h4 class="modal-title">Delete Item <?php echo $row->name?></h4>
                                                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                                                </div>
    
                                                <!-- Modal body -->
                                                <div class="modal-body">
                                                    Are you sure you want to delete item <?php echo $row->name?> <?php echo $row->filling;?>? <b>This cannot be undone!</b>
                                                </div>
    
                                                <!-- Modal footer -->
                                                <div class="modal-footer">
                                                    <input type="hidden" value="<?php echo $row->name;?>" name="deleteItemName" id="deleteItemName">
                                                    <input type="hidden" value="<?php echo $row->filling;?>" name="deleteItemFilling" id="deleteItemFilling">
                                                    <button type="button" class="btn btn-cancel" data-dismiss="modal">Close</button>
                                                    <input type="submit" name="deleteItem" id="deleteItem" value="Delete" class="btn btn-danger" />
                                                </div>
                                            </div>
                                        </form>
                                    </div>
                                </div>
    
                                <!-- Edit Modal -->
                                <div class="modal" id="editItemModal<?php echo $row->name;?>" name="editItemModal<?php echo $row->name;?>">
                                    <div class="modal-dialog">
                                        <form>
                                            <div class="modal-content">
    
                                                <!-- Modal Header -->
                                                <div class="modal-header">
                                                    <h4 class="modal-title">Edit Item <?php echo $row->name;?></h4>
                                                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                                                </div>
    
                                                <!-- Modal body -->
                                                <div class="modal-body">
                                                        <div class="form-group">
                                                            <label for="itemNameUpdate">Name</label>
                                                            <input type="text" class="form-control" id="itemNameUpdate" name="itemNameUpdate" placeholder="Enter Item Name" value="<?php echo $row->name;?>">
                                                            <input type="hidden" value="<?php echo $row->name;?>" name="itemNameOriginal" id="itemNameOriginal">
                                                            <input type="hidden" value="<?php echo $row->filling;?>" name="itemFillingOriginal" id="itemFillingOriginal">
                                                        </div>
                                                        <div class="form-group">
                                                            <label for="itemFillingUpdate">Filling/Size</label>
                                                            <input type="text" class="form-control" id="itemFillingUpdate" name="itemFillingUpdate" placeholder="Enter Filling/Size" value="<?php echo $row->filling;?>">
                                                        </div>
                                                        <div class="form-group">
                                                            <label for="itemCategoryUpdate">Category</label>
                                                            <select class="form-control" id="itemCategoryUpdate" name="itemCategoryUpdate">
                                                                <?php echo '<option>'.$row->category.'</option>';?>
                                                                <?php foreach($categories as $category) {echo '<option>'.$category->name.'</option>';}?>
                                                            </select>
                                                        </div>
                                                        <div class="form-group">
                                                            <label for="itemDescriptionUpdate">Description</label>
                                                            <textarea class="form-control" id="itemDescriptionUpdate" name="itemDescriptionUpdate" rows="3" placeholder="Item description (optional)"><?php echo $row->description;?></textarea>
                                                        </div>
                                                        <div class="form-group">
                                                            <label for="itemPriceUpdate">Price</label>
                                                            <input type="text" class="form-control" id="itemPriceUpdate" name="itemPriceUpdate" placeholder="Enter Price" value="<?php echo $row->price;?>">
                                                        </div>
                                                </div>
    
                                                <!-- Modal footer -->
                                                <div class="modal-footer">
                                                    <button type="button" class="btn btn-cancel" data-dismiss="modal">Close</button>
                                                    <input type="submit" name="editItem" id="editItem" value="Edit" class="btn btn-success" />
                                                </div>
                                            </div>
                                        </form>
                                    </div>
                                </div>
                        <?php } ?>
                        </tbody>
                    </table>
                </div>
            </div>
            <div class="card-footer small text-muted">Use the navigation bar to the left to edit the menu.</div>
        </div>
    </div>
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Martin Asuquo12    6 年前

    所有代码引用都指向 $row->name 我认为引用法典中的任何内容都是不好的做法 按姓名 .您希望通过每个案例上的唯一标识符(通常是一个数字)进行标识。所以你不会有这种模棱两可的感觉。

    图2显示了单击记录1-5的“编辑”按钮。

    在这个问题中,您不能清楚地标识自己的行,而不需要引入仅是偶然不同的外部数据。

    您需要的是数据库表中每一行的唯一标识符。

    这是一个绝对的基本标准,可以在 MySQL Dev Tutorial Here 是的。

    This SO question 可能对你也有帮助。

    因此您可以更新mysql(假设这是您的数据库):

    ALTER TABLE users ADD uid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
        ADD INDEX (uid);
    

    (同时 please see here 至于哪种int类型最适合您的情况)

    一旦为每一行设置了唯一的标识符,就需要在代码中使用该标识符,例如:

     <input type="hidden" value="<?php echo $row->uid;?>" 
                          name="deleteItemUniqueId" id="deleteItemUniqueId">
    

    以及

    <div class="modal" id="editItemModal<?php echo $row->uid;?>" 
                       name="editItemModal<?php echo $row->uid;?>">
    

    同样地,将此应用于整个代码库。

    这将停止HTML的任何重复 id 并停止代码逻辑与给定的标识数据部分的任何歧义有关的问题。