Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP/mySQL] Updaten tabel mbv userinput

Pagina: 1
Acties:

  • 3dmaster
  • Registratie: December 2004
  • Laatst online: 20-10 17:03
Ik ben bezig met een simpel registratiesysteem voor een hondenclub. Hier worden de leden in bijgehouden en hun bijbehorende honden en welke cursus de hond volgt.

Ik probeer een query te maken die gegevens uit een tabel update mbv gegevens uit een andere tabel. Even voor het overzicht de tabellen:

Tabel 1 (leden)
LidID (pk), Naam(unique), Adres, Woonplaats

Tabel 2 (Honden)
HondID, LidID, Naam, Ras, Stamboom, Cursus

Er zijn nog wat meer tabellen maar die zijn niet relevant.

Nu wil ik een menu hebben waarmee je een hond kunt koppelen aan een Eigenaar. Ik heb dit formulier gemaakt om gegevens van een Hond te wijzigen:

Updateformulier
code:
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
<?php
// Connectie
include 'connect.php';
$select_id = htmlspecialchars($_GET["id"]);
//Vraag gegevens op
$query = "SELECT Honden.*, Instructeur.Naam InsNaam, Cursus.CursusNaam CursusNaam 
    FROM Honden 
    INNER JOIN Instructeur ON Honden.InstructeurID=Instructeur.InstructeurID 
    INNER JOIN Cursus ON Honden.CursusID=Cursus.CursusID 
    WHERE Honden.HondID='$select_id'";

$result = mysqli_query($link, $query);
$row = mysqli_fetch_array($result);

// Maak formulier 
?>
<form action="update_db.php" method="post">
<input type="hidden" name="HondID" value="<?php echo $select_id; ?>" /><br />
Naam: <input type="text" name="Naam" value="<?php echo $row['Naam']; ?>" /><br />
Ras: <input type="text" name="Ras" value="<?php echo $row['Ras']; ?>" /><br />
Lidid: <input type="integer" name = "lidID" value="<?php echo $row['lidID']; ?>" /><br> 
Geb datum: <input type="date" name = "Datum" placeholder="(YYYY-MM-DD)" value="<?php echo $row['GebDatum']; ?>" /><br>
Instructeur: <input type="text" name = "InstructeurNaam" value="<?php echo $row['InsNaam']; ?>" /><br> 
Cursus: <input type="text" name = "cursusnaam" value="<?php echo $row['CursusNaam']; ?>" /><br> 
Stamboom: <input type="text" name = "Stamboomnaam" value="<?php echo $row['Stamboomnaam']; ?>" /><br> 
<input type="submit" value="Submit" />
</form>


Bijbehorende update_db:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// Maak connectie
include 'connect.php';

 $id=$_POST['HondID'];
 $Naam=$_POST['Naam']; 
 $Ras=$_POST['Ras']; 
 $Datum=$_POST['Datum'];
 $Stamboomnaam=$_POST['Stamboomnaam'];
 mysqli_query($link, "UPDATE Honden SET Naam='$Naam', Ras='$Ras', GebDatum='$Datum', Stamboomnaam='$Stamboomnaam' WHERE HondID='$id'"); 
 Print "Database succesvol bijgewerkt"; 
 ?>


Nu is het natuurlijk makkelijk om dit te doen door middel van het lidID mee te geven maar ik wil het eigenlijk mooier oplossen middels een dropdown menu waaruit je kunt kiezen wie de eigenaar is (dus de namen weergeven). Vervolgens wordt aan de hand van de naam het lidID veld van de hond geupdate.

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Wat snap je daar precies niet aan dan? Je kan toch alle namen ophalen, daar overheen loopen in je HTML en een select ermee vullen? Je hebt alle technieken die je daarvoor nodig hebt al in je code zitten.

