【问题标题】:Getting list of items in mysqli query获取mysqli查询中的项目列表
【发布时间】:2009-11-09 20:30:42
【问题描述】:

我目前在给定的 mysqli 查询中有要更新的内容列表:

$insert = mysqli_query($db,"UPDATE `tbl_perms` SET
 `1` ='" . mysqli_real_escape_string($db,$_POST['permsA_1']) . "',    
 `2` ='" . mysqli_real_escape_string($db,$_POST['permsA_2']) . "',    
 `3` ='" . mysqli_real_escape_string($db,$_POST['permsA_3']) . "',    
 `4` ='" . mysqli_real_escape_string($db,$_POST['permsA_4']) . "',    
 `5` ='" . mysqli_real_escape_string($db,$_POST['permsA_5']) . "', 
 `6` ='" . mysqli_real_escape_string($db,$_POST['permsA_6']) . "',
 `7` ='" . mysqli_real_escape_string($db,$_POST['permsA_7']) . "',
 `8` ='" . mysqli_real_escape_string($db,$_POST['permsA_8']) . "',
 `9` ='" . mysqli_real_escape_string($db,$_POST['permsA_9']) . "',
`10` ='" . mysqli_real_escape_string($db,$_POST['permsA_10']) . "'
 WHERE `userid` = '$id' ")or die(mysqli_error($db));

我将如何重写它,这样我就不必手动编写 sql 代码,以便在添加“权限”时自动生成执行 sql 查询所需的 sql?

谢谢。

【问题讨论】:

  • 您如何确切知道何时添加了权限?什么时候可以在 POST 中使用?还有:是否有最大。 10 个权限?

标签: php mysqli


【解决方案1】:
foreach ($_POST as $key=>$value) {
  if (preg_match('/^permsA/',$key)) {
    list($tmp,$num)=explode('_',$key);
    $perms[]="`$num` = " . (int)$value; //or some other method of sanitizing the $value
  }
}

$sql="UPDATE tbl_perms SET " . implode(','$perms) . "WHERE userid = '$id'" ;

【讨论】:

  • 只是一个小交易:strpos($key, 'permsA')===0 会比 preg_match 快一点。 :) 另外...不要忘记验证/清理$num(目前这是一个注入孔)
  • 我喜欢你的foreach 循环,因为它更抽象,但你为什么要和preg_match 比较呢?与子字符串进行比较不会更快吗?
  • @JoostK:preg_match 比较慢,是的。但我记得它的语法更好,我不想停下来查找另一个。 :$
【解决方案2】:

其他人所说的,除非可能的话,我会做一些不同的事情 - 而不是必须使用 $i 来控制循环,我会重命名表单,以便将字段称为:

<input type="checkbox" value="1" name="permsA[1]">
<input type="checkbox" value="1" name="permsA[2]">

等等等等

然后你会得到一个你可以像这样引用的帖子数组:

$_POST['permsA'][1];
$_POST['permsA'][2];

这样做的好处是你可以做到:

$bits = array();
foreach ($_POST['permsA'] as $key=>$value) {
  $bits[] = $key . " = '" . mysqli_real_escape_string($db, $value) . "'";
}

$sql = "UPDATE permissions SET " . implode(', ', $bits) . " WHERE userid = '$id' ") 
 or die(mysqli_error($db));

这样做的好处是,当您向系统添加更多权限并超过您使用的最大 1 美元时,您不会有一天遇到随机错误 :)

感谢您可能无法更改表单,或者可能永远无法添加更多权限,在这种情况下,此解决方案也不会更好。

【讨论】:

    【解决方案3】:

    给你:

    $updaters = array();
    
    for ($i = 1; $i <= 10; $i++)
    {
        if (isset($_POST['permsA_'.$i]))
            $updaters[] = '`'.$i.'` = \''.mysqli_real_escape_string($db, $_POST['permsA_'.$i]).'\'';
    }
    
    $insert = mysqli_query($db,'UPDATE `tbl_perms` SET '.implode(',', $updaters).
        'WHERE `userid` = '.$id)or die(mysqli_error($db));
    

    【讨论】:

      【解决方案4】:

      只是草稿:

      $sql = "UPDATE `tbl_perms` SET ";
      for ($i = 1; $i < 100; i++) {
        if (isset($_POST['permsA_' . $i])) {
          if ($i > 1) $sql .= ",";
          $sql .= "`$i` ='" . mysqli_real_escape_string($db,$_POST['permsA_1']) . "'";
        }
      }
      $sql .= " WHERE `userid` = '$id'";
      

      请注意,100 只是一个任意数字

      【讨论】:

      • 错了。在 PHP 中不能像这样使用 + 运算符。
      • 他的意思可能是 .= 而不是 +=
      猜你喜欢
      • 2021-11-03
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2017-01-26
      • 2023-03-27
      • 2018-02-17
      相关资源
      最近更新 更多