2014-09-03 102 views
0

我正在创建一个系统,其中用户将能够更改MySQL表中项目的“状态”。使用php和复选框更新多行mysql

基本上我的表有一个独特的(自动递增)ID字段和其他18个字段。其中一个领域是地位领域。我需要找出一种方法,当用户勾选复选框时,将状态从“活动”更改为“保持”。

我假设如果我给复选框赋值并将其馈送到自动递增数组中,它应该在检查时通过。我不知道这是否正确。

每次我尝试它时,唯一被改变的状态是第一个状态,就是这样。这里是我的代码,翻出条目的:

while($row = mysqli_fetch_array($result)) 
     { 
      echo "<table border='2' style='width: 100%; margin: auto; border-width: 1px'><tr><th>Date Requested</th><th>Time Called</th><th>Tenant Name</th><th>Apartment</th><th>Work Requested</th><th>Tenant need to be present?</th><th>Good Date</th><th>Time to complete</th><th>Resident Phone #</th></tr>"; 
      echo "<input type='hidden' name='id[$i]' value=" . $row['id'] . ">"; 
      echo "<tr>"; 
      echo "<td align='center'>" . date("m-d-Y", strtotime($row['r_date'])) . "</td>"; 
      echo "<td align='center'>" . date("g:i A", strtotime($row['t_call'])) . "</td>"; 
      echo "<td align='center'>" . $row['t_name'] . "</td>"; 
      echo "<td align='center'>" . $row['loc'] . "</td>"; 
      echo "<td align='center'>" . $row['w_req'] . "</td>"; 
      echo "<td align='center'>" . $row['apt_status'] . "</td>"; 
      if ($row['to_be'] == "1969-12-31") { 
       echo "<td align='center'> </td>"; 
       } 
      else { 
       echo "<td align='center'>" . date("m-d-Y", strtotime($row['to_be'])) . "</td>"; 
       }; 
      echo "<td align='center'>" . $row['g_time'] . "</td>"; 
      echo "<td align='center'>" . $row['tel'] . "</td></tr>"; 
      echo "<tr><td align='center' colspan = '3' style='border-width:0px; background-color: #E6E6E6'><strong>Work performed/notes:</strong><br><textarea name='work[$i]'style='width:250px; height:60px'>" . htmlspecialchars($row['w_performed'], ENT_QUOTES) . "</textarea></td>"; 
      echo "<td colspan='2' align='center' style='border-width:0px; background-color: #E6E6E6'><strong>Check to put Work Order on hold.</strong><br><input name='holding' type='checkbox' value='" . $row['id'] . "' ></td>"; 
      echo "<td colspan='4' style='border-width:0px; background-color: #E6E6E6'>&nbsp;</td>"; 
      echo "<tr><td colspan='9' style='border-width:0px'><hr style='height:3px; color: #333; background-color: #333'></td>"; 
      ++$i; 
     } 
echo "</table>"; 

而且我一直在试图使用通过使用复选框的ID拉代码是这样的:

$i = 0; 

     $size = count($_POST['holding']); 
     while($i < $size) 
     { 

     while(isset($_POST['holding'][$i])) 
     { 
      $sql = "UPDATE w_o SET w_status = 'hold' WHERE id = " . $_POST['id'][$i]; 
      mysqli_query($mysqli, $sql) or die('Error: ' . $mysqli_error($mysqli)); 
      ++$i; 
     } 
     } 

我觉得我总之,并会感谢任何帮助。我用google搜索了这么多次,出于某种原因,我似乎找不到足够好的教程。感谢您的帮助!

+0

当使用'mysqli'时,您应该使用参数化查询和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询中。 **不要**使用字符串插值来实现此目的,因为您将创建严重的[SQL注入漏洞](http://bobby-tables.com/)。 '$ _POST'数据**从不**直接进入查询。 – tadman 2014-09-03 15:25:46

回答

-2
$sql = "UPDATE w_o SET w_status = 'hold' WHERE id in (".array_map("intval",implode(',',$_POST['holding'][$i])).")"; 

这样你就可以用单个SQL

+0

这非常需要一些[SQL转义](http://bobby-tables.com/php)。 – tadman 2014-09-03 15:29:03

+1

,反正不起作用,因为PHP只会接受一个字段名的单个值,除非最后得到'[]'。 – 2014-09-03 15:29:42

+0

虽然善意,'intval'不能替代正确的转义,因为它不是一个通用的解决方案。 – tadman 2014-09-03 15:32:31

1

您所有的复选框更新所有的人都会有相同的holding名。提交后,PHP将只使用提交的多个值中的一个。如果您想提交多个不同的值,则必须为每个字段指定一个唯一的名称,或者使用PHP的“数组”字段名称:holding[]。添加[]告诉PHP预期有多个值,并且$_POST['holding']将是值的数组,而不仅仅是单个值。

+0

这不是PHP特定的“黑客”,但更多的是提交多个值的事实标准。其他框架的行为方式完全相同。 – tadman 2014-09-03 15:31:51

0

我想我想通了,谢谢你的帮助!这是我用:

$stmt = mysqli_prepare($mysqli, "UPDATE w_o SET w_status = 'hold' WHERE id = ?"); 

     mysqli_stmt_bind_param($stmt, "i", $id); 
     foreach ($_POST['holding'] as $id) 
     { 
      mysqli_stmt_execute($stmt); 
     } 

我想,我想这较早,但没有设置holding作为数组。再次感谢您的帮助!