PHP - POST 表单不会传递复选框的数值,但接受所有其他值


PHP - POST form will not pass numeric value for checkbox, but accepts all other values

$squery = $cbdbc->prepare("SELECT * from sitedata");
$squery->execute();
while ($srow = $squery->fetch(PDO::FETCH_ASSOC)) {
    if ($rresult[$srow['siteName']] !== $srow['siteID']) {
        echo "<tr><td><input type='checkbox' id='" . $srow['siteID'] . "' name='" . $srow['siteID'] . "' value='" . $srow['siteID'] . "'><label for='".$srow['siteID']."'>" . str_replace('_',' ',$srow['siteName']) . "</label></td></tr>";
    } else {
        echo "<tr><td><input type='checkbox' id='" . $srow['siteID'] . "' name='" . $srow['siteID'] . "' value='" . $srow['siteID'] . "' checked='checked'><label for='".$srow['siteID']."'>" . str_replace('_',' ',$srow['siteName']) . "</label></td></tr>";
    }
}
echo "<tr><td><input type='submit' value='Submit'></td></tr></table></form>";} elseif (null !== filter_input(INPUT_GET, 'setromstores')) {
$rid = filter_input(INPUT_GET, 'setromstores');
$squery = $cbdbc->prepare("SELECT * FROM sitedata");
$squery->execute();
while ($srow = $squery->fetch(PDO::FETCH_ASSOC)) {
    $sid = filter_input(INPUT_POST, (string)$srow['siteID']);
    if ($sid !== null) {
        $uquery = $cbdbc->prepare("UPDATE roms SET " . $srow['siteName'] . "=:sid WHERE romID = :rid");
        $uquery->bindParam(':sid', $sid);
        $uquery->bindParam(':rid', $rid);
        $uquery->execute();
    } else {
        $uquery = $cbdbc->prepare("UPDATE roms SET " . $srow['siteName'] . "= '0' WHERE romID = :rid");
        $uquery->bindParam(':rid', $rid);
        $uquery->execute();
    }
}

所以我正在尝试做一个系统,可以使用复选框为称为ROM的用户分配"站点"。

对于除"siteID"(在MySQL表上VARCHAR(5))的纯数字之外的每种类型的值,例如 abc, abc12, 0001siteID的值正确传递,并且该值在表"roms"中正确更新。

如果我有一个纯数作为siteID的值,例如 1, 15, 2339,它不会通过POST传递任何值,并且始终会导致0被设置在"roms"表中。

我尝试确保在每一步都将传递的值转换为字符串,但这似乎没有帮助。

虽然通常站点ID的格式是AXXXX,但我更愿意看看这是否可以修复,然后强制用户输入AXXXX的siteID,特别是因为将来可能会更改为纯数字。

值与

名称或 id 不同。您不能发送仅包含数字名称或 ID 的表单。将行更改为如下所示的内容:

<input type='checkbox' id='yourUniqueId" . $srow['siteID'] . "' name='checkboxes[" . $srow['siteID'] . "]' value='" . $srow['siteID'] . "' checked='checked'>

好吧,如您所见,您的复选框现在已命名checkboxes,它是一个数据数组!!您可以在PHP中接收

$_POST['checkboxes']; // array(value1, value2, value3)

你解决了你的问题。

表单字段名称必须是字符串。您可以使用此方法:

echo "<tr><td><input type='hidden' name='siteID[" . $srow['siteID'] . "]' value='0'><input type='checkbox' id='" . $srow['siteID'] . "' name='siteID[" . $srow['siteID'] . "]' value='" . $srow['siteID'] . "'><label for='".$srow['siteID']."'>" . str_replace('_',' ',$srow['siteName']) . "</label></td></tr>";

我像这样更改复选框名称name="siteId[12]",并添加隐藏字段(不是必需的)。

在该 siteID 之后是已检查站点的关联数组,其中键是 siteId,值为 1(如果选中)和 0(如果未选中)。

$sids = filter_input(INPUT_POST, 'siteID', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
while ($srow = $squery->fetch(PDO::FETCH_ASSOC)) {
  $sid = $sids[$srow['siteID']];
  // ...
}