2009-11-09 70 views
0

產品清單我現在有事情在給定的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_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?

謝謝。

+0

您究竟知道何時添加權限?當它在POST中可用時?還有:是否有最大值。 10個權限? – Franz 2009-11-09 20:46:20

回答

0

在這裏你去:

$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)); 
0

只是一個草案:

$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只是一個任意數量

+0

這是錯誤的。你不能在PHP中使用這樣的+運算符。 – Franz 2009-11-09 20:45:19

+1

他大概意思=代替+ = – dnagirl 2009-11-09 20:48:32

+0

對不起,在當時編寫JavaScript ... – jeroen 2009-11-10 02:34:28

4
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'" ; 
+2

只是一個小交易:'strpos($鍵,「permsA」)=== 0'將是微幅下挫比快的preg_match。 :)另外...不要忘記驗證/清理'$ num'(這是一個注入漏洞) – brianreavis 2009-11-09 20:46:45

+0

我喜歡你的'foreach'循環,因爲它更抽象,但你爲什麼要比'preg_match'?不會與子字符串比較會更快嗎? – Joost 2009-11-09 20:47:33

+0

@brianreavis:兩點都不錯。 – dnagirl 2009-11-09 20:49:16

3

什麼人說,除非可能我會做得有點不同 - 而不是必須使用$ 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)); 

這樣做的好處是,當你添加更多的pe時,你不會有一天會得到一個隨機錯誤讓系統流失並超過您使用的最大數額爲1美元:)

欣賞您可能無法更改表單,或者可能無法添加更多權限,在這種情況下,此解決方案不會更好。