我正在为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代码。但这给我带来了很多麻烦,我真的不知道为什么。如果有人可以帮助我,那就太好了。谢谢!
答案 0 :(得分:3)
A)您没有给选择框起一个名字。因此它不会显示在您的$_POST
数组中。将<select>
更改为<select name="name">
B)(假设isActive
只能是0
或1
),您不必遍历数据库中的所有行即可仅停用其中的一行。只需使用(用准备好的语句修复)
$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(...)
只会使您的代码更高效。