[ Voor 21% gewijzigd door NMe op 03-08-2014 16:50 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • 3dmaster
  • Registratie: December 2004
  • Laatst online: 20-10 17:03
Het probleem was meer het feit dat ik wel een menu kan maken met de lidID's maar niet met de namen, aangezien dat veld niet in de tabel 'Honden' zit.

Nu heb ik het net al op een andere manier opgelost. Ik maak een select menu die gevuld wordt met gegevens uit de leden tabel. Vervolgens maak ik een query die de naam omzet in het lidID. Iig bedankt voor het meedenken :)

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


  • Cartman!
  • Registratie: April 2000
  • Niet online
Vergeet niet dat je nu enorm vatbaar bent voor SQL injection ook, mysqli heeft prima ondersteuning voor prepared statements

  • 3dmaster
  • Registratie: December 2004
  • Laatst online: 20-10 17:03
I know, daar ga ik nog naar kijken. Overigens wordt het uiteindelijk maar door 2 mensen gebruikt dus wat dat betreft is het te overzien :)

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


  • Donderpoes
  • Registratie: April 2011
  • Laatst online: 11-05 23:09
Je joined al twee tabellen vanuit je honden tabel, de leden tabel kan je op dezelfde wijze joinen. Dan heb je ook alle lid gegevens beschikbaar.

  • vpm
  • Registratie: December 2010
  • Laatst online: 17-11 21:20

vpm

Think, tinker, tank

In het geval een lid meerdere honden kan hebben
code:
1
2
3
4
FROM honden h
...
LEFT OUTER JOIN leden l on h.lidid = l.lidid
...


Maar goed, dan krijg je wel een totaal andere result set dan nu. Beter draai je dus een aparte query voor leden x honden.

Vervolgens heb je in je formulier (voor zover je dat nog niet wist):
code:
1
2
3
4
5
<select name="lid">
 <?php foreach($leden as $lid): ?>
     <option value="<?= $lid['lidid'] ?>"><?= $lid['naam'] ?></option>
  <?php endforeach; ?>
</select>


Offtopic: wat ben ik blij met Templating engines... _/-\o_

[ Voor 5% gewijzigd door vpm op 04-08-2014 10:56 ]


  • Cartman!
  • Registratie: April 2000
  • Niet online
3dmaster schreef op zondag 03 augustus 2014 @ 23:20:
I know, daar ga ik nog naar kijken. Overigens wordt het uiteindelijk maar door 2 mensen gebruikt dus wat dat betreft is het te overzien :)
Dat mag nooit een reden zijn om security te vergeten.

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Cartman! schreef op maandag 04 augustus 2014 @ 14:20:
[...]

Dat mag nooit een reden zijn om security te vergeten.
Vooral niet als het aan het internet gehangen wordt.

  • vpm
  • Registratie: December 2010
  • Laatst online: 17-11 21:20

vpm

Think, tinker, tank

Mensen, laat em dat zelf uitvogelen / ondervinden. ;)

  • 3dmaster
  • Registratie: December 2004
  • Laatst online: 20-10 17:03
Haha, ik ga het ook niet vergeten. Ik probeer is alle functionaliteit werkend te krijgen :). Overgens komt het niet aan het internet te hangen maar in een intranet systeempje.

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


  • MrMonkE
  • Registratie: December 2009
  • Laatst online: 04-11 15:26

MrMonkE

★ EXTRA ★

3dmaster schreef op maandag 04 augustus 2014 @ 15:05:
Overgens komt het niet aan het internet te hangen maar in een intranet systeempje.
Precies.. dan ga je geen tijd verspillen aan sql injection tenzij je dat wilt omdat je het wilt leren.
Zonde van de tijd imho in dit geval. Overtrokken reacties allemaal hierboven. 8)7
Gewoon een Hobby-Bob klusje, niet de Nederlandse bank ofzo.

★ What does that mean? ★


  • 3dmaster
  • Registratie: December 2004
  • Laatst online: 20-10 17:03
