PHP / MySQL Update复选框选择到数据库

时间:2011-02-16 13:37:42

标签: php mysql

我正在尝试使用1或0更新数据库字段,具体取决于是否选中了复选框。

选中复选框时似乎有效,但空时则无效。

任何想法如何解决这个问题?代码如下。非常感谢,S。

以下是我表单中的代码:

$query  = "SELECT * FROM istable WHERE assocProp = '".$_POST['id']."'";
    $result = mysql_query($query);              
    while($row = mysql_fetch_array($result, MYSQL_ASSOC))
        {                                           
        echo '<li>                          
                <label for="changePP'.$row['id'].'"><input id="changePP'.$row['id'].'" type="checkbox" name="showPP_ids[]" value="'.$row['id'].'"'.($row['showPP']=='1' ? ' checked="checked"':NULL).' /> Display</label>
                </li>'. PHP_EOL;                                        
        } 

php进程代码(更新):

$newQuery=mysql_query("select * from ispdfs where assocProp = '".$_POST['id']."'");
    $newResult=mysql_fetch_array($newQuery);    

    foreach ($newResult as $showPP_ids) {
      $val = (int) isset($_POST['showPP_ids']); 
        mysql_query("UPDATE ispdfs SET showPP = $val WHERE id = ".mysql_real_escape_string($showPP_ids));
    }

2 个答案:

答案 0 :(得分:3)

此处没有任何内容可将值设置为零。未检查的框只会在$ _POST数组中不存在。

您需要单独列出所有复选框的名称并循环显示这些复选框,并将它们与$ _POST数组进行比较。

编辑:不打算编写任何代码,但是:

$allids = array('id1','id2','id3');

foreach ($allids as $oneid) {
  $val = (int) isset($_POST[$oneid]);  // will be 0 or 1
  mysql_query("UPDATE istable SET showPP = $val WHERE id = ".mysql_real_escape_string($oneid));
}

请注意,我们并不真正需要mysql_real_escape_string,因为我们知道所有id值都是安全的,但这是一个很好的做法,以防有人稍后出现并不小心更改$ allids数组。

再次编辑:假设我们不知道要查找哪些内容。

mysql_query("UPDATE istable SET showPP = 0");
foreach ($_POST as $oneid=>$nothing) {
  mysql_query("UPDATE istable SET showPP = 1 WHERE id = ".mysql_real_escape_string($oneid));
}

答案 1 :(得分:2)

  1. 未选中时,您的复选框值可能不会被发送。在PHP代码中通过print_r($_POST)确认 因此,你的情况

    if (isset($_POST['showPP_ids'])) {  
        foreach ($_POST['showPP_ids'] as $showPPId) {   
    

    永远不会找到未选中的复选框。

  2. 正如awm正确说明的那样(+1),您不会将字段showPP设置为0。这样做:

    $ppsql=mysql_query("UPDATE istable SET showPP = '0' WHERE id = ".mysql_real_escape_string($showPPId));
    

    当您要将sql字段设置为0时。

  3. 由于未选中复选框时不会发送,因此您需要了解更多有关所需复选框的信息。

    • 您可以(重复使用查询代码)

      $query  = "SELECT * FROM istable WHERE assocProp = '".$_POST['id']."'";
      $result = mysql_query($query);              
      while($row = mysql_fetch_array($result, MYSQL_ASSOC))
      {
          $found = false;
          foreach($_POST['showPP_ids'] as $showPPId)
          {
              if($showPPId == $row['id'])
              {
                  // checkbox found
                  $found = true;
                  break;
              }
          }
          $ppsql=mysql_query("UPDATE istable SET showPP = '"
                             .($found ? '1' : '0')
                             ."' WHERE id = ".mysql_real_escape_string($showPPId));                          
      } 
      
    • 另一种选择是JavaScript:提供两个复选框,如果另一个取消选中,则将“not”-checkbox设置为true 使用<input type="hidden">并更改其值复选框变了。如果您对此方法有疑问,请发表评论 - 我之前已经使用了一段时间......

  4. 另一种方法
    保持代码,你可以使用这种简单的方法(但请不要......):

    // first, set all fields to zero
    /* long version
    $query  = "SELECT * FROM istable WHERE assocProp = '".$_POST['id']."'";
    $result = mysql_query($query);              
    while($row = mysql_fetch_array($result, MYSQL_ASSOC))
        {                                           
             $ppsql=mysql_query("UPDATE istable SET showPP = '0' WHERE id = ".$row['id']);
        } 
    */
    // or short version:
    $ppsql=mysql_query("UPDATE istable SET showPP = 0");
    
    // now, update these rows that appear in `$_POST['showPP_ids']`
    // (using the code you provided)
    if (isset($_POST['showPP_ids'])) {  
        foreach ($_POST['showPP_ids'] as $showPPId) {                   
            $ppsql=mysql_query("UPDATE istable SET showPP = '1' WHERE id = ".mysql_real_escape_string($showPPId));                          
        }
    }