webForumDet fria alternativet

Uppdatera flera rader i databasen med olika värden

PHP

26 svar · 790 visningar · startad av filipbh

Medlem sedan juli 2002405 inlägg
Frågan#1

Hej, hur gör man lättast för att uppdatera värdena i ett formulär till databasen?

Har en mysql-hämtning som hämtar olika rader från databasen som sen skrivs ut i ett formulär. De utskrivna värdena ska man alltså kunna uppdatera. Nu lyckas jag bara att uppdatera den sista raden men inte alla.

Medlem sedan mars 20034 471 inlägg
#2

Hur ser ditt skript ut?

Medlem sedan juli 2002405 inlägg
#3

Det är mycket och jävligt ;) Vet att jag kan använda inner join istället, men men...

<form action="shop.php?recount=1" method="post">
<table width="300" border="0">
<th>Produkt</th><th>Antal/Pris</th><th>&nbsp;</th>
<?
$summa = 0;
$summa_tot = 0;

//Hämtar varor från temporder
$open = mysql_connect ("localhost", "$u","$p");

$sql = "SELECT * FROM fyrshop_temporder WHERE order_owner = '".$_SESSION[shopinl_uid]."' AND kop_antal>0 AND status=1";
$result = mysql_db_query("databas","$sql");

while($shop=mysql_fetch_array($result)){
$shop_orderid = $shop[oid];
$shop_prodnr = $shop[prod_artnr];
$shop_owner = $shop[order_owner];
$shop_fnamn = $shop[prod_id];
$shop_antal = $shop[kop_antal];
$shop_pris = $shop[pris];
$shop_id = $shop[id];

$antalvarorikundvagnen = $antalvarorikundvagnen + 1;
$summa = $shop_antal*$shop_pris;
$summa_tot = $summa_tot+$summa;

//Hämtar information från produkter
$open_to = mysql_connect ("localhost", "$u","$p");

$sql_to = "SELECT * FROM fyrshop_produkter WHERE artnr = '".$shop_prodnr."'";
$result_to = mysql_db_query("databas","$sql_to");

while($product=mysql_fetch_array($result_to)){
$product_namn = $product[produktnamn];
$product_kid = $product[kid];
$product_ukid = $product[ukid];
$product_id = $product[id];
$product_pris = $product[pris];
?>
<tr><td><a href="product.php?show=<?=$product_id;?>&kID=<?=$product_kid;?>&uID=<?=$product_ukid;?>"><?=$product_namn;?></a></td>
<td><input type="text" class="form" name="newantal" id="<?=$shop_prodnr;?>" value="<?=$shop_antal;?>" size="2"> st á <?=$product_pris;?> kr</td>
<td align="right"><?=$summa;?> kr</td>
<input type="hidden" name="rowid" value="<?=$shop_id;?>">
</tr>
<?

 }
}

echo "</table>";
?>
<input type="hidden" value="<?=$antalvarorikundvagnen;?>" name="howmanyproducts">
<br><b>SUMMA</b> <?=$summa_tot;?> kr
<br><input type="submit" value="Räkna om" name="count_do" class="form"> <input type="button" value="Till kassan" name="kassa" class="form" onClick="window.self.location.href='confirmorder.php';">

</form>

När det görs om:

<?
if($_GET['recount']){

$i=0;
while($i<$_POST['howmanyproducts']){
    $link = mysql_connect("localhost","$u","$p");

    $databas = mysql_select_db("databas");
    $sql = "UPDATE fyrshop_temporder SET kop_antal='$_POST[newantal]' WHERE id = '$_POST[rowid]'";
    mysql_query("$sql");

    mysql_close($link);
$i = $i+1;
echo $i;
echo "görs om";

 }
}
Medlem sedan mars 20034 471 inlägg
#4

Alltså, först och främst varför öppnar du mer än en connection i scriptet? Gör mysql_connect en gång endast. Du kan ställa flera frågor till samma connection. Men som det funkar just nu stänger du inte den första innan du (helt i onödan) öppnar en till. Det tar definitivt onödig tid och onödiga resurser, och jag vet inte huruvida det också kan ge upphov till fel i skripten. Börja med att plocka bort nummer två!

Medlem sedan juli 2002405 inlägg
#5

I detta fall verkar det inte spela någon roll för jag har testat att hämta data från en tabell bara, men det fungerar inte ändå. Felet är ju att bara den sista utskriften uppdateras eftersom jag använder $_POST[] när jag ska uppdatera och då tar den bara den sista $_POST[] och inte alla.

Medlem sedan juli 2002405 inlägg
#6

Det är borttaget nu iaf men gjorde ingen skillnad... Den uppdaterar fortfarande bara den sista raden.

Medlem sedan mars 20034 471 inlägg
#7

filipbh skrev:

I detta fall verkar det inte spela någon roll för jag har testat att hämta data från en tabell bara, men det fungerar inte ändå. Felet är ju att bara den sista utskriften uppdateras eftersom jag använder $_POST[] när jag ska uppdatera och då tar den bara den sista $_POST[] och inte alla.

Alltså, det kanske inte påverkar ditt fel, men det är ändå inte bra att ha två connect i samma fil. Minst av allt utan close emellan.

Men, du måste införa ändringarna direkt du postat någon. Du kan inte vånta till tre sidladdningar senare för då får du mycket riktigt bara den sista.

Vad är det du vill göra då? Varför laddar du om och om innan uppdateringen? Eller missförstår jag?

Medlem sedan juli 2002405 inlägg
#8