Yup, overigens ga ik het voor mijzelf wel nog een keer herschrijven met prepared statements om het te leren. Maar daar moet ik me eerst is in verdiepen.

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
MrMonkE schreef op maandag 04 augustus 2014 @ 15:12:
[...]


Precies.. dan ga je geen tijd verspillen aan sql injection tenzij je dat wilt omdat je het wilt leren.
Zonde van de tijd imho in dit geval. Overtrokken reacties allemaal hierboven. 8)7
Gewoon een Hobby-Bob klusje, niet de Nederlandse bank ofzo.
Nee dit soort dingen moet je gewoon direct goed aanleren. Zwakke excuses elke keer 'ja dit hoeft toch niet veilig te zijn', 'dat leer ik nog wel', 'ik gebruik het alleen zelf'. Leer het jezelf gewoon direct goed aan. Het is echt niet meer moeite om het goed te doen.
Voor je het weet gebruik je dit weer als basis/voorbeeld voor een ander systeem of ga je het uitbreiden en vergeet je het te vervangen.
Of erger nog, iemand zit jouw stukje code en denk, he leuk dit ga ik ook gebruiken, zonder dat hij doorheeft dat het onveilig is..

En als het ingewikkeld is om het zelf veilig te doen (of met joins te werken), pak dan gewoon een simpel ORM, die regelt het voor je.

  • MrMonkE
  • Registratie: December 2009
  • Laatst online: 04-11 15:26

MrMonkE

★ EXTRA ★

Omdat het voor iemand als de TS die net komt kijken echt wel veel meer moeite is zou ik hem adviseren meer tijd in goede fout afhandeling en logging te steken in plaats als een donquichotte de SQL injection op een intranet met 2 mensen te voorkomen.

Ik gebruik zelf natuurlijk altijd een ORM of stored procedures.
Ook voor de lulligste hobby projecten.
Maar ik 'zit op' IT. :)

Voor hobby bob mensen moet je even de indenken dat ze het al moeilijk genoeg hebben met de simpele zaken. Dus alles waar geen noodzaak voor is gewoon negeren.

★ What does that mean? ★


  • 3dmaster
  • Registratie: December 2004
  • Laatst online: 20-10 17:03
Ok, ik heb mijn update_db code aangepast zodat deze nu een stuk veiliger is :)
code:
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
28
29
<?php
// Maak connectie
include 'connect.php';

//Vul variabelen vanuit POST
 $id=$_POST['HondID'];
 $Naam=$_POST['Naam']; 
 $Ras=$_POST['Ras']; 
 $lidID=$_POST['lidID']; 
 $Datum=$_POST['Datum'];
 $Stamboomnaam=$_POST['Stamboomnaam'];
 $Instructeur=$_POST['Instructeur'];
 $Cursus=$_POST['Cursus'];

 //Voer query uit
 if ($stmt = $link->prepare("UPDATE Honden SET Naam=?, Ras=?, GebDatum=?, Stamboomnaam=?, InstructeurID=?, lidID=?, CursusID=? WHERE HondID='$id'")) {
 
    // Bind the variables to the parameter as strings. 
    $stmt->bind_param("sssssss", $Naam, $Ras, $Datum, $Stamboomnaam, $Instructeur, $lidID, $Cursus);
 
    // Execute the statement.
    $stmt->execute();
 
    // Close the prepared statement.
    $stmt->close();
 
}
 echo 'Update succesvol';
 ?>

En het bijbehorende formulier die alles voor invult is nu dit
code:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
// Create connection
include 'connect.php';
$select_id = htmlspecialchars($_GET["id"]);
//Vraag gegevens op
$query = "SELECT Honden.*, Instructeur.InstructeurID, Instructeur.Naam InsNaam, Cursus.CursusNaam CursusNaam, Leden.Naam LidNaam
    FROM Honden 
    INNER JOIN Instructeur ON Honden.InstructeurID=Instructeur.InstructeurID 
    INNER JOIN Cursus ON Honden.CursusID=Cursus.CursusID 
    INNER JOIN Leden ON Honden.lidID=Leden.lidID
    WHERE Honden.HondID='$select_id'";

