[PHP] Update MySQL DB via PHP/forms

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gammort
  • Registratie: Mei 2009
  • Laatst online: 18-01 14:34
Beste mede-Tweakers,

Na een lange periode heb ik mijn kleine beetje PHP kennis weer af moeten stoffen, maar ik ben eigenlijk een beetje vastgelopen dus ik hoop dat ik wat insight kan krijgen van wat mensen met wat meer ervaring.

De doel van de code is om alle aanbiedingen in de tabel aanbiedingen (3 stuks in dit geval) te weergeven met bijbehorende inhoud in een form. Tot dat deel gaat het nog prima. Nu wil ik alleen dat wanneer deze informatie wordt aangepast ik met een druk op de submit knop ook daadwerkelijk die informatie in de database kan plaatsen.

Ik ben vast wat vergeten en ik weet niet meer zeker of ik nou een 'update' query moet gebruiken. Eigenlijk weet ik gewoon even niet meer waar ik verder moet. Wie kan mij helpen deze code naar een werkend geheel te krijgen?
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!-- Stukje HTML -->
<p>U bent nu in het systeem om de aanbiedingen aan te passen</p>

<form method="POST" action="admin.php" />
<p><b>Aanbiedingen aanpassen</b></p><br />
<hr>
<!-- Stukje HTML eind -->
<?php
// Begin formstuff
$query = "SELECT * FROM aanbiedingen"; 
$result = mysql_query($query); 
    if(!$result) { 
      echo 'Er is een fout opgetreden bij het ophalen van de merken! MySQL zegt: '. mysql_error(); 
    } 
    
while ($row = mysql_fetch_array($result))
        {
            echo '<p>Aanbieding: '. $row['id'] .' </p>';
            echo '<table>';
            echo '<tr><td>id</td><td><input type="text" readonly="readonly" name="uneditablefield" name="kop" size="30"  maxlength="55" value="'. $row['id'] .'" /><br /></td></tr>';
            echo '<tr><td>Kop</td><td><input type="text" name="kop" size="30"  maxlength="55" value="'. $row['kop'] .'" /><br /></td></tr>';
            echo '<tr><td>Beschrijving</td><td><input type="text" name="brandstof" size="30"  maxlength="55" value="'. $row['beschrijving'] .'" /><br /></td></tr>';
            echo '<tr><td>Van-prijs</td><td><input type="text" name="vanprijs" size="30"  maxlength="55" value="'. $row['vanprijs'] .'" /><br /></td></tr>';
            echo '<tr><td>Voor-prijs</td><td><input type="text" name="voorprijs" size="30"  maxlength="55" value="'. $row['voorprijs'] .'" /><br /></td></tr>';
            echo '<tr><td><input type="submit" value="Veranderen" name="submit"></td></tr>';
            echo '</form>';
            echo '</table>';
            echo '<hr>';
        }

if(isset($_POST['submit']))
 {
    $query = mysql_query("SELECT * FROM aanbiedingen");
    $id = $_POST['id'];
    $kop = $_POST['kop'];
    $beschrijving = $_POST['beschrijving'];
    $vanprijs = $_POST['vanprijs'];
    $voorprijs = $_POST['voorprijs'];
    // insert waardes
    mysql_query("INSERT INTO aanbiedingen(kop,beschrijving,vanprijs,voorprijs) VALUES ('$kop','$beschrijving','$vanprijs','$voorprijs') WHERE id = '$id'");
    echo '<h2>De informatie is verwerkt</h2>';
    
}// Einde formstuff


p.s. Er zijn nog meer velden in de database maar die hoeven niet aangepast te worden, ik wil niet dat deze bijvoorbeeld leeg raken omdat er niks over gepost wordt ;)

Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
Waar loop je nu precies op vast? Formuleer je vraag eens wat duidelijker :)

Paar tips alvast:
  • Je "id"-inputveld heet "uneditable", niet "id". Die moet je dus opvragen met $_POST["uneditable"], of je moet de naam van het input-field wijzigen
  • Je gebruikt een INSERT-query in plaats van een UPDATE-query? Why?
  • Select query na submit.. Why?
  • Je doet compleet niets aan input sanitation en je query is niet ge-escaped. Je code is nu ontzettend makkelijk te misbruiken voor MySQL-injectie en allerlei andere leuke vervelende toestanden.
  • Je echo't "De informatie is verwerkt"; maar doet helemaal geen check. Dit wordt dus ook geprint als de informatie helemaal niet goed verwerkt is.. Niet echt netjes.

[ Voor 18% gewijzigd door HyperioN op 30-03-2012 19:39 ]


Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 16:11
Ik ben het eens met mijn collega hierboven, ik moet ik zeggen dat uw update code beetje vaag is.. is dit soms uit een bestaand systeem dat je probeert aan te passen?


