0

好的,我知道这已经回答了几次,但我似乎无法让我的工作!

我的数据库中有 8 周(设置为列),我用 php 显示这些值,如下所示

<form method="post" id="updating" action="<?php $_PHP_SELF ?>">

        <?php
        $count = 1;
        foreach ($results as $v) {
            while($count<9){
                $week = Week.$count;
                $checkvalue = $v -> $week;
                ?>
                Week<?echo $count;?> <input type="checkbox" id="Week<?php echo$count;?>" name="week[]" value="<?php echo $checkvalue;?>" <?php if($checkvalue==1){?>
                checked="checked"
                <?php } ?>
                />
                <?php   
                $count++; 
            }
        }
        ?>
        <input name="update" type="submit" id="update" value="Update">
    </form>

我知道它可能没有应有的优雅,但它确实为我输出了正确的 HTML 并显示了数据库中显示的信息。

<form method="post" id="updating" action="">

        Week1 <input type="checkbox" id="Week1" name="week[]" value="1"     checked="checked"
        />
    Week2 <input type="checkbox" id="Week2" name="week[]" value="0"     />
    Week3 <input type="checkbox" id="Week3" name="week[]" value="1"     checked="checked"
        />
    Week4 <input type="checkbox" id="Week4" name="week[]" value="1"     checked="checked"
        />
    Week5 <input type="checkbox" id="Week5" name="week[]" value="0"     />
    Week6 <input type="checkbox" id="Week6" name="week[]" value="1"     checked="checked"
        />
    Week7 <input type="checkbox" id="Week7" name="week[]" value="1"     checked="checked"
        />
    Week8 <input type="checkbox" id="Week8" name="week[]" value="1"     checked="checked"
        />
<input name="update" type="submit" id="update" value="Update">
</form>

我遇到的问题是,当我勾选或取消勾选这些复选框时,更新的值似乎没有被捕获,因此数据库没有正确更新。这是处理自我发布请求的地方。

<?php if(isset($_POST['update']))
{
    $count = 1;
    if(isset($_POST['week']) && !empty($_POST['week']))   
    foreach($_POST['week'] as $w){ echo $w; //prints 1 all the time
$week = Week.$count;
echo $week;//prints out weeks I want to update correctly (database headings)
$query = $db->getQuery(true);

// Fields to update.
$fields = array(
    $week.'=' . $db->quote( $w ));

// Conditions for which records should be updated.
$conditions = array(
    'UserID='. (int) $user_id);

$query->update($db->quoteName('tools_engage'))->set($fields)->where($conditions);

$db->setQuery($query);

try {
    $result = $db->query(); // Use $db->execute() for Joomla 3.0.
    echo ("Values saved and updated </br>");
    $count++;
} catch (Exception $e) {
    // Catch the error.
}
}
}?>

我在 Joomla 中执行此操作,因此使用了奇怪的数据库更新语法,但它确实有效,而且我在该程序的其他地方使用过它们,所以我知道它们不是问题

正如我在代码中评论的那样,无论我选中或取消选中哪些框,数组 week[] 似乎都包含所有值 1。然后导致数据库中的每个值都更新为 1/true,这显然是不正确的。

我怀疑问题出在我的更新表单的 HTML 输出中,但似乎无法破解它,非常感谢任何帮助!

更新: 好的,继续 nvuono 的建议,我已将我的表格更新为这样

<?php
$count = 1;
foreach ($results as $v) {
while($count<9){
    $week = Week.$count;
    $checkvalue = $v -> $week;
    ?>
    Week<?echo $count;?> <input type="checkbox" id="Week<?php echo$count;?>" name="week[<?php echo $count;?>]" value="1" <?php if($checkvalue==1){?>
    checked="checked"
    <?php } ?>
    />
<?php   
$count++; 
}
}
?>

那么现在每个名称在数组中都有一个索引,不是吗?如果是这样的话,我应该

if(isset($_POST['update']))

部分现在不是按照输入的顺序打印出数组中的所有值吗?

IE。我的逻辑是它打印出 1,0,0,1,0,0,0(选中框 1 和 4)或选中的框。但它只是打印出 1,1 所以我无法知道它们是什么索引,以及随后我应该在哪一周更新

4

1 回答 1

1

我添加了一些非常老套的更新方式。使用时需要提防 SQL 注入和其他不好的事情post……确保始终验证和清理数据。“hacky”方式之所以有效,是因为我们使用的是整数值,而且这些值很容易清理。