$result = mysqli_query($link, $query);
$row = mysqli_fetch_array($result);

// Maak formulier 
?>
<form action="update_db.php" method="post">
<input type="hidden" name="HondID" value="<?php echo $select_id; ?>" /><br />
Naam: <input type="text" name="Naam" value="<?php echo $row['Naam']; ?>" /><br />
Ras: <input type="text" name="Ras" value="<?php echo $row['Ras']; ?>" /><br />
Geb datum: <input type="date" name = "Datum" placeholder="(YYYY-MM-DD)" value="<?php echo $row['GebDatum']; ?>" /><br>
Stamboom: <input type="text" name = "Stamboomnaam" value="<?php echo $row['Stamboomnaam']; ?>" /><br> 
Eigenaar: <select name="lidID">
<option value="<?php echo $row['lidID']; ?>"><?php echo $row['LidNaam']; ?> (huidige)</option> 
<?php
$query2 = "SELECT Naam, lidID
    FROM Leden";
$result2 = mysqli_query($link, $query2);
while ($row2 = mysqli_fetch_array($result2)) 
{    
    echo '<option value="' . htmlspecialchars($row2['lidID']) . '">' 
        . htmlspecialchars($row2['Naam']) 
        . '</option>';
}
echo '</select>' ;
?>
<br>
Instructeur: <select name="Instructeur">
<option value="<?php echo $row['InstructeurID']; ?>"><?php echo $row['InsNaam']; ?> (huidige)</option> 
<?php
$query3 = "SELECT *
    FROM Instructeur";
$result3 = mysqli_query($link, $query3);
while ($row3 = mysqli_fetch_array($result3)) 
{    
    echo '<option value="' . htmlspecialchars($row3['InstructeurID']) . '">' 
        . htmlspecialchars($row3['Naam']) 
        . '</option>';
}
echo '</select>' ;
?>
<br>
Cursus: <select name="Cursus">
<option value="<?php echo $row['CursusID']; ?>"><?php echo $row['CursusNaam']; ?> (huidige)</option> 
<?php
$query4 = "SELECT *
    FROM Cursus";
$result4 = mysqli_query($link, $query4);
while ($row4 = mysqli_fetch_array($result4)) 
{    
    echo '<option value="' . htmlspecialchars($row4['CursusID']) . '">' 
        . htmlspecialchars($row4['CursusNaam']) 
        . '</option>';
}
echo '</select>' ;
?>
<br>
<input type="submit" value="Wijzig" />
</form>

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
Let er wel op dat je voor alle input je parameters moet binden, ook al is het een ID. WHERE HondID='$id' gaat nog steeds fout, dat kan je ook gewoon binden, in beide scripts. htmlspecialchars doet daar niet zoveel aan (en heeft ook geen effect op je id als het goed is).

  • 3dmaster
  • Registratie: December 2004
  • Laatst online: 20-10 17:03
Hmm de $id wordt meegegeven middels een hidden form, maar ik zou die ook kunnen binden.

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


  • DukeBox
  • Registratie: April 2000
  • Laatst online: 23:39

DukeBox

loves wheat smoothies

Iets heel anders, waarom een unique op name ? Wat als iemand dezelfde naam heeft ?
Lijkt mij handiger dat te doen op basis van combinatie naam met bijv PC+HN/leeftijd o.i.d. Bij LidID had ik júíst wel een unique verwacht.

