【问题标题】:mysql update multiple rows from $_POST arraymysql 从 $_POST 数组更新多行
【发布时间】:2014-03-02 10:00:41
【问题描述】:

本质上,我尝试使用从名为“units”的$_POST 变量中获得的数组来更新多个 MySQL 行。一直试图弄清楚这一点。这是我目前所拥有的:

不添加到第二个人的当前代码:

if(isset($_POST['unit'])){ $units .= implode(', ', $_POST['unit']); } else { redirect('addcall.php?err=7'); } 

$my_s = $my->prepare('INSERT INTO `calls`(`call_taker`, `call_time`, `call_type`, `call_priority`, `call_location`, `call_city`, `reporter_name`, `reporter_num`, `call_info`, `units`) VALUES (?,?,?,?,?,?,?,?,?,?)') or die($my->error);
$my_s->bind_param('sssisssiss', $name, $date, $c_type, $c_prio, $c_loc, $c_city, $r_name, $r_num, $c_info, $units) or die($my->error);
$my_s->execute() or die($my->error);
$my_s->close();
$my->close();
$my = new mysqli(HOST, USER, PASS, DB);
$my_s2 = $my->prepare('UPDATE `users` SET `busy` = 1 WHERE `badge` = ? AND `enabled` = 1 AND `confirmed` = 1 AND `duty` = 1') or die($my->error);
$my_s2->bind_param('s', $units) or die($my-error);
$my_s2->execute() or die($my-error);
$my_s2->close();
$my->close();
redirect('dashboard.php');

        <table> // table for checkboxes thats in main HTML area
        <tr> <td>Units Available:&nbsp&nbsp&nbsp</td>
        <?php
        $my = new mysqli(HOST, USER, PASS, DB);
        $my_s = $my->prepare('SELECT `name`, `badge` FROM `users` WHERE `duty` = 1 AND `busy` = 0');
        $my_s->execute();
        $my_s->store_result();
        if($my_s->num_rows == 0){
            echo "<td>None</td>";
        }
        $my_s->bind_result($u_name, $u_badge);
        while($row = $my_s->fetch()){
            echo '<td><input type="checkbox" name="unit[]" value="'.$u_badge.'">'.$u_name.' , #'.$u_badge.'&nbsp</td>'; 
        }
        $my_s->close(); $my->close();?>
        </tr>
        </table>

【问题讨论】:

  • 为什么要把# 放在值的前面?如果你不这样做,你可以只使用 post 值作为数据插入到数据库中。
  • 哦,所以如果没有 # 值,我可以直接发送帖子直接数据,它会更新分配给其“忙碌”列的每个用户?
  • 未更改第二个用户繁忙列。只改了第一个。还必须对其添加一些繁重的检查,因为它被添加到除了第二个人之外的所有人
  • 您需要一个 foreach 循环来分别更新每个徽章编号。

标签: php mysql arrays variables post


【解决方案1】:

我认为您的 html 代码缺少“表单”标签。 html 中的每种“输入”类型都需要位于“form”和“/form”标签内,这些标签定义了发送表单的方法(POST 或 GET)以及目的地是什么(什么 php 文件),由“动作”参数。

【讨论】:

  • 我认为他只是没有在他的代码摘录中表明这一点。
  • 是的,我忽略了其余的表单信息,因为它不相关。但表单方法是 POST 并且操作被发送到正确的页面
【解决方案2】:

您可以使用foreach 循环来更新$_POST['unit'] 中的每个徽章编号。或者,您可以使用它来构造要在IN 测试中使用的值列表。不幸的是,您不能将参数绑定到 this,因此必须显式转义它们。

if (isset($_POST['unit'])) {
    $units = implode(', ', $_POST['unit']);
    $my_s = $my->prepare('INSERT INTO `calls`(`call_taker`, `call_time`, `call_type`, `call_priority`, `call_location`, `call_city`, `reporter_name`, `reporter_num`, `call_info`, `units`) VALUES (?,?,?,?,?,?,?,?,?,?)') or die($my->error);
    $my_s->bind_param('sssisssiss', $name, $date, $c_type, $c_prio, $c_loc, $c_city, $r_name, $r_num, $c_info, $units) or die($my->error);
    $my_s->execute() or die($my->error);

    $in_units = implode(', ', array_map(function($u) use ($my) { return "'" . $my->real_escape_string($u) . "'"; }, $_POST['unit']));
    $my_s2 = $my->prepare("UPDATE `users` SET `busy` = 1 WHERE `badge` IN ($in_units) AND `enabled` = 1 AND `confirmed` = 1 AND `duty` = 1") or die($my->error);
    $my_s2->execute() or die($my-error);
}

【讨论】:

  • 出现此错误:“where 子句”中的未知列“$in_units”
  • 已修复,我的引号类型错误,因此未替换变量。
猜你喜欢
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多