截屏:

在此处输入图像描述

这是我的桌子......我这样称呼它是为了stackoverflow......

+----+-------+-------+-------+-------+-------+-------+-------+-------+
| id | week1 | week2 | week3 | week4 | week5 | week6 | week7 | week8 |
+----+-------+-------+-------+-------+-------+-------+-------+-------+
|  1 |       |       |       |       |       |       |       |       |
|  2 | 1     |       |       |       |       |       |       |       |
|  3 | 1     |       | 1     |       |       |       |       |       |
|  4 | 1     |       | 1     |       | 1     |       |       |       |
|  5 | 1     |       | 1     |       | 1     |       | 1     |       |
+----+-------+-------+-------+-------+-------+-------+-------+-------+

这是我的 PHP 文件....(将其粘贴在一个空的 PHP 文档中运行,除了更改数据库连接和查询之外,它是自包含的)

<?php 
$mysqli = new mysqli("localhost", "root", "password", "test"); 

if (!empty($_POST)) {
   print "<pre>POST VARS: \n".print_r($_POST,true)."</pre>";

   foreach($_POST as $i => $data) 
   { 
      if (substr($i,0,3)=='row' && is_numeric(substr($i,3)))
      {
         $row_id = substr($i,3);  
         $data = array_flip($data); 
         $values = array(); 

         for ($x=1; $x<9; $x++) {
            $values[] = "week$x = ". ((isset($data[$x])) ? '1' : '0');  
         }   

         $stmt = "\nupdate so ".
                 "\n  set ".implode(", \n      ",$values).
                 "\n  where id = $row_id; \n"; 

         $update = $mysqli->query($stmt); 
         if ($update) { print "Row $row_id updated successfully.<br/>"; } 
      }
      print "<br/>"; 
   }
}
$result = $mysqli->query("select * from so"); 

$mysqli->close();
?>

<form method="post" id="updating" action="<?php $_PHP_SELF ?>"> 
   <?php
   while($row = $result->fetch_object())
   {

      $count = 1;

      print "<div style='border:1px solid black; display:inline-block;'>\n";
      print "Row ".$row->id."<br/>\n"; 
      while($count < 9) 
      {
         $week = "week$count";

         $checkvalue = $row->{$week};
         ?>
         Week<?php echo $count ?> <input type="checkbox" id="Week<?php echo$count;?>" name="row<?php echo $row->id 
         ?>[]" value="<?php echo $count;?>" <?php if($checkvalue==1){
         ?>  checked="checked" <?php } ?> />&nbsp;&nbsp;&nbsp;
         <?php   
         $count++; 
      }
      print "</div><br/><br/>\n\n\n"; 
   }
   ?>
        <input name="update" type="submit" id="update" value="Update">
    </form>

这是$_POST提交后:

POST VARS: 
Array
(
    [row2] => Array
        (
            [0] => 1
        )

    [row3] => Array
        (
            [0] => 1
            [1] => 3
        )

    [row4] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 5
        )

    [row5] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 5
            [3] => 7
        )

    [update] => Update
)

我的表格“查看源代码”:

<form method="post" id="updating" action=""> 
   <div style='border:1px solid black; display:inline-block;'>
Row 1<br/>
         Week1 <input type="checkbox" id="Week1" name="row1[]" value="1"  />&nbsp;&nbsp;&nbsp;
                  Week2 <input type="checkbox" id="Week2" name="row1[]" value="2"  />&nbsp;&nbsp;&nbsp;
                  Week3 <input type="checkbox" id="Week3" name="row1[]" value="3"  />&nbsp;&nbsp;&nbsp;
                  Week4 <input type="checkbox" id="Week4" name="row1[]" value="4"  />&nbsp;&nbsp;&nbsp;
                  Week5 <input type="checkbox" id="Week5" name="row1[]" value="5"  />&nbsp;&nbsp;&nbsp;
                  Week6 <input type="checkbox" id="Week6" name="row1[]" value="6"  />&nbsp;&nbsp;&nbsp;
                  Week7 <input type="checkbox" id="Week7" name="row1[]" value="7"  />&nbsp;&nbsp;&nbsp;
                  Week8 <input type="checkbox" id="Week8" name="row1[]" value="8"  />&nbsp;&nbsp;&nbsp;
         </div><br/><br/>


