2009-11-09 5 views
0

J'ai actuellement une liste de choses à mettre à jour dans la requête mysqli donné:Obtenir la liste des articles dans la requête 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)); 

Comment pourrais-je réécrire cette façon que je n'ai pas à coder manuellement le sql de sorte que lorsque des "permissions" sont ajoutées, cela génère automatiquement le sql nécessaire pour faire la requête sql?

Merci.

+0

Comment savez-vous exactement quand une permission est ajoutée? Quand est-il disponible en POST? Et aussi: y at-il max. 10 autorisations? – Franz

Répondre

0

vous allez ici:

$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

Juste un projet:

$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'"; 

S'il vous plaît noter que le 100 est juste un nombre arbitraire

+0

C'est faux. Vous ne pouvez pas utiliser l'opérateur + comme ceci en PHP. – Franz

+1

il voulait probablement dire. = Au lieu de + = – dnagirl

+0

Désolé, écrivait javascript à ce moment-là ... – jeroen

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

Juste une affaire mineure: 'strpos ($ key, 'permsA') === 0' serait un smidge plus rapide que le preg_match. :) Aussi ... n'oubliez pas de valider/assainir '$ num' (c'est un trou d'injection pour le moment) – brianreavis

+0

J'aime votre boucle' foreach' car elle est plus abstraite, mais pourquoi la comparez-vous à 'preg_match'? La comparaison avec une sous-chaîne ne sera-t-elle pas plus rapide? – Joost

+0

@brianreavis: de bons points tous les deux. – dnagirl

3

Ce que les autres ont dit, sauf si possible Je le ferais un peu différemment - plutôt que d'avoir à utiliser un $ i pour contrôler la boucle, je renommerais le formulaire pour que les champs soient appelés quelque chose comme:

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

etc etc

Vous souhaitez ensuite obtenir un tableau de poste que vous pourriez faire référence comme celui-ci comme ceci:

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

avantage est que vous pouvez faire:

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

Et l'avantage de faire cela est que vous n'obtiendrez pas un jour un bug aléatoire lorsque vous ajoutez plus de pe Notez que vous ne pourrez peut-être pas modifier le formulaire, ou ajouter d'autres autorisations, auquel cas cette solution ne sera pas meilleure.

Questions connexes