Avatar billede t-hviid Nybegynder
06. oktober 2005 - 21:35 Der er 23 kommentarer og
1 løsning

Hvordan opdater man i flere rækker i databasen

Jeg vil gerne opdater mit felterne abonnement og opret_dato i min produkt db? Jeg har kigget meget rundt her men fatter det ikke helt :-(
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 21:37 #1
Du kan enten bruge mere end en SQL-sætning, eller også kan du finde en eller anden fællesnævner for de rækker du skal opdatere og bruge den i din WHERE.

Hvis ALLE rækker skal opdateres, skal du blot udelade WHERE delen af din SQL-sætning.
Avatar billede mjl Nybegynder
06. oktober 2005 - 21:38 #2
mysql_query("UPDATE tabel SET abonnement = '$abonnement', opret_dato = '$opret_dato' WHERE id = '$id'");
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 21:46 #3
Det er i forbindelse med at bruger kan ændre deres abonnement status. I produkt db er det bruger_id felt så alle produkter bruger har oprettet skal ændres. Så jeg er nød til at bruge WHERE - som jeg forstår det. Jeg har styr på at få hentet alle produkter tilhørende brugeren. Så har jeg oprettet 3 tekstfelter id, abonnement, opret_dato og dem repeater jeg. Det kører fint men den opdater kun sidste række i db.
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 21:46 #4
$id er det id fra mit db udtræk
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 22:30 #5
Er der nogle der kan hjælpe?
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 22:31 #6
Må vi få at vide hvad din nuværende SQL-sætning er? Umiddelbart lyder det som om det du har bør virke.
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 22:35 #7
Det må I :-) if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "update")) {
  $updateSQL = sprintf("UPDATE produkter SET opret_dato=%s, abonnement=%s WHERE Id=%s",
                      GetSQLValueString($_POST['opret_dato'], "date"),
                      GetSQLValueString($_POST['abonnement'], "text"),
                      GetSQLValueString($_POST['id'], "int"));

  mysql_select_db($database_teaterprops_db, $teaterprops_db);
  $Result1 = mysql_query($updateSQL, $teaterprops_db) or die(mysql_error());
}
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 22:41 #8
Og så lige til kontrol - jeg regner med det id felt henviser til et kundeid, og ikke et rækkeid, korrekt?
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 22:43 #9
Nej det er godt nok selve række id!
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 22:45 #10
Selve min sql der laver produkt udtrækket ser sådanne ud:
SELECT produkter.id, produkter.abonnement, produkter.opret_dato, produkter.brugerID
FROM produkter,udlejer
WHERE produkter.brugerID = udlejer.id AND udlejer.brugernavn LIKE '".$_SESSION[login]."'
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 22:46 #11
Beklager, lige en svipser der med det sidste - skal jo ikke være et kundeid i en produkt tabel, tænkte vist ikke helt klart :)

Men under alle omstændigheder er det jo så klart du kun får opdateret en enkelt række, da der kun er den ene række med dit ID.

Du er nødt til enten at finde en fællesnævner for alle de rækker du opdaterer, eller specificere en længere WHERE sætning ved brug af OR.
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 22:49 #12
Godt så, nu tror jeg jeg har den.

Det du skal gøre er i så fald at sigde WHERE på din brugerID - dvs. WHERE brugerID=<udlejers id>.
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 22:55 #13
Ja det er jeg også fremme ved - med din hjælp :-) Jeg har prøvet dette:
<?php
$id = $row_rsUserDetails['Id']; ?> //Sætter udlejers id

if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "update")) {
  $updateSQL = sprintf("UPDATE produkter SET opret_dato=%s, abonnement=%s WHERE brugerID=$id",
                      GetSQLValueString($_POST['opret_dato'], "date"),
                      GetSQLValueString($_POST['abonnement'], "text"),
                      GetSQLValueString($_POST['id'], "int"));

  mysql_select_db($database_teaterprops_db, $teaterprops_db);
  $Result1 = mysql_query($updateSQL, $teaterprops_db) or die(mysql_error());

  $updateGoTo = "abonnement_rettet.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $updateGoTo .= (strpos($updateGoTo, '?')) ? "&" : "?";
    $updateGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $updateGoTo));
}
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 23:02 #14
Det ser straks mere rigtigt ud ^_^

Virker det så nu, eller er der andre problemer?
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 23:06 #15
Jeg får denne:
You have an error in your SQL syntax near '' at line 1
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 23:10 #16
Det er jo lidt svært at vide hvad problemet er uden SQL-sætningen - sætter din GetSQLValueString selv apostroffer udenom værdierne?

