Php 获取mysqli查询中的项目列表

Php 获取mysqli查询中的项目列表,php,mysqli,Php,Mysqli,在给定的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_esca

在给定的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

谢谢。

只是一份草稿:

$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'";
$sql=“更新`tbl\u perms`SET”;
对于($i=1;$i<100;i++){
如果(isset($\u POST['permsA.'$i])){
如果($i>1)$sql.=“,”;
$sql.=“`i`='”。mysqli\u real\u escape\u字符串($db,$\u POST['permsA\u 1'])。“;
}
}
$sql.=“其中`userid`='$id'”;
请注意,100只是一个任意数字

给你:

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'" ;
$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));
$updaters=array();

对于其他人所说的($i=1;$i),除非如果可能,我会做一些不同的事情——而不是使用$i来控制循环,我会重命名表单,以便将字段称为类似于:

<input type="checkbox" value="1" name="permsA[1]">
<input type="checkbox" value="1" name="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美元使用的最大权限时,您不会有一天出现随机错误:)


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

这是错误的。您不能在PHP中使用这样的+运算符。他的意思可能是。=而不是+=您如何确切地知道何时添加了权限?什么时候可以邮寄?还有:是否有最多10个权限?只是一个小交易:
strpos($key,'permsA')==0
将比preg_匹配快一点。:)也。。。别忘了验证/消毒
$num
(目前这是一个注射孔)我喜欢你的
foreach
循环,因为它更抽象,但你为什么要与
preg_match
相比呢?和子字符串比较会不会更快?@JoostK:preg_match会更慢,是的。但我更清楚地记得它的语法,我不想停下来查找另一个:$
$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));