Just nu i M3-nätverket
Gå till innehåll

Problem med att radera i lista


Blockqoute

Rekommendera Poster

Hej,

 

Nu har jag dykt på ett skumt problem (iaf enligt mig själv). Det är så att jag har en lista med butiker där varje varje butiker har en knapp "Ta bort" för att ta bort butiken. Problemet jag dykt på är att när jag väljer att radera en butik så raderas alltid den som är sorterad sist. Butikerna är sorterade i bokstavsordning medan det som sidan kontrollerar (eller iaf ska kontrollera) är vilket butiks-id det är man vill radera.

 

Koden ser ut som följer just nu: PHP:


...                                                         //tagit bort lite kod
if(isset($_POST['tabort'])){
   $id=$_POST['id'];                                        //här kollar den vilket butik-id som ska tas bort
     mysql_query("DELETE FROM butiker WHERE id='$id'");           //här tar den bort en butik
}

?>
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
...                                                                        //tagit bort lite kod
                    <tr><td colspan='2'><b>Välj en butik du vill redigera:</b></td>
                           <td width="150"> </td><td><a href="butik_add.php">Klicka här för att skapa en ny butik</a></td></tr><tr><td>
                    <form name="butik" id="butik" action="butik_adm.php" method="post">
                    <?
                    $sql2="SELECT id, butik FROM butiker ORDER BY butik ASC";             //här hämtar den information som behövs för att skapa listan från tabellen butiker och sorterar dessa i bokstavsordning efter butiksnamn
                    $result2=mysql_query($sql2);
                    // uses a while loop to display our categories into a dropdown list.
                     while($rad2 = mysql_fetch_array($result2)) 
                        { 
                      $butik=$rad2['butik'];
                      echo "<input type='hidden' name='id' value='" .$rad2["id"]. "'>";     //här har jag ett dolt fält med namnet id som tas med upp till själv ta bort-satsen från början
                      echo "<tr><td>".$rad2["id"]."</td>";                         //detta är bara för att skriva ut id-numret i listan
                      echo "<td><a href='butik_red.php?id=".$rad2["id"]."'>".$butik."</a></td>                                                          //detta är för att lista namnet på butikerna i listan samt gör namnet klickbart så man kan komma vidare in till butiken
                      <td><input type='submit' name='tabort' value='Ta bort' style='font-family: Verdana; color: #000000; font-size: 9px; background-color: #E1E1E1; border: 3px outset #8B8B8B'></td></tr>";
                        }?>
                           </form></td></tr>
...                                                                     //tagit bort lite kod 

 

 

Min spontana tanke är att den raderar i bokstavsordning och tar från slutet istället för att titta vilket butiks-id det är som ska raderas. Men jag kan inte hitta var felet är. Är felet att jag sorterar butikerna efter bokstavsordning när jag hämtar de från databasen? Men om så är fallet, vad i koden är det som säger att den ska göra det?

 

Tacksam för allt hjälp!

Länk till kommentar
Dela på andra webbplatser

Har jag inte bara ett hidden-fält som skickar det aktuella ID-numret till Delete-satsen?

 

echo "<input type='hidden' name='id' value='" .$rad2["id"]. "'>";

Det dolda fältet som är tänkt att innehålla ID-numret till den butik som ska raderas.

 

 

if(isset($_POST['tabort'])){
 $id=$_POST['id'];                                        
 mysql_query("DELETE FROM butiker WHERE id='$id'"); 
}

Och här är koden dit den ska skicka värdet i hidden-fältet.

 

Förmodligen tänker jag helt galet när jag tycker att det ser rätt ut. Var är felet?

Länk till kommentar
Dela på andra webbplatser

Har jag inte bara ett hidden-fält som skickar det aktuella ID-numret till Delete-satsen?

Jo, om du bara har en butik i din databas ;)

Utskrift av input-fältet ligger ju i din while-loop.

Formuläret har ingen aning om vilket som är det "aktuella"

 

 

Förmodligen tänker jag helt galet när jag tycker att det ser rätt ut. Var är felet?
Varför inte kasta ett snabbt öga på den renderade html-koden i din webbläsare?

