php/html: skriva ut <table> med data från db som ska kunna ändras med inputfält + knapp

Permalänk
Medlem

php/html: skriva ut <table> med data från db som ska kunna ändras med inputfält + knapp

Hej!

Jag har stött på problem som jag absolut inte kommer på hur jag ska lösa.

Jag har en databas och jag vill kunna skriva ut en tabell med data från databasen med namn för arbetare.
Namnen som redan finns på arbetaren inuti ett <input> fält och bredvid vill jag ha en knapp som jag kan klicka på för att ändra namnet, och då ändrar jag namnet i input-fältet för den raden.

Men när jag försöker att trycka på knappen "Ändra för ett namn på en rad så tar den värdet för den sista utskrivna raden verkar det som.

Här är min lösning hittills:

<?php if(isset($_POST["namnKorrigering"])) { $id=$_POST["namnKorrigering"]; $new_name = $_POST["new_name"]; debug("ID: $id"); debug("Nytt namn: $new_name"); $sql = "UPDATE EMPLOYEES SET name = '$new_name' WHERE id = '$id'"; mysqli_query($database, $sql) or die("ERROR: Det gick inte att uppdatera namnet."); } $sql = "SELECT * FROM EMPLOYEES"; $result = mysqli_query($database, $sql); ?> <table style='padding-top:3px; font-family: monospace; font-size:14px; border-collapse: collapse;'> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <tr> <td style='font-weight:bold; padding-left:10px; padding-right:10px; text-align:center;'>ID</td> <td style='font-weight:bold; padding-left:10px; padding-right:10px; text-align:center;'>Namn</td> <td></td> </tr> <?php while($row = mysqli_fetch_array($result)) { ?> <tr> <td style='text-align:center;'> <?php echo $row["id"]; ?> </td> <td style="padding-left: 10px;"> <input style="font-size:14px; width:140px;" name="new_name" value="<?php echo $row["name"]; ?>" type="text"> </td> <td> <button style="width:auto; text-align:center; margin-left:-3px; font-size:10px;" name="namnKorrigering" value="<?php echo $row["id"]; ?>" type="submit">Ändra</button> </td> </tr> <?php } ?> </table> </form>

Här är en bild på hur hur det ser ut i nuläget: https://24h.rip/SiriS30

Från bilden:
om jag försöker att ändra namnet "pelle" (id 1) till sven så kommer jag istället att få namnet "ragnar"

Hur löser jag detta som?

Permalänk
Medlem

Förklaringen till att det blir som det blir är att du har ett formulär och där alla inputfält heter samma sak. Oavsett vilken av Submit-knapparna du klickar på kommer alla input-fält skickas till servern. Då alla heter samma sak blir det den sista i ordningen som används.

Skickades från m.sweclockers.com

Visa signatur

Windows 11 Pro | Intel i7 8700 | ASUS Prime Z370-P | Corsair 16GB 3000MHz | ASUS GTX 1080 | Fractal Design Define S | Corsair RM750x | Hyper 212 EVO

Permalänk
Medlem

Jo, så långt har jag förstått, men hur löser jag det som?

Permalänk
Medlem

$new_name = $_POST["id_".$id];
<input name=<?php echo "id_".row['id']; ?> ...

Skickades från m.sweclockers.com

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk
Medlem

Edit. slarvfel från mig

Permalänk
Inaktiv

Du kan prova detta. Nu plockar jag min data från en array men principen borde vara densamma. Jag lade in de gamla värdena också och jämför dem med de nya värdena för att se om någon förändring gjorts. Säkert inte bästa lösningen men hoppas den fungerar för dig.

http://michaelclaesson.se/filer/phpswec/

<?php $data = array( array( 'name' => 'Nisse', 'address' => 'Nissestigen 1' ), array( 'name' => 'Bertil', 'address' => 'Hasselgatan 2' ), array( 'name' => 'Ove', 'address' => 'Storgatan 3' ) ); ?> <html> <head> <title>SweC PHP</title> <meta charset="utf-8" /> </head> <body> <?php if (isset($_POST['change'])) { $id = intval($_POST['change']); if ($_POST['name'][$id] != $_POST['old-name'][$id] || $_POST['address'][$id] != $_POST['old-address'][$id]) { echo "<p>Du ändrade uppgifter för <b>{$data[$id]['name']}</b></p>"; } else { echo '<p>Du ändrade inget</p>'; } } ?> <form action="index.php" method="post"> <table> <tr> <td><b>Namn</b></td> <td><b>Adress</b></td> <td></td> </tr> <?php foreach ($data as $id => $row): ?> <tr> <td> <input type="text" name="name[<?php echo $id; ?>]" value="<?php echo $row['name']; ?>"> <input type="hidden" name="old-name[<?php echo $id; ?>]" value="<?php echo $row['name']; ?>"> </td> <td> <input type="text" name="address[<?php echo $id; ?>]" value="<?php echo $row['address']; ?>"> <input type="hidden" name="old-address[<?php echo $id; ?>]" value="<?php echo $row['address']; ?>"> </td> <td><button type="submit" name="change" value="<?php echo $id; ?> ">Spara</button></td> </tr> <?php endforeach; ?> </table> </form> </body> </html>

Permalänk
Medlem

@anon46732

Den där koden hängde jag inte alls med på

Finns det något enklare sätt att göra det på som passar för min mycket "enkla" idé ?

Permalänk
Inaktiv

Det kan du absolut. Du kan skippa kontrollen om fälten är ändrade t.ex. Nyckeln är att märka upp varje rad med postens ID-nummer så att du vet vilka värden från POST-variabeln du ska hämta.

Istället för <input type="text" name="name" value="<?php echo $row['name']; ?>" /> får du köra <input type="text" name="name[<?php echo $row['id']; ?>]" value="<?php echo $row['name']; ?>" />

På så sätt kan du använda värdet (ID) i din namnKorrigering-variabel som du får från spara-knappen och hämta ut rätt värde ur POST-variabeln. Eftersom du skickar alla raders värden måste du göra den kopplingen. Hade du haft ett formulär för varje rad hade du kunnat plocka namn och adress direkt då de varit unika. Nu har du flera värden att välja på, då måste du använda ID som nyckel för att hämta ut just den radens värden.

När du sätter [] efter namnet på ett fält betyder det att den ska spara värdet i en array istället för en vanlig sträng. På så sätt kan du lagra flera värden, och använda värdet inom [] som nyckel för just den raden.

Är du med på vad jag menar?

Permalänk
Medlem

@anon46732

Jag löste det !
tusen tack för hjälpen!

Permalänk
Inaktiv

@Lexdale: Gött! Så lite så