Evt. kan du jo midlertidigt prøve at indsætte værdierne manuelt i din streng:

  $updateSQL = "UPDATE produkter SET opret_dato='" . $_POST['opret_dato'] . "', abonnement='" . $_POST['abonnement'] . "' WHERE brugerID=$id";

I øvrigt - er en parameter for meget til den sprintf, du bruger ikke den sidste mere ;)
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 23:11 #17
Nu virker det sgu' :-) jeg fjernede $id = $row_rsUserDetails['Id']; ?> //Sætter udlejers id
Ved dog ikke helt hvorfor det var det der skulle til forekommer mig lidt ulogisk. hmm... Er det mon fordi at tekstfeltet hedder id
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 23:16 #18
Det kunne godt ske, men i så fald lyder det som om register_globals er aktiveret. Det frarådes normalt at dette er tilfældet, da det åbner for mange potentielle sikkerhedsproblemer.

Undtagelsen er selvfølgelig hvis du har rettet WHERE brugerID=$id til WHERE brugerID=%s, for at bruge den sprintf parameter.
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 23:17 #19
Nej den er gal, det jeg skriver i det ene felt kommer i begge. Tilbage til det andet.
Her kommer det hele :
<?php require_once('../Connections/teaterprops_db.php'); ?>
<?php
// Buzz inet PHPLS06 - User Details
session_start();

function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;   
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}


if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "update")) {
  $updateSQL = sprintf("UPDATE produkter SET opret_dato=%s, abonnement=%s WHERE brugerID=$id",
                      GetSQLValueString($_POST['opret_dato'], "date"),
                      GetSQLValueString($_POST['abonnement'], "text"),
                      GetSQLValueString($_POST['id'], "int"));

  mysql_select_db($database_teaterprops_db, $teaterprops_db);
  $Result1 = mysql_query($updateSQL, $teaterprops_db) or die(mysql_error());

  $updateGoTo = "abonnement_rettet.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $updateGoTo .= (strpos($updateGoTo, '?')) ? "&" : "?";
    $updateGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $updateGoTo));
}

$varSearch_rsUserDetails = "1";
if (isset($HTTP_SESSION_VARS['login'])) {
  $varSearch_rsUserDetails = (get_magic_quotes_gpc()) ? $HTTP_SESSION_VARS['login'] : addslashes($HTTP_SESSION_VARS['login']);
}
mysql_select_db($database_teaterprops_db, $teaterprops_db);
$query_rsUserDetails = sprintf("SELECT * FROM udlejer WHERE brugernavn = '%s'", $varSearch_rsUserDetails);
$rsUserDetails = mysql_query($query_rsUserDetails, $teaterprops_db) or die(mysql_error());
$row_rsUserDetails = mysql_fetch_assoc($rsUserDetails);
$totalRows_rsUserDetails = mysql_num_rows($rsUserDetails);

mysql_select_db($database_teaterprops_db, $teaterprops_db);
$query_produkter = "SELECT  produkter.id, produkter.abonnement, produkter.opret_dato, produkter.brugerID FROM produkter,udlejer WHERE produkter.brugerID = udlejer.id AND udlejer.brugernavn LIKE '".$_SESSION[login]."' ORDER BY overskrift";
$produkter = mysql_query($query_produkter, $teaterprops_db) or die(mysql_error());
$row_produkter = mysql_fetch_assoc($produkter);
$totalRows_produkter = mysql_num_rows($produkter);
?><?php
//Sætter dags dato
$dato = date("Y-m-d", strtotime($rs["dato"])); ?>
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 23:21 #20
Det du vil er altså at opdatere flere rækker på en gang med forskellige værdier? I så fald er du nødt til at sende en seperat SQL sætning for hver række. Der er desværre ingen vej udenom, omend du kan samle dem i et enkelt mysql_query kald ved at adskille dine sætninger med semikolonner.

Her skal du så bruge *rækkens* id, ikke brugerens.
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 23:23 #21
Nej nu er det mig der klumre rundt - jeg skal vist snart sove :-) Det er samme værdi!
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 23:23 #22
Så er den ok. Læg et svar så er der point til dig :-)
Avatar billede pidgeot Nybegynder
06. oktober 2005 - 23:25 #23
Godt så - skulle også gerne have det til at virke når nu du har brugt flere timer på det ;)
Avatar billede t-hviid Nybegynder
06. oktober 2005 - 23:30 #24
Mange tak, det var ved at blive et dags projekt ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester