PHP 如果取消选中复选框,则不会发布任何内容。可能的解决方案

PHP Checkbox if you uncheck the box nothing gets posted. Possible solution

最近 3 天我一直在表单和其他网站上寻找解决方案,以解决未单击复选框时提交时不会传递值的问题。有很多解决方案使用 javascript 来检查该框是否被选中,然后再发布,但我不确定如何让它正常工作。还有许多使用与复选框同名的隐藏文本字段的解决方案,但正如这些帖子中的其他人所指出的以及我所发现的那样,这两个值都已发布,因此在我的情况下它不起作用。

这是我想出的,我想知道它是否有很大的问题。它有效,但解决方案是否会以某种方式效率低下。

我在清理 $_POST[] 数组时也遇到了问题,也许有人知道为什么经过清理的值在 in_array() 中不起作用。

所以我就是这样做的。

首先,当我创建表单时,我是动态创建的,并从数据库中为复选框分配了现有值。

include('connect.php');

   $sql = "SELECT * FROM scholarships WHERE schools='both' OR schools='Rankin'";
   $result = $conn->query($sql);

   if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
   echo "<tr>"."<td>".$row['sch_name']."</td>"."<td>".$row['category']."</td>"."<td>".$row['date']."</td>"."<td>".$row['activate']."</td>"."<td>";

   ?>

   <li><input type="checkbox" name="keywords[]"  value="<? echo $row['id']; ?>" title="option1" 
   <?

    // this puts a check in the box if it is in the database

        if($row['activate']=="Yes")
        {
            echo "checked"."="."\"Checked\"";
        }
        else
        {
        // allows for not check value
        }

   ?>
  /></li><br />

   <?
    echo "</td>"."</tr>";
}
  } else {
echo "0 results";
  }
  $conn->close();

接下来我将其发布到一个处理页面,我在其中创建了两个循环,一个用于读取数据库中的现有值,另一个用于将其与 $_POST['keywords'] 数组进行比较。我再次知道我必须对此进行消毒。

这是流程页面的代码。

// sanitize the restults from the form

$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);


// conect to the database
include('connect.php');

// check to see what values were actually check
foreach($_POST['keywords'] as $keyword)
{
 echo $keyword."<br>";
}
echo "<hr>";


// get the list of values from database table to compare

$sql = "SELECT * FROM scholarships WHERE schools='both' OR schools='Rankin'";
  $result = $conn->query($sql);

  if ($result->num_rows > 0) {

  // output data of each row
  while($row = $result->fetch_assoc()) {
    $key=$row['id'];
        if (in_array($key, $_POST['keywords'], TRUE))
  {
            echo $row['id']." "."Match found<br>";
                $id = $row['id'];

    // update records if a match is found to value Yes

          $sql2 = "UPDATE scholarships SET activate='Yes' WHERE id=$id";

            if (mysqli_query($conn, $sql2)) {
            echo "Record updated successfully";
            } else {
                echo "Error updating record: " . mysqli_error($conn);
            }


  }
else
  {
            echo $row['id']." "."Match not found<br>";
            $id = $row['id'];
            $sql2 = "UPDATE scholarships SET activate='0' WHERE id=$id";

        if (mysqli_query($conn, $sql2)) {
            echo "Record updated successfully";
        } else {
            echo "Error updating record: " . mysqli_error($conn);
        }

  } 


    }   


} else {
    echo "0 results";
}
echo "<hr>";





mysqli_close($conn);

我已经包括了一个数学但不匹配所以你可以检查代码是否正常工作,它看起来确实如此。我的大问题是:

一个。这是执行此操作的体面方法,还是这真的是服务器密集型过程。

乙。我怎样才能清理 $_POST 数组并在 in_array() 搜索部分中使用你可以看到我尝试使用清理过的字符串,但那是行不通的,所以现在我使用了我知道的 $_POST这不是一个好主意。

抱歉,这真的很长,但如果这是一种有效的方法,我希望其他人能够很好地解释如何让它发挥作用。如果没有我会删除它。

谢谢。

PS

这是我使用经过清理的字符串中的 $_Post 时的通知消息。

注意:未定义变量:email_notice in /usr/local/apache/htdocs/scholarship/rankin/includes/activate_process.php on line 77

问题 A:未选中复选框,通过将复选框上的 disabled 属性设置为未选中,无法发布任何内容,禁用的表单元素在提交表单时不会将其值发送到服务器。

能否提供更多关于问题 B 的调试信息(var_dump $_POST['keywords'] 等等)?现在根据您的代码,确定导致问题B的原因非常微妙。

我会专注于让客户端 js 正常工作。避免在选中的复选框上重复发布绝对是可能的,并且可以使您的交流更加明确。

您的代码详细说明了一种方法,该方法暗示对缺失关键字的否定。这两种方法都很好,但如果您的关键字列表在请求表单和提交之间有任何可能发生变化,则不推荐使用隐式方法。