[MySQL] & [PHP] updating rows

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • X-DraGoN
  • Registratie: Juli 2005
  • Laatst online: 01-10 16:21
Ik heb een lijst van namen die ik uit mysql haal via PHP
Afbeeldingslocatie: https://i.imgur.com/9c8a3Oc.png

Ik presenteer die in een selectable lijst op de volgende manier
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<form method="post" action="update_rows.php">
  <table>
    <thead>
      <tr>
        <th>Select</th>
        <th>Naam</th>
        <th>Beurten</th>
      </tr>
    </thead>
    <tbody>
      <?php
        // Connect to the MySQL database
        $db = new mysqli('***knip***');

        // Retrieve the rows from the database
        $result = $db->query("SELECT leden_id, leden_naam, leden_beurten_left FROM leden_tbl ORDER BY leden_naam ASC");

        // Loop through the rows and create a checkbox for each one
        while ($row = $result->fetch_assoc()) {
          echo '<tr>';
          echo '<td><input type="checkbox" name="selected_rows[]" value="' . '"></td>';
          echo '<td>' . $row['leden_naam'] . '</td>';
          echo '<td>' . $row['leden_beurten_left'] . '</td>';
          echo '</tr>';
        }
      ?>
    </tbody>


Ik stuur deze lijst naar update_rows.php met de volgende inhoud:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
  // Connect to the MySQL database
  $db = new mysqli('l***knip***');

  // Retrieve the selected rows from the form data
  $selected_rows = $_POST['selected_rows'];

  // Loop through the selected rows and update the desired column
  foreach ($selected_rows as $row_id) {
    $db->query("UPDATE leden_tbl SET leden_beurten_left = leden_beurten_left -1 WHERE id = $row_id$");
  }

  // Display a confirmation message
  echo count($selected_rows) . " row(s) have been updated.";
?>

Ik krijg mooi een schermpje dat zegt x aantal rows updated, maar hij update niets in de tabel.
Hoe kan ik er voor zorgen dat hij de juiste rijen die ik aanduid, effectief gaat updaten?

Ik heb ook een 'leden_id' in mijn tabel, kan in die gebruiken om de juiste aangeduide regel door te geven?
Hoe zou die dan in de code passen?

[ Voor 0% gewijzigd door X-DraGoN op 31-03-2023 16:35 . Reden: fout mee gekopieerd ]

Beste antwoord (via X-DraGoN op 05-04-2023 16:05)


  • brambo123
  • Registratie: December 2006
  • Laatst online: 01-10 14:02
Sowieso heeft je checkbox geen value, en in je sql update gebruik je 'id' i.p.v. 'leden_id' :z
Checkbox moet natuurlijk zijn:
PHP:
1
echo '<td><input type="checkbox" name="selected_rows[]" value="' . $row['leden_id'] . '"></td>';


En gebruik even netjes prepare en execute voor je SQL.
Dan krijg je zoiets:
PHP:
1
2
3
4
5
$sql = $db->prepare("UPDATE `leden_tbl` SET `leden_beurten_left` = `leden_beurten_left`-1 WHERE `leden_id` = :rowid");
foreach ($selected_rows as $row_id) {
    $sql->execute([':rowid' => $row_id]);
}
$sql->closeCursor();

Alle reacties


Acties:
  • 0 Henk 'm!

  • Groentjuh
  • Registratie: September 2011
  • Laatst online: 01-10 14:50
Geen idee of autocommit aanstaat, maar daar zou ik even naar kijken.
Is de input array wel gevuld met IDs?
En misschien een lesje prepared sql statements volgen?

[ Voor 42% gewijzigd door Groentjuh op 31-03-2023 16:22 ]


Acties:
  • 0 Henk 'm!

  • X-DraGoN
  • Registratie: Juli 2005
  • Laatst online: 01-10 16:21
Groentjuh schreef op vrijdag 31 maart 2023 @ 16:18:
Geen idee of autocommit aanstaat, maar daar zou ik even naar kijken.
En misschien een lesje prepared sql statements volgen?
Autocommit staat op "TRUE", dat lijkt me geen probleem te zijn

Acties:
  • 0 Henk 'm!

  • Groentjuh
  • Registratie: September 2011
  • Laatst online: 01-10 14:50
var_dump($_POST['selected_rows']) ; eens? Staan daar de ids in? En geeft de query functie true terug?

Acties:
  • +2 Henk 'm!

  • D4NG3R
  • Registratie: Juli 2009
  • Laatst online: 08:40

D4NG3R

kiwi

:)

Je telt overigens hoe veel entries er in 'selected_rows' zitten, niet hoe vaak de gegeven query ook daadwerkelijk goed gaat. Je echo met X aantal updates zegt dan ook helemaal noppes. ;)