Jag laddar om uppdateringen för att jag trodde det var det enda möjliga för att alla rader ska uppdateras. Hur ska jag annars skriva? Måste jag döpa varje utskriven rad med något speciellt?

Medlem sedan juli 2002405 inlägg
#9

Screenshot på det jag pratar om...

Ändrar jag värdet i båda rutorna sparas alltså bara, i detta fall, det nya värdet i "Nässpray"...

produktform.jpg
Medlem sedan mars 20034 471 inlägg
#10

Ursäkta såg inte ditt senaste svar. Vad som händer beror ju på hur koden är skriven för vad som händer vid tryck på den knappen.

filipbh skrev:

Jag laddar om uppdateringen för att jag trodde det var det enda möjliga för att alla rader ska uppdateras. Hur ska jag annars skriva? Måste jag döpa varje utskriven rad med något speciellt?

Exakt. Enklast är att antingen ge dom namn efter idnr i databasen eller löpnummer modell: u1, u2, u3, ...

Medlem sedan juli 2002405 inlägg
#11

De här två fälten ligger i varje rad. Räcker inte det för att specificera varje rad?

<input type="text" class="form" name="newantal" id="<?=$shop_prodnr;?>" value="<?=$shop_antal;?>
<input type="hidden" name="rowid" value="<?=$shop_id;?>">

Rowid = det id som produkten har i databasen
id i newantal är produktens artikelnummer

Medlem sedan juli 2002405 inlägg
#12

Det är ju denna kod:

if($_GET['recount']){ 

$i=0; 
while($i<$_POST['howmanyproducts']){ 
    $link = mysql_connect("localhost","$u","$p"); 

    $databas = mysql_select_db("databas"); 
    $sql = "UPDATE fyrshop_temporder SET kop_antal='$_POST[newantal]' WHERE id = '$_POST[rowid]'"; 
    mysql_query("$sql"); 

    mysql_close($link); 
$i = $i+1; 
echo $i; 
echo "görs om"; 

} 
}
Medlem sedan mars 20034 471 inlägg
#13

Förresten, släng ut connect ur while-slingan i din shop.php till före while.
Ta bort close helt, sker automatiskt när skriptet är klart.

Medlem sedan juli 2002405 inlägg
#14

Så här?

if($_GET['recount']){ 

$i=0; 
    $link = mysql_connect("localhost","$u","$p"); 
    $databas = mysql_select_db("databas"); 
while($i<$_POST['howmanyproducts']){ 
    $sql = "UPDATE fyrshop_temporder SET kop_antal='$_POST[newantal]' WHERE id = '$_POST[rowid]'"; 
    mysql_query("$sql"); 
$i = $i+1; 
echo $i; 
echo "görs om"; 

} 
}
Medlem sedan mars 20034 471 inlägg
#15

filipbh skrev:

De här två fälten ligger i varje rad. Räcker inte det för att specificera varje rad?

<input type="text" class="form" name="newantal" id="<?=$shop_prodnr;?>" value="<?=$shop_antal;?>
<input type="hidden" name="rowid" value="<?=$shop_id;?>">

Rowid = det id som produkten har i databasen
id i newantal är produktens artikelnummer

Nej, de skriver över varandra! Varje rad lagrar innehållet i samma (två) fack i $_POST. "rowid" blir just strängen med 'r','o','w','i' och 'd' i.Om din databasstruktur är vettig borde du kunna få fram produktens artikelnummer om du känner idnumret i databasen?
Pröva följande:

//för varje rad:
<?php $nameN = "newantal".$rowid; 
//Förutsatt at $rowid har idvärdet från databasen
echo "<input type=\"text\" class=\"form\" name=\"$nameN\" id=\"$shop_prodnr\" value=\"$shop_antal\">";

//i mottagarfilen
if($_GET['recount']){ 
$link = mysql_connect("localhost","$u","$p"); 
$databas = mysql_select_db("databas");
foreach ($_POST as $ix => $info){
    if (strstr($ix, 'newantal') !== FALSE) {
       $id = substr($_POST[rowid], 8); //Den del av strängen som håller i $rowid 
       $sql = "UPDATE fyrshop_temporder SET kop_antal='$info' WHERE id = $id"; 
       mysql_query("$sql"); 

       echo "görs om"; 
    }
}
Medlem sedan juli 2002405 inlägg
#16

La in det där men nu ändras ingen av dem...

Medlem sedan mars 20034 471 inlägg
#17

filipbh's signatur skrev:

Koda inte när du är trött..

Slutkodat för idag är jag rädd. :(

Medlem sedan juli 2002405 inlägg
#18

Okej, får kolla mer på det imorrn.. Det brukar bli fel annars :p Tack för hjälpen så länge iallafall

Medlem sedan mars 20034 471 inlägg
#19

filipbh, kan du beskriva hur din databasstruktur ser ut för produkterna? Jag har nog inte riktigt fattat vad som är rowid och prodnr.

Medlem sedan juli 2002405 inlägg
#20

Tabell temporder
----------------
rowid = produktens id i databasen.
shop_prodnr = produktens artikelnummer.

De variablarna som börjar med $shop är hämtade från temporder. Sen för att kunna skriva ut produktens namn använder jag mig av den andra sql-hämtningen. De utskrifter får namnet $product i början.

Så här ser kolmunernas namn ut i $shop:

$shop_prodnr = $shop[prod_artnr];
$shop_owner = $shop[order_owner];
$shop_fnamn = $shop[prod_id];
$shop_antal = $shop[kop_antal];
$shop_pris = $shop[pris];
$shop_id = $shop[id];
259 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)