Ff kort schetsen
  • je hebt meer als 1 $_POST['naam'] dus dit is sowieso een array. Zoek op hoe je dit kunt oplossen.
  • Je hebt geen select nodig, je gaat iets UPDATEN.
  • Voor te updaten doe je feitelijk een UPDATE iets=$waarde, iets2=$waard2,.. WHERE id=$id
  • doe een controle bij uw mysql_query een vaak gebruikte methode is mysql_query($query) or die("fout!");
    Deze die kun je bv vervangne door een eigen functie bv.. (function ... foutje etc)
Dus al eerste stap probeer op te zoeken hoe je met PHP een array van elementen kunt ophalen die dezelfde naam hebben.

[ Voor 15% gewijzigd door Icekiller2k6 op 31-03-2012 02:01 ]

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • Gammort
  • Registratie: Mei 2009
  • Laatst online: 18-01 14:34
Ondanks dat mijn vraagstelling misschien niet duidelijk was heb ik eigenlijk wel de soort antwoorden ontvangen waar ik naar zocht. Ik wist niet meer zo goed waar ik verder moest en nu heb ik weer wat dingen waar ik naar moet kijken.

Wat betreft de input sanitation heb je gelijk maar dat is in dit geval vanwege de schaal waarop dit gebruikt wordt niet van toepassing :/

Acties:
  • 0 Henk 'm!

  • Gtoniser
  • Registratie: Januari 2008
  • Laatst online: 09:06
Input sanitation is altijd van toepassing want zelfs al heb je niemand die ooit bij je systeem zal kunnen die er vervelende dingen wil doen, dan kun je altijd nog iemand hebben die "rode auto's" in je velden typt (of iets anders met een ' ) waardoor je query vastloopt.
Icekiller2k6 schreef op vrijdag 30 maart 2012 @ 19:40:
  • je hebt meer als 1 $_POST['naam'] dus dit is sowieso een array. Zoek op hoe je dit kunt oplossen.
Zie en weet jij iets wat ik niet zie? Er staat nergens een $_POST['naam'] of iets wat een array gaat worden?

[ Voor 39% gewijzigd door Gtoniser op 31-03-2012 16:51 ]


Acties:
  • 0 Henk 'm!

  • Gammort
  • Registratie: Mei 2009
  • Laatst online: 18-01 14:34
Ja ik vind dat je gelijk hebt hoor, maar ik heb een vastgesteld aantal uren voor het project en ondanks dat ik wist dat ik er overheen zou gaan wil ik het niet al te bont maken voor mezelf. De schade die aangericht kan worden is ook heel erg klein en de kans dat iemand schade aan gaat richten is nog veel kleiner.

Acties:
  • 0 Henk 'm!

  • Gtoniser
  • Registratie: Januari 2008
  • Laatst online: 09:06
ja, want om
PHP:
1
$beschrijving = $_POST['beschrijving'];
te vervangen door
PHP:
1
$beschrijving = mysql_real_escape_string($_POST['beschrijving']);
is natuurlijk uren werk :?

Is natuurlijk niet een alles omvangende beveiliging maar wel de basis.

[ Voor 15% gewijzigd door Gtoniser op 31-03-2012 16:54 ]


Acties:
  • 0 Henk 'm!

  • Gammort
  • Registratie: Mei 2009
  • Laatst online: 18-01 14:34
Oh ik bedoelde niet de escape strings, die komen er nog wel in. Ik bedoel beveiliging waar ik worst case scenario's moet gaan bedenken en daar op gaan beveiligen. Dit is uiteraard standaard beveiliging dat ik eigenlijk al in eerste instantie erin had moeten verwerken ;)

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Icekiller2k6 schreef op vrijdag 30 maart 2012 @ 19:40:
je hebt meer als 1 $_POST['naam'] dus dit is sowieso een array. Zoek op hoe je dit kunt oplossen.
Superglobals zijn áltijd een array.
doe een controle bij uw mysql_query een vaak gebruikte methode is mysql_query($query) or die("fout!");
Deze die kun je bv vervangne door een eigen functie bv.. (function ... foutje etc)
Hou wel rekening met SQL injection en dat is heel makkelijk op te lossen. ;)
Gammort schreef op zaterdag 31 maart 2012 @ 16:51:
Ja ik vind dat je gelijk hebt hoor, maar ik heb een vastgesteld aantal uren voor het project en ondanks dat ik wist dat ik er overheen zou gaan wil ik het niet al te bont maken voor mezelf. De schade die aangericht kan worden is ook heel erg klein en de kans dat iemand schade aan gaat richten is nog veel kleiner.
Ik zou ik er maar wél tijd in gaan steken, de website is onderdeel van de inkomsten voor het bedrijf, beveiliging moet dan hoog in het vaandel staan, vertrouw de bezoekers van een website absoluut nooit. Plus je voorkomt problemen later.

[ Voor 43% gewijzigd door CH4OS op 31-03-2012 17:56 ]


Acties:
  • 0 Henk 'm!

  • Gammort
  • Registratie: Mei 2009
  • Laatst online: 18-01 14:34
Ik heb nu wel het 1 en ander aangepast, maar het probleem is momenteel dat ik alleen de laatste aanbieding kan aanpassen en dat heeft natuurlijk te maken met de while, alleen weet ik niet precies hoe ik dit het makkelijkst kan oplossen zonder in herhaling te vallen, ik wil eigenlijk niet 3x hetzelfde maken.
Ik kan natuurlijk de submit het id meegeven zodat ik submit1, 2 en 3 krijg maar ik wil dan ook op een slimme manier de update uitvoeren en niet 3 keer het hele if isset post submit1 --> hele rits code, submit 2 --> hele rits code etc.

Iemand een suggestie, zonder in te gaan op mijn slechte beveiliging met ontopic te blijven bij mijn probleem?

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!-- Stukje HTML -->
<p>U bent nu in het systeem om de aanbiedingen aan te passen</p>

<form method="POST" action="admin.php" />
<p><b>Aanbiedingen aanpassen</b></p><br />
<hr>
<!-- Stukje HTML eind -->
<?php
if(isset($_POST['submit']))
 {
    $id = mysql_real_escape_string($_POST['id']);
    $kop = mysql_real_escape_string($_POST['kop']);
    $beschrijving = mysql_real_escape_string($_POST['beschrijving']);
    $vanprijs = mysql_real_escape_string($_POST['vanprijs']);
    $voorprijs = mysql_real_escape_string($_POST['voorprijs']);
    // insert waardes
    // Moet een update query worden
    $query = "UPDATE aanbiedingen SET kop = '$kop', beschrijving = '$beschrijving', vanprijs = '$vanprijs', voorprijs = '$voorprijs' WHERE id = '$id'";
    mysql_query($query) or die("Mislukt!");
    echo 'Gelukt!';
    echo $id;
}

// Begin formstuff
$query = "SELECT * FROM aanbiedingen"; 
$result = mysql_query($query); 
    if(!$result) { 
      echo 'Er is een fout opgetreden bij het ophalen van de merken! MySQL zegt: '. mysql_error(); 
    } 
    
while ($row = mysql_fetch_array($result))
       {
            echo '<p>Aanbieding: '. $row['id'] .' </p>';
            echo '<table>';
            echo '<tr><td>id</td><td><input type="text" readonly="readonly" name="id" size="30"  maxlength="55" value="'. $row['id'] .'" /><br /></td></tr>';
            echo '<tr><td>Kop</td><td><input type="text" name="kop" size="30"  maxlength="55" value="'. $row['kop'] .'" /><br /></td></tr>';
            echo '<tr><td>Beschrijving</td><td><input type="text" name="beschrijving" size="30"  maxlength="55" value="'. $row['beschrijving'] .'" /><br /></td></tr>';
            echo '<tr><td>Van-prijs</td><td><input type="text" name="vanprijs" size="30"  maxlength="55" value="'. $row['vanprijs'] .'" /><br /></td></tr>';
            echo '<tr><td>Voor-prijs</td><td><input type="text" name="voorprijs" size="30"  maxlength="55" value="'. $row['voorprijs'] .'" /><br /></td></tr>';
            echo '<tr><td><input type="submit" value="Verander aanbieding '. $row['id'] .'" name="submit"></td></tr>';
            echo '</form>';
            echo '</table>';
            echo '<hr>';
        }
?>

Acties:
  • 0 Henk 'm!

  • Mercatres
  • Registratie: September 2009
  • Laatst online: 19-09 19:50
Kijk eens naar het resultaat van je HTML-code. Als je meerdere items heb in je db krijg je als ik me niet vergis dit:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<p>U bent nu in het systeem om de aanbiedingen aan te passen</p> 

<form method="POST" action="admin.php" /> 
<p><b>Aanbiedingen aanpassen</b></p><br /> 
<hr>
<table>
... gegevens uit de db
</form>
</table>
... gegevens uit de db
</form>
</table>
... gegevens uit de db
</form>
</table>

Dit is sowieso niet netjes, maar meteen ook een tip om naar je oplossing te werken. (Form-elementen enz.)

Acties:
  • 0 Henk 'm!

  • ytterx
  • Registratie: Januari 2009
  • Laatst online: 19-09 18:18
Dat komt omdat al je input velden elke keer herhaald worden. Die hebben dus de zelfde naam. De browser snapt er dan niet zo veel van en pakt dan de laatste waarde voor die velden en stuurt die dan op. Mogelijk kan je met dit wat meer vinden:

Google: multi row update mysql html php
Pagina: 1