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);

我已经包含了一个数学和不匹配,所以你可以检查代码是否正常工作,它似乎做。我的主要问题是:

。这是一种体面的方法吗,还是这真的是一个服务器密集型的过程?

B。如何在in_array()搜索部分对$_POST数组进行消毒并使用呢?您可以看到,我试图使用经过消毒的字符串,但这行不通,所以现在我使用了$_POST,我知道这不是一个好主意。

对不起,这是真的很长,但如果这是一个有效的方式来做到这一点,我希望其他人有一个很好的解释如何得到这个工作。如果没有,我将删除它。

谢谢。

p>

我从经过处理的字符串中使用$_Post时,下面是通知消息。

注意:未定义变量:email_notice在/usr/local/apache/htdocs/scholarship/rankin/includes/activate_process.php第77行

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

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

问题A:复选框未选中,并且没有任何内容可以通过设置复选框未选中的disabled属性来发布,禁用的表单元素在提交表单时不会将其值发送给服务器。

您能提供关于问题B(var_dump $_POST['keywords']等)的更多调试信息吗?根据你现在的代码,很难确定b问题的原因