<div style='border:1px solid black; display:inline-block;'>
Row 2<br/>
         Week1 <input type="checkbox" id="Week1" name="row2[]" value="1"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week2 <input type="checkbox" id="Week2" name="row2[]" value="2"  />&nbsp;&nbsp;&nbsp;
                  Week3 <input type="checkbox" id="Week3" name="row2[]" value="3"  />&nbsp;&nbsp;&nbsp;
                  Week4 <input type="checkbox" id="Week4" name="row2[]" value="4"  />&nbsp;&nbsp;&nbsp;
                  Week5 <input type="checkbox" id="Week5" name="row2[]" value="5"  />&nbsp;&nbsp;&nbsp;
                  Week6 <input type="checkbox" id="Week6" name="row2[]" value="6"  />&nbsp;&nbsp;&nbsp;
                  Week7 <input type="checkbox" id="Week7" name="row2[]" value="7"  />&nbsp;&nbsp;&nbsp;
                  Week8 <input type="checkbox" id="Week8" name="row2[]" value="8"  />&nbsp;&nbsp;&nbsp;
         </div><br/><br/>


<div style='border:1px solid black; display:inline-block;'>
Row 3<br/>
         Week1 <input type="checkbox" id="Week1" name="row3[]" value="1"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week2 <input type="checkbox" id="Week2" name="row3[]" value="2"  />&nbsp;&nbsp;&nbsp;
                  Week3 <input type="checkbox" id="Week3" name="row3[]" value="3"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week4 <input type="checkbox" id="Week4" name="row3[]" value="4"  />&nbsp;&nbsp;&nbsp;
                  Week5 <input type="checkbox" id="Week5" name="row3[]" value="5"  />&nbsp;&nbsp;&nbsp;
                  Week6 <input type="checkbox" id="Week6" name="row3[]" value="6"  />&nbsp;&nbsp;&nbsp;
                  Week7 <input type="checkbox" id="Week7" name="row3[]" value="7"  />&nbsp;&nbsp;&nbsp;
                  Week8 <input type="checkbox" id="Week8" name="row3[]" value="8"  />&nbsp;&nbsp;&nbsp;
         </div><br/><br/>


<div style='border:1px solid black; display:inline-block;'>
Row 4<br/>
         Week1 <input type="checkbox" id="Week1" name="row4[]" value="1"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week2 <input type="checkbox" id="Week2" name="row4[]" value="2"  />&nbsp;&nbsp;&nbsp;
                  Week3 <input type="checkbox" id="Week3" name="row4[]" value="3"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week4 <input type="checkbox" id="Week4" name="row4[]" value="4"  />&nbsp;&nbsp;&nbsp;
                  Week5 <input type="checkbox" id="Week5" name="row4[]" value="5"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week6 <input type="checkbox" id="Week6" name="row4[]" value="6"  />&nbsp;&nbsp;&nbsp;
                  Week7 <input type="checkbox" id="Week7" name="row4[]" value="7"  />&nbsp;&nbsp;&nbsp;
                  Week8 <input type="checkbox" id="Week8" name="row4[]" value="8"  />&nbsp;&nbsp;&nbsp;
         </div><br/><br/>


<div style='border:1px solid black; display:inline-block;'>
Row 5<br/>
         Week1 <input type="checkbox" id="Week1" name="row5[]" value="1"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week2 <input type="checkbox" id="Week2" name="row5[]" value="2"  />&nbsp;&nbsp;&nbsp;
                  Week3 <input type="checkbox" id="Week3" name="row5[]" value="3"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week4 <input type="checkbox" id="Week4" name="row5[]" value="4"  />&nbsp;&nbsp;&nbsp;
                  Week5 <input type="checkbox" id="Week5" name="row5[]" value="5"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week6 <input type="checkbox" id="Week6" name="row5[]" value="6"  />&nbsp;&nbsp;&nbsp;
                  Week7 <input type="checkbox" id="Week7" name="row5[]" value="7"   checked="checked"  />&nbsp;&nbsp;&nbsp;
                  Week8 <input type="checkbox" id="Week8" name="row5[]" value="8"  />&nbsp;&nbsp;&nbsp;
         </div><br/><br/>


        <input name="update" type="submit" id="update" value="Update">
    </form>

编辑
我回到这个答案来参考一些东西,我刚刚意识到我正在重新使用ID复选框的值。在这种情况下这不是问题,但它总是不好的做法。每个复选框都应该有一个在页面上唯一的 ID。所以....它真的应该id="row1week1"id="row1week2"......id="row8week1"id="row8week8"

于 2013-09-05T16:30:11.740 回答