Där kommer du se hur ditt formulär ser ut med flera id-inputs och flera submitknappar i samma formulär.

 

Antingen så gör du ett formulär per butik (flyttar in formtaggarna i while-loopen) eller så hittar du på ett bättre sätt att avgöra vilken knapp man klickat på.

Länk till kommentar
Dela på andra webbplatser

Ett annat sätt som kanske både är smidigare/snabbare (?) är att ha en bockruta/checkbox för varje butik istället för en knapp. Då kan du ju radera flera butiker i samma veva och minskar både sidladdningar och databaskopplingar.

Länk till kommentar
Dela på andra webbplatser

Snabbt ihopslängt och otestat exempel:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ta bort butiker</title>
</head>

<body>
<form name="butik" id="butik" action="?" method="post">
	<table>
		<thead>
			<tr>
				<th>Id</th><th>Butiksnamn</th><th>Radera</th>
			</tr>
		</thead>
		<tbody>
		<?php 
		$i = 1;
		while ($i <= 10) {
			$butik="Butik".$i;
			echo "<tr><td>".$i."</td><td>".$butik."</td><td><input type=\"checkbox\" name=\"butikId[]\" value=\"".$i."\"></td></tr>";
			$i++;
		}
		?>
		</tbody>
	</table>
	<p><input type="submit" name="doDelete" value="Radera markerade butiker"></p>
</form>
<?php 
if(isset($_POST['doDelete'])){
	$idString=implode(",",$_POST['butikId']);
	$sql="DELETE FROM [butiker] WHERE [id] IN(".$idString.")";
	echo "<p>Kör kod:<br><textarea>".$sql."</textarea></p>";
}
?>	
</body>
</html>

Länk till kommentar
Dela på andra webbplatser

Hej igen,

 

Jag håller på att få det att fungera, men inte riktigt än. Nu ser det ut så här i delete-delen:

if(isset($_POST['doDelete'])){
 $idString=implode(",",$_POST['butikId']);
 mysql_query("DELETE FROM butiker WHERE id IN[$idString]");
}

 

Och så här i formuläret:

<form name="butik" id="butik" action="butik_adm.php" method="post">
<table>                        
<?php
$sql2="SELECT id, butik FROM butiker ORDER BY butik ASC";
$result2=mysql_query($sql2);
while ($rad2 = mysql_fetch_array($result2)) {
 echo "<tr><td>".$rad2["id"]."</td>";
 echo "<td><a href='butik_red.php?id=".$rad2["id"]."'>".$rad2["butik"]."</a></td>
 <td><input type=\"checkbox\"name=\"butikId[]\" value=\"".$rad2["id"]."\">
 </td></tr>";
}?>
</table>
<p><input type="submit" name="doDelete" value="Radera markerade butiker"></p>
</form>

 

Var missar jag något? Det fungerar inte att radera nu. Kan även nämnas att jag har flyttat delete-delen till början av sidan.

Länk till kommentar
Dela på andra webbplatser

Enkel felsökning är att skriva ut SQL-satsen för att se att den ser rätt ut, dvs:

$idString=implode(",",$_POST['butikId']);
$sql="DELETE FROM butiker WHERE id IN[$idString]";
echo $sql;
mysql_query($sql);

Då skulle du se att id-numren inte populeras ordentligt, att du helt enkelt missat att konkatenera in variabeln med id-nummer. Dessutom skall det inte vara hakparenteser kring IN-värdena utan vanliga parenteser, precis som i mitt exempel.

 

Ändra till:

mysql_query("DELETE FROM butiker WHERE id IN (".$idString.")");

Eller (för att som sagt enkelt kunna kolla SQL-satsen):

$idString=implode(",",$_POST['butikId']);
$sql="DELETE FROM butiker WHERE id IN(".$idString.")";
mysql_query($sql);

Länk till kommentar
Dela på andra webbplatser

Underbart! Tack så mycket för hjälpen och extra mkt för felsökningstipset, det har lagts till i minnesbanken! :) Tack igen!

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...