繁体   English   中英

根据从HTML下拉菜单中选择的选项更新MySQL数据库

[英]Update MySQL Database based on option selected from an HTML dropdown menu

我正在为Pokemon Go开发一个网站,作为该网站的一部分,我正在制作一个自定义CMS,允许我插入/更改数据以在各种网页上显示。 我希望能够根据在下拉菜单中选择的老板将Raid Boss切换为“不活动”。

以下是下拉菜单所在表单的HTML代码。 基本上,我在Raid Bosses的数据库中查询当前处于活动状态或“ 1”的所有老板,并将它们附加到选项列表中:

<h5 style="text-decoration: underline;">Set Active Raid Boss to Inactive</h5>
    <form class = "form-group" method = "post">
          <select>
          <option disabled selected value> -- select an option -- </option>
          <?php
               $prep_stmt = $conn->prepare("SELECT * FROM raids WHERE isActive = 1");
               $prep_stmt->execute();
               $row = $prep_stmt->fetchAll();
               $count = $prep_stmt->rowCount();

               for($x = 0; $x < $count; $x++) {
                    echo "<option name ='".$row[$x]['name']."' value='".$row[$x]['name']."'>". $row[$x]['name']. "</option>";
               }
          ?>
          </select>
          <input name = "ToggleToInactiveRaid" type = "submit" value="Submit"/>
   </form>

以下是单击按钮时$ _POST请求的PHP代码:

if(isset($_POST['ToggleToInActiveRaid'])){
    $raids = $conn->prepare("SELECT * FROM raids WHERE isActive = 1");
    $raids->execute();

    $raidList = $raids->fetchAll();
    $count = $raids->rowCount();

    for($i = 0; $i < $count; $i++){
        if ($raidList[$i]['name'] == $_POST['name']){
            $stmt = $conn->prepare("UPDATE raids SET isActive = 0 WHERE raids.name = ".$_POST['name']);
            $stmt->execute();
        }
    }
}

出于某种原因,从未检测到POST请求。 我知道这一点是因为我在表单部分中回显了一个虚拟变量,该变量只有在POST请求if块中更新了它的值时才会显示,并且该变量从未转储到页面上。 我在CMS页面上还有其他形式,单击相应按钮时将在其中执行PHP代码。 但这给我带来了很多麻烦,我真的不知道为什么。 如果有人可以帮助我,那就太好了。 谢谢!

A)您没有给选择框起一个名字。 因此它不会显示在$_POST -array中。 <select>更改为<select name="name">

B)(假设isActive只能是01 ),您不必遍历数据库中的所有行即可仅停用其中一个。 只需使用(用准备好的语句修复)

$stmt = $conn->prepare("UPDATE raids SET isActive = 0 WHERE raids.name = :name");
$stmt->execute(array(':name' => $_POST['name']));

无论是否使用SELECT * FROM raids WHERE isActive = 1; for(...)情况下,它都将执行相同的操作SELECT * FROM raids WHERE isActive = 1; for(...) SELECT * FROM raids WHERE isActive = 1; for(...) 在这两种情况下,该名称都将存在于raids-table中(并更新为0 ),或者不存在(且不会更新任何内容)。 跳过SELECT, for(...)只会使您的代码更高效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM