2015-09-27 71 views
0

我一直在寻找表单和其他网站上的最后3天解决方案的问题,当一个复选框没有点击,它不会传递一个值时提交。在发布之前,有很多使用javascript的解决方案来检查该框是否被选中,但我不确定如何使其正确工作。还有很多解决方案使用与复选框相同名称的隐藏文本字段,但是作为其他人在这些帖子中指出的以及我发现的内容,这两个值都已发布,因此在我的情况下它不起作用。PHP复选框,如果您取消选中该框,则不会发布任何内容。可能的解决方案

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

我也有一个获得$ _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 [“关键字”]数组。我再次知道我必须对此进行消毒。

以下是流程页面的代码。

// 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.我怎样才能获得$ _POST阵列进行消毒并在in_array()搜索部分使用,你可以看到我试图用已消毒的字符串,但我就不会现在工作,所以我使用$ _POST,我知道这不是一个好主意。

对不起,这是非常长的,但如果这是一个有效的方法来做到这一点,我希望别人有一个很好的解释如何让这个工作。如果没有,我会删除它。

谢谢。

PS

这里是通知消息时,我用的是$ _ POST从消毒字符串。

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

回答

1

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

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

+0

感谢您的建议,我可以问清楚我的通信是什么意思。其次,我的关键字列表如何在请求和提交之间发生变化,我会认为它必须是是或否,或者这是否适合注入其他信息?我对这个愚蠢的问题表示歉意,但我是一名培训辅导员,这是一种爱好。 – Vincent

+0

指定A =是,B =是,C =否比A =是更明确,B =是+查找关键字= A,B,C。当用户填写表单时,C关键字可能已被别人添加到数据库中。所以他们没有机会选择C,但是数据库保存了C = no,这可能是一个错误的否定。 – Phil

+0

好吧,是的,现在我明白了,这是合乎逻辑的。再次感谢您的帮助和信息。 – Vincent

0

问题答:复选框取消选中,并没有得到公布,可以通过集复选框上的disabled属性未选中,则在提交表单时,禁用的表单元素将不会将其值发送到服务器。

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

+0

嗨,对不起,我出去了。该代码现在可以工作,但我的问题是两部分, – Vincent

+0

A)这是一个正确的方法来做到这一点,而不是服务器密集型或内在错误。我没有看到这样做,这就是为什么我问。和B)有没有尝试清理数组的方法有问题。我会把错误信息放在上面的文章中。 – Vincent

相关问题