webForumDet fria alternativet

Updatera tabell beroende på vilka variabler som är satta

PHP

7 svar · 468 visningar · startad av noratx

Medlem sedan feb. 200193 inlägg
Frågan#1

Hej!

Är lite osäker på hur jag skall bygga en SQL sats för att uppdatera en tabell.

Vad som skall uppdateras beror på vilka variabler som är satta

Jag har följande variabler:

$ID = $_GET['ID']; // ID att använda för uppdatering av tabell ("WHERE ID='$ID'")

$cost = $_GET['cost'];
$comment = $_GET['comment'];
if(isset($_GET['active']))      { $active = $_GET['active']; } else { $active='NULL' }
if(isset($_GET['restrict']))    { $restricted = $_GET['restrict']; } else { $restricted='NULL' }
if(isset($_GET['spam']))        { $spam = $_GET['spam']; } else { $spam='NULL' }
if(isset($_GET['admin']))       { $admin = $_GET['admin']; } else { $admin='NULL' }

Det jag inte kan lyckas klura ut är hur jag ska få in "AND" i satsen till detta på mest effektiva sätt.
Variablerna skall endast vara med i satsen om de har ett annat värde än null. ($cost har alltid ett värde, och $comment kommer alltid med, men antingen som &comment= eller &comment=kommentar&next_var)

Hoppas ni förstår hur jag menar och att någon har lust att vägleda mig mot lösningen. (Gärna genom ett enklare exempel. En färdig lösning vore förståss praktiskt, men det lär jag mig inget av).

Tack på förhand.

Medlem sedan juni 2009920 inlägg
#2
$arr = array();

if (isset($_GET['active']))
{
$arr[] = "active = '{$_GET['active']}'";
}
//Likadant för resten sen också
$sqlbuild = implode(' AND ', $arr);

Borde ge dig lite idéer iallafall. Går att lösa snyggare, men då ska man ändra lite i hur du skickar datat.

Medlem sedan feb. 200193 inlägg
#3

Hmm.. Jag har faktiskt aldrig jobbat något med arrays förr, så jag är lite säker hur jag ska göra där med $sqlbuild som du sätter ut.

Vet inte riktigt hur fortsättningen på blir på denna med hjälp av dessa arrays:

$query = "UPDATE Bots SET Cost='....... "
Medlem sedan juni 2009920 inlägg
#4

Lite mer komplett :)
Om du inte har jobbat med array, så kanske det vore en idé att kolla på det

$arr = array(); 

if (isset($_GET['active'])) { 
$arr[] = "active = '{$_GET['active']}'"; 
} 

if (isset($_GET['restrict'])) { 
$arr[] = "restrict = '{$_GET['restrict']}'"; 
} 

if (isset($_GET['spam'])) { 
$arr[] = "spam = '{$_GET['spam']}'"; 
} 

if (isset($_GET['admin'])) { 
$arr[] = "admin = '{$_GET['admin']}'"; 
} 

//Likadant för resten sen också 
$set = implode(' AND ', $arr);  

$query = "UPDATE Bots SET $set where ID=$id";
Medlem sedan feb. 200193 inlägg
#5

Mjo, börjar bli det...

Jag lyckades dock lösa det hela efter ett tag.. och upptäckte att AND ska förståss bytas ut mot ett komma.. så nu äntligen funkar det.. sen blir det nog till att läsa på lite mer om arrays.. :)

Tack för hjälpen :)

Medlem sedan aug. 20039 340 inlägg
#6

För det första. Glöm aldrig, aldrig, att städa det inkommande datat med mysql_real_escape_string eller på annat vis. Även om du bara förväntar dig nuffror i det fältet.

Jag utökade Gildebrands exempel så det blev lite mer generellt. (Mindre copy-paste om du vill lägga till fält att kolla efter.)

$ID = mysql_real_escape_string($_GET['ID']); // ID att använda för uppdatering av tabell ("WHERE ID='$ID'")

$cost = mysql_real_escape_string($_GET['cost']);
$comment = mysql_real_escape_string($_GET['comment']);

// Definiera sökbara kolumner
$check_columns=array('active', 'restrict', 'spam', 'admin');

// Array för att lagra deluttrycken
$arr = array();

// Gå igenom de definierade kolumnerna
foreach($check_columns as $column){
  // Om namnet finns med i $_GET...
  if (isset($_GET[$column])){
    // Skrubba det rent och skapa ett deluttryck.
    $value = mysql_real_escape_string($_GET[$column]);
    $arr[] = "${column} = '${value}'";
  }
}

// Slå ihop delarna
$set = implode(' AND ', $arr);
Medlem sedan juni 2009920 inlägg
#7

Lite snyggare det där ::)
Oavsett vilket exempel du går på, så måste du escapea din data. En grundläggande regel, all data som kommer från användaren ska escapeas.

Vart fundersam på följande bit:

${column}

Varför {} ?
Det använder man ju bara om det är ett array. Funkar det ens att skriva så där?

Medlem sedan aug. 20039 340 inlägg
#8

Gildebrand skrev:

Vart fundersam på följande bit:

${column}

Varför {} ?
Det använder man ju bara om det är ett array. Funkar det ens att skriva så där?

Man kan alltid använda den formen. Just i detta fall är det inte nödvändigt, men jag har gjort det till en vana. Jag tycker också att koden blir mer läsbar på det viset. Sen är det inte bara när man ska hålla på med arrayer som den syntaxen krävs, utan även t ex om du vill ha alfanumeriska tecken direkt efter ett variabeluttryck (utan att behöva avsluta stränguttrycket då...) Annars kommer ju resten av tecknen att tolkas som en del av variabelnamnet, som då kommer peka till en variabel som troligen inte ens finns.

266 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)