Komt d'r in, dan kö-j d’r oet kieken


Acties:
  • 0 Henk 'm!

  • 3raser
  • Registratie: Mei 2008
  • Laatst online: 30-09 13:41

3raser

⚜️ Premium member

code:
1
WHERE id = $row_id$

Ik werk niet regelmatig meer in PHP, maar waar is die laatste $ voor? Is de query niet gewoon fout?

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Je print het aantal items dat er gePOST wordt, maar je negeert het resultaat van de query. Print de query eens? Er staat een dollar achter.

En ja, je kunt ook andere kolommen opnemen in de WHERE, maar dan moet je de waarden daarvan POSTen in plaats van de IDs.

Edit: de value van je input is leeg; je zet er niets in (value="' . '").

Maar zoals gezegd: ga vooral prepared statements gebruiken.

[ Voor 51% gewijzigd door CodeCaster op 31-03-2023 16:33 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Potentieel gevaarlijke code met die $row_id zo in de string.
Beter placeholders gebruiken.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
3raser schreef op vrijdag 31 maart 2023 @ 16:27:
code:
1
WHERE id = $row_id$

Ik werk niet regelmatig meer in PHP, maar waar is die laatste $ voor? Is de query niet gewoon fout?
Ik gok dat TS een cat foo.php heeft gedaan en dat de regel daar op de terminal afgebroken is en TS dat heeft mee-gekopieerd ;)

Edit: Oh, wacht, daar staat nog een "); achter, dus dat is 't niet. Dat is 't (mogelijk) wél bij ORDER BY leden_naam ASC$.

[ Voor 16% gewijzigd door RobIII op 31-03-2023 16:31 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • X-DraGoN
  • Registratie: Juli 2005
  • Laatst online: 01-10 16:21
RobIII schreef op vrijdag 31 maart 2023 @ 16:30:
[...]

Ik gok dat TS een cat foo.php heeft gedaan en dat de regel daar op de terminal afgebroken is en TS dat heeft mee-gekopieerd ;)

Edit: Oh, wacht, daar staat nog een "); achter, dus dat is 't niet. Dat is 't (mogelijk) wél bij ORDER BY leden_naam ASC$.
Dat is idd fout gekopieerd, ik pas het even aan in de TS zelf

Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 23:12
Wat stuur je precies naar die update_rows.php? Is dat wel een lijst van ID's?

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • X-DraGoN
  • Registratie: Juli 2005
  • Laatst online: 01-10 16:21
StevenK schreef op vrijdag 31 maart 2023 @ 16:38:
Wat stuur je precies naar die update_rows.php? Is dat wel een lijst van ID's?
Ik vermoed van niet, maar hoe stuur ik dan welke rijen ik heb aangeduid door naar update_rows.php?
En moet ik daar de 'leden_id' die ik mijn DB hebben zitten voor gebruiken?

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 22:36

Cyphax

Moderator LNX
X-DraGoN schreef op vrijdag 31 maart 2023 @ 16:42:
[...]

Ik vermoed van niet, maar hoe stuur ik dan welke rijen ik heb aangeduid door naar update_rows.php?
En moet ik daar de 'leden_id' die ik mijn DB hebben zitten voor gebruiken?
Dat kan je doen, ze op basis van id identificeren, maar dan moet je die id's nog ergens plaatsen, op de plek die @CodeCaster al aanwees. De value van de input zou vervolgens een lijst van id's moeten vormen die je met $_POST['selected_rows']; weer uitleest. Momenteel is die lijst leeg, omdat de value van de input in eerste instantie niet wordt gevuld.

Saved by the buoyancy of citrus


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • brambo123
  • Registratie: December 2006
  • Laatst online: 01-10 14:02
Sowieso heeft je checkbox geen value, en in je sql update gebruik je 'id' i.p.v. 'leden_id' :z
Checkbox moet natuurlijk zijn:
PHP:
1
echo '<td><input type="checkbox" name="selected_rows[]" value="' . $row['leden_id'] . '"></td>';


En gebruik even netjes prepare en execute voor je SQL.
Dan krijg je zoiets:
PHP:
1
2
3
4
5
$sql = $db->prepare("UPDATE `leden_tbl` SET `leden_beurten_left` = `leden_beurten_left`-1 WHERE `leden_id` = :rowid");
foreach ($selected_rows as $row_id) {
    $sql->execute([':rowid' => $row_id]);
}
$sql->closeCursor();

Acties:
  • 0 Henk 'm!

  • X-DraGoN
  • Registratie: Juli 2005
  • Laatst online: 01-10 16:21
Bedankt voor de suggesties, ik ga er mee aan de slag

Acties:
  • +2 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 01-10 00:07
Dit is een goede source om dingen niet fout te gaan doen: https://phptherightway.com/#mysql_extension
Pagina: 1