Duct tape can't fix stupid, but it can muffle the sound.


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
3dmaster schreef op dinsdag 05 augustus 2014 @ 10:05:
Hmm de $id wordt meegegeven middels een hidden form, maar ik zou die ook kunnen binden.
Een hidden form is net zo makkelijk aan te passen he ;) Gewoon inspect element en je kan alles aanpassen wat je wil, extra velden toevoegen, hidden values aanpassen etc.
DukeBox schreef op dinsdag 05 augustus 2014 @ 10:10:
Iets heel anders, waarom een unique op name ? Wat als iemand dezelfde naam heeft ?
Lijkt mij handiger dat te doen op basis van combinatie naam met bijv PC+HN/leeftijd o.i.d. Bij LidID had ik júíst wel een unique verwacht.
Als LidID je primary key is, is hij ook altijd uniek toch. En bij honden moet je LidID niet uniek zijn, want je kan meerdere honden hebben voor hetzelfde lid. Naam kan inderdaad hetzelfde voorkomen in principe, je zou natuurlijk wel in je applicatie een waarschuwing kunnen geven als iemand al bestaat, of je misschien die persoon bedoeld.

  • DukeBox
  • Registratie: April 2000
  • Laatst online: 23:39

DukeBox

loves wheat smoothies

Barryvdh schreef op dinsdag 05 augustus 2014 @ 12:09:
Als LidID je primary key is, is hij ook altijd uniek toch. En bij honden moet je LidID niet uniek zijn
Waarom neem je dan niet de combinatie van NAW als unique. Daarnaast zou ik altijd een unique key maken bij je honden tabel, dat is veel makkelijke om naar te refereren bij een update e.d.

Duct tape can't fix stupid, but it can muffle the sound.


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
DukeBox schreef op dinsdag 05 augustus 2014 @ 13:13:
[...]

Waarom neem je dan niet de combinatie van NAW als unique. Daarnaast zou ik altijd een unique key maken bij je honden tabel, dat is veel makkelijke om naar te refereren bij een update e.d.
Ah ik wist niet dat je een combinatie van columns ook unique kon maken, handig.
En ik neem aan dat zijn HondId daar de PK is.

  • 3dmaster
  • Registratie: December 2004
  • Laatst online: 20-10 17:03
HondID is PK (en uniek) in de tabel Honden
lidID is PK (en uniek) in leden, in de Hondentabel natuurlijk niet want iemand kan meerdere honden hebben :).
Naam in de tabel Leden heb ik uniek gedaan ivm overzichtelijkheid, kans dat voor en achternaam het zelfde is is namelijk nihil. (zo'n 100 leden hebben ze).

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 05:56
Misschien dat je zelfs met een koppeltabel moet gaan werken? Dan kan je 2 leden hebben die met dezelfde hond komen?

Simpel gezegd heeft de gemiddelde hond "meerdere baasjes", of de hond dan komt met baasje 1 of baasje 2, kan je dan ook weer invoeren. Misschien voegt dat niets toe, daar hebben wij geen zicht op.

  • DukeBox
  • Registratie: April 2000
  • Laatst online: 23:39

DukeBox

loves wheat smoothies

- Wat als Hond van Eigenaar A overgaat naar Eigenaar B :w
- Wat als Eigenaar A met Hond A samengaat met Eigenaar B met Hond B ^)
- Wat als Eigenaar A geen Hond meer heeft maar wel lid is :S
- Wat als Hond A van Eigenaar A ook een Eigenaar B heeft :Y :N

Duct tape can't fix stupid, but it can muffle the sound.


  • 3dmaster
  • Registratie: December 2004
  • Laatst online: 20-10 17:03
Haha, :P
- Wat als Hond van Eigenaar A overgaat naar Eigenaar B
Dat kan je nu veranderen met deze code :)
- Wat als Eigenaar A met Hond A samengaat met Eigenaar B met Hond B
Dat moet ik die mergen, maar dat zal bijna nooit voorkomen
- Wat als Eigenaar A geen Hond meer heeft maar wel lid is
Dat kan dus gewoon :)
- Wat als Hond A van Eigenaar A ook een Eigenaar B heeft
Dat kan dus niet nu :+

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.

Pagina: 1