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

时间:2019-06-04 18:43:51

标签: php html mysql

我正在为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代码。但这给我带来了很多麻烦,我真的不知道为什么。如果有人可以帮助我,那就太好了。谢谢!

1 个答案:

答案 0 :(得分:3)

A)您没有给选择框起一个名字。因此它不会显示在您的$_POST数组中。将<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(...),它都将执行相同的操作。在这两种情况下,该名称都将存在于raids表中(并被更新为0)或不存在(且将不更新任何内容)。跳过SELECT, for(...)只会使您的代码更高效。