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

时间:2016-03-15 09:51:08

标签: php html mysql forms

$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的用户&#39; sites&#39;使用复选框。

除了&#39; siteID&#39;的纯数字之外的每种类型的值(在MySQL表上是VARCHAR(5)),例如abc, abc12, 0001siteID的值正确传递,价值在表格中正确更新。

如果我将纯数字作为siteID的值,例如1, 15, 2339,它不会通过POST传递任何值,并且始终会在{rom&#39}中设置0。表

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

虽然网站ID的格式通常为AXXXX,但我希望看看这是否可以修复,然后强制用户放入AXXXX的siteID,特别是因为这可能会在将来改为纯号。

2 个答案:

答案 0 :(得分:2)

不是与name或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)

你解决了问题。

答案 1 :(得分:1)

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

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是一个关联的已检查站点数组,其中key为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']];
  // ...
}