使用php和复选框更新多行mysql
我正在创建一个系统,其中用户将能够更改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'> </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搜索了这么多次,出于某种原因,我似乎找不到足够好的教程。感谢您的帮助!
$sql = "UPDATE w_o SET w_status = 'hold' WHERE id in (".array_map("intval",implode(',',$_POST['holding'][$i])).")";
这样你就可以用单个SQL
您所有的复选框更新所有的人都会有相同的holding
名。提交后,PHP将只使用提交的多个值中的一个。如果您想提交多个不同的值,则必须为每个字段指定一个唯一的名称,或者使用PHP的“数组”字段名称:holding[]
。添加[]
告诉PHP预期有多个值,并且$_POST['holding']
将是值的数组,而不仅仅是单个值。
这不是PHP特定的“黑客”,但更多的是提交多个值的事实标准。其他框架的行为方式完全相同。 – tadman 2014-09-03 15:31:51
我想我想通了,谢谢你的帮助!这是我用:
$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
作为数组。再次感谢您的帮助!
当使用'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