[PHP/MySQL] Update statement wordt niet doorgevoerd*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ultimatia
  • Registratie: November 2007
  • Laatst online: 22-06 22:00
[inmiddels opgelost]

Hallo,

Ik ben al enige tijd bezig met het uitzoeken waarom mijn gegevens niet worden upgedate maar ik kom er niet helemaal uit.

De gegevens worden correct ingevuld in het wijziginsformulier, maar waneer ik deze daadwerkelijk probeer up te daten krijg ik wel de melding dat ze upgedate zijn. Er wordt echter niets echt upgedate. De querie is volgens mij correct.

Hebben jullie enig idee waar dit aan kan liggen?


De code is als volgt
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
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php // error_reporting(E_ALL); ?> 
<?php   
    include ('php_header.php');
//  include ('beveiliging.php');
    include ('html_header.php');    
?>  
<p>CD wijzigen</p>
<?php

    // maak variabele aan voor het id van de cd, wordt gebruikt om de juiste cd te kunnen wijzigen
    $cdid = $_GET["cdid"];
    // wanneer de actie is wijzigen, wordt de volgende code uitgevoerd  
    if ($_GET["actie"] == "wijzigen" && $cdid) 
    { 
    $sql = "SELECT *
            FROM Cd
             WHERE  CD_ID ='$cdid'";
    $resultaat = mysql_query( $sql ) or die (mysql_error());  
    $aantalRijen = mysql_num_rows($resultaat);
    
    if ($aantalRijen == 0)
    {
        // Er zijn nul rijen &#8211; geen gevonden cd`s dus
        echo '<p>Er zijn geen cds gevonden.</p>';
    }
    else
    {
        // Haal steeds een gevonden tabelrij op en verwerk
        // deze per stuk.   
        while ($rij = mysql_fetch_array($resultaat)) 
    
        {
        //  $genre              = $rij['Naam']; // controleren als het fout gaat EV uitzetten
            $titel              = $rij['Titel'];
            $artiest            = $rij['Artiest'];
            $verschijningsjaar  = $rij['Verschijningsjaar'];
        }
    }
    }
    if(isset($_POST['update']))
    {
            $cdid                   = $_GET['CD_ID'];
        //  $genre                  = $_POST['Naam']; //controleren als het fout gaat EV uitzetten
            $verschijningsjaar      = $_POST['Verschijningsjaar'];
            $titel                  = $_POST['Titel'];
            $artiest                = $_POST['Artiest'];
            
            // $cdid = $_GET["cdid"];
            
            $sql = "UPDATE Cd SET 
            Titel = '$titel', 
            Artiest = '$artiest',  
            Verschijningsjaar = '$verschijningsjaar'  
            WHERE CD_ID ='$cdid'";
            
            $resultaat = mysql_query( $sql ) or die (mysql_error());  
    
        echo"De wijziging is uitgevoerd";
        echo "&nbsp; &nbsp; <a href=\"admin_overzicht.php\"> klik hier om terug te gaan naar het overzicht</a>";    
    }
    else
    {   
        echo"
        <form name='update' action='' method='post'>
            <table>
                    <tr>
                        <td>Titel:</td> 
                        <td><input type='text' name='titel' value='$titel'></td>
                    </tr>   
                    <tr>
                        <td>Artiest:</td> 
                        <td><input type='text' name='artiest' value='$artiest'></td>
                    </tr>
                    <tr>
                        <td>Verschijningsjaar:</td> 
                        <td><input type='text' name='verschijningsjaar' value='$verschijningsjaar'</td>
                    </tr>                                                       
                                        
                </tr>                    
                <tr>
                    <td>
                    </td>
                    <td><input type='submit' name='update' value='update'></td>
                </tr>
            </table>
        </form>";
    
}
?>
    
<?php
    
    include ('html_footer.php');
    include ('php_footer.php');
    
?>


Hartelijk bedankt,

ULT

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Wat gebeurt er als je die query die je wilt uitvoeren echo-ed en handmatig draait? En zet je error reporting eens aan :)

[ Voor 18% gewijzigd door BtM909 op 09-06-2009 12:12 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20-09 00:16

Matis

Rubber Rocket

PHP:
1
if ($_GET["actie"] == "wijzigen" && $cdid)


Wat doet die && voor $cdid, zet daar eens isset($cdid) of !empty($cdid) voor in de plaats.

-snip

Edit:

PHP:
1
2
3
$sql = "SELECT *
            FROM Cd
             WHERE  CD_ID ='$cdid'";


Is je $cdid een varchar of een int? Anders kan het daar ook fout op gaan!

Edit2:

Ik zie net dat het daar helemaal niet om gaat, in het vervolg graag relevante code (of hang ik nu een modder uit O-) ) JA! :+

Waar krijgt hij in g*dsnaam zn cdid vandaan?

PHP:
1
$cdid                     = $_GET['CD_ID'];


Er wordt toch niets geget in een post action?

[ Voor 76% gewijzigd door een moderator op 09-06-2009 12:19 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • ultimatia
  • Registratie: November 2007
  • Laatst online: 22-06 22:00
Als ik de update query in een echo toon krijg ik het volgende te zien
De wijziging UPDATE Cd SET Titel = '', Artiest = '', Verschijningsjaar = '' WHERE CD_ID ='' is uitgevoerd

De nieuwe waardes vult hij dus niet in.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Omdat $_POST['Titel'] niet bestaat, want je gebruikt geen hoofdletters in je HTML. $_POST['titel'] dus.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20-09 00:16

Matis

Rubber Rocket

HuHu schreef op dinsdag 09 juni 2009 @ 12:15:
Omdat $_POST['Titel'] niet bestaat, want je gebruikt geen hoofdletters in je HTML. $_POST['titel'] dus.
Ook, en in zijn inputtype staat het tussen singleqoutes. AFAIK moeten dit dus dubbel quotes zijn, en dan nog de hoofdletters (is dat niet alleen in linux zo O-) )

HTML:
1
2
3
<input type="text" name="titel" value="lala">
en dus niet
<input type='text' name='titel' value='lala'>


Hmm, de parser slikt het dus wel |:(

[ Voor 9% gewijzigd door Matis op 09-06-2009 12:22 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 21:50
Matis schreef op dinsdag 09 juni 2009 @ 12:11:
Er wordt toch niets geget in een post action?
Je kan een POST doen naar een url waar een querystring in zit. volgens mij gebeurt dat hier ook.

Acties:
  • 0 Henk 'm!

  • ultimatia
  • Registratie: November 2007
  • Laatst online: 22-06 22:00
@ Huhu & Matis2
De gegevens titel, artiest en verschijningsjaar moeten wel met hoofdletters. Zo staan ze ook in database
Als ik dat niet doe vindt hij de waarde niet.
De dubbele quotes maken volgens mij ook niets uit. Zal het in elk geval proberen

@Matis1 ik zal nog even kijken wat je bedoelt :p

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
En controleer met mysql_affected_rows() hoeveel records er zijn bijgewerkt. De aanname dat het altijd goed gaat, is de grootste fout die je kunt maken. Dat de query technisch lukt, zegt niets over het bijwerken van records, alleen iets over het feit dat de query is uitgevoerd.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:52

MueR

Admin Tweakers Discord

is niet lief

Toch hebben ze gelijk ultimatia. PHP maakt wel degelijk onderscheid tussen lower-case en upper-case.
PHP:
1
2
3
4
5
// Vanuit dit html form:
// <input type="text" name="Titel" value="lala">
echo $_POST['Titel']; // returns: lala
// <input type="text" name="titel" value="lala">
echo $_POST['Titel']; // returns: --empty--

Kortom, je post keys moeten gelijk zijn aan de field names. Hoe het in de database heet maakt geen drol uit, zolang je de juiste variabelen maar gebruikt in je query.

Overigens, $_GET parameters werken ook gewoon in een post hoor. Waar mensen die onzin vandaan halen :?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20-09 00:16

Matis

Rubber Rocket

ultimatia schreef op dinsdag 09 juni 2009 @ 12:22:
@Matis1 ik zal nog even kijken wat je bedoelt :p
Ik reageerde op iets anders in mijn 1e post, maar dat is nu redelijk irrelevant.

@Rutgerw, je hebt gelijk. Ik baseerde me alleen op de broncode, waar de action value dus leeg bleef. Mooier zou zijn als je daar dus netjes je waardes vult. Nu kun je alle cd's wijzigen door de header opnieuw te sturen en alleen het id in de url te wijzigen. Een beetje exploit dus.

Daarnaast moeten singlequotes om de cdid volgens mij weg.
ultimatia schreef op dinsdag 09 juni 2009 @ 12:22:
@ Huhu & Matis2
De gegevens titel, artiest en verschijningsjaar moeten wel met hoofdletters. Zo staan ze ook in database
Dat is kul, al noem je hem in php waardediehelemaalnietindedatabasevoorkomt, maar als je die variabele koppelt aan een kolom die wel voorkomt in je tabel, dan is er niets aan de hand. ;)

@MueR, je hebt gelijk. Alleen (zoals ik al zeg), baseerde ik me op de broncode en niet op de werkelijke *live* website!

[ Voor 5% gewijzigd door Matis op 09-06-2009 12:30 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
ultimatia schreef op dinsdag 09 juni 2009 @ 12:22:
@ Huhu & Matis2
De gegevens titel, artiest en verschijningsjaar moeten wel met hoofdletters. Zo staan ze ook in database
Als ik dat niet doe vindt hij de waarde niet.
De dubbele quotes maken volgens mij ook niets uit. Zal het in elk geval proberen

@Matis1 ik zal nog even kijken wat je bedoelt :p
Als het met hoofdletters moet is je HTML dus fout, want daar staat het met kleine letters.

Wat Matis bedoelt is dat je in HTML eigenlijk name="Titel" moet doen en geen name='Titel', maar dat maakt niet zo heel veel uit voor dit probleem.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
MueR schreef op dinsdag 09 juni 2009 @ 12:27:

Overigens, $_GET parameters werken ook gewoon in een post hoor. Waar mensen die onzin vandaan halen :?
Geen idee. Als je zijn live voorbeeld bekijkt zie je gewoon de juist GET parameter in de URL staan. Aangezien de action leeg is wordt die dus overgenomen in het volgende request.

Acties:
  • 0 Henk 'm!

  • ultimatia
  • Registratie: November 2007
  • Laatst online: 22-06 22:00
cariolive23 schreef op dinsdag 09 juni 2009 @ 12:25:
En controleer met mysql_affected_rows() hoeveel records er zijn bijgewerkt. De aanname dat het altijd goed gaat, is de grootste fout die je kunt maken. Dat de query technisch lukt, zegt niets over het bijwerken van records, alleen iets over het feit dat de query is uitgevoerd.
Ik heb er een mysql_affected_rows check tussen geplakt
Je hebt inderdaad gelijk

Wanneer ik op update druk krijg ik de melding Er zijn geen cds gevonden.
Hier zit waarschijnlijk iets fout.

@ MueR en mattis, ik zal even kijken ^^

Acties:
  • 0 Henk 'm!

Verwijderd

ultimatia schreef op dinsdag 09 juni 2009 @ 12:22:
@ Huhu & Matis2
De gegevens titel, artiest en verschijningsjaar moeten wel met hoofdletters. Zo staan ze ook in database
Als ik dat niet doe vindt hij de waarde niet.
De dubbele quotes maken volgens mij ook niets uit. Zal het in elk geval proberen

@Matis1 ik zal nog even kijken wat je bedoelt :p
Wat zij bedoelen is dat je form met kleine letters meegeeft en jij met een hoofdletter uit de $_POST var probeert te halen. Dat heeft niks met de database structuur te maken. Je had op z'n minst ff een echo kunnen maken van $_POST of iets dergelijks, dan komen zulke problemen vanzelf naar voren. Sowieso is het niet fout om input te controleren: isset/empty.

En zoals eerder vermeldt, dat de query goed gaat zegt niets over het aantal rijen dat is gemodificeerd.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20-09 00:16

Matis

Rubber Rocket

HuHu schreef op dinsdag 09 juni 2009 @ 12:31:
[...]

Geen idee. Als je zijn live voorbeeld bekijkt zie je gewoon de juist GET parameter in de URL staan. Aangezien de action leeg is wordt die dus overgenomen in het volgende request.
Ja, alleen denk ik dat MueR het een slecht design vind. Netter is het om de CDID in een hidden value mee te geven (of een readonly text input).

Een Get is zo gevoelig en IMO niet netjes. Het staat zo rommelig in de urlbalk als daar een hele zwik data voorbij komt :) /smaak

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

HuHu schreef op dinsdag 09 juni 2009 @ 12:15:
Omdat $_POST['Titel'] niet bestaat, want je gebruikt geen hoofdletters in je HTML. $_POST['titel'] dus.
PHP is wat dat betreft case insensitive naar mijn weten.
Matis schreef op dinsdag 09 juni 2009 @ 12:19:
[...]


Ook, en in zijn inputtype staat het tussen singleqoutes. AFAIK moeten dit dus dubbel quotes zijn, en dan nog de hoofdletters (is dat niet alleen in linux zo O-) )

HTML:
1
2
3
<input type="text" name="titel" value="lala">
en dus niet
<input type='text' name='titel' value='lala'>


Hmm, de parser slikt het dus wel |:(
Uiteraard slikt de parser dat, een enkele quote is namelijk gewoon toegestaan daarvoor in HTML. :) Het is net wat je zelf het fijnste vind in gebruik, ik vind zelf dubbele quote ook mooier.

@TS:
PHP:
1
2
3
$cdid = $_GET["cdid"]; 
// En even later heb je
echo "<form name='update' action='' method='post'>";
Je POST je formulier en wil via GET je waardes ophalen. Dat gaat niet lukken. GePOSTte waardes kan je via $_POST ophalen en via GET (in de URL) met $_GET. Ook zou ik de action invullen, die is voor (x)HTML verplicht.

Lees je trouwens ook eens in over SQL Injection, want je query is op deze wijze ook niet lekker.
Verwijderd schreef op dinsdag 09 juni 2009 @ 12:32:
Wat zij bedoelen is dat je form met kleine letters meegeeft en jij met een hoofdletter uit de $_POST var probeert te halen. Dat heeft niks met de database structuur te maken. Je had op z'n minst ff een echo kunnen maken van $_POST of iets dergelijks, dan komen zulke problemen vanzelf naar voren. Sowieso is het niet fout om input te controleren: isset/empty.

En zoals eerder vermeldt, dat de query goed gaat zegt niets over het aantal rijen dat is gemodificeerd.
Als je de output van de query bekijkt, zie je dat de variabelen die geupdate moeten worden leeg zijn. Hoofdlettergevoeligheid veranderd daar niets aan. :+

Nog even de ge-echo'd query:
UPDATE Cd SET Titel = '', Artiest = '', Verschijningsjaar = '' WHERE CD_ID =''
Even verwoord: Update tabel CD, zet titel=leeg, artiest=leeg en verschijningsjaar is leeg, waar CD_ID=leeg? ;) Ik denk dat SQL normalisatie ook al bergen ergernis kan schelen.

[ Voor 50% gewijzigd door CH4OS op 09-06-2009 12:52 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:52

MueR

Admin Tweakers Discord

is niet lief

Matis schreef op dinsdag 09 juni 2009 @ 12:33:
Ja, alleen denk ik dat MueR het een slecht design vind. Netter is het om de CDID in een hidden value mee te geven (of een readonly text input).
Slecht design heeft er niks mee te maken. Of je nu een GET, rewritten url of een hidden input prefereert is enkel persoonlijke smaak. Er waren hier een of twee mensen die aan het betwijfelen waren of GET parameters werken, daar reageer ik op. Meer niet.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20-09 00:16

Matis

Rubber Rocket

MueR schreef op dinsdag 09 juni 2009 @ 13:11:
[...]

Slecht design heeft er niks mee te maken. Of je nu een GET, rewritten url of een hidden input prefereert is enkel persoonlijke smaak. Er waren hier een of twee mensen die aan het betwijfelen waren of GET parameters werken, daar reageer ik op. Meer niet.
Oh, dan interpreteerde ik het fout, natuurlijk werkt een GET wel als je ook POST gegevens hebt, ik had alleen niet gezien dat de URL ook daadwerkelijk gegevens bevatte die dmv een get uitgelezen konden worden. Het was overzichtelijker geweest als de TS in zijn action value de eventuele cdid value mee zou geven. Ik had op dat moment ook nog geen site gezien; Baseerde me alleen op de broncode!

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • ultimatia
  • Registratie: November 2007
  • Laatst online: 22-06 22:00
Iedereen bedankt!

Ik heb alle sugesties aangepast in het script, alleen ik blijf met het probleem zitten.
Als het goed is krijgen jullie nu de melding Er zijn geen cds gevonden. als jullie proberen iets daadwerkelijk te wijzigen. Volgens mij zit hier de fout dus ook ergens. Hij draait de querie wel, maar er is geen rij om deze echt uit te kunnen voeren.

@Gjtje wat bedoel je met "Ik denk dat SQL normalisatie ook al bergen ergernis kan schelen." ?
Dat mijn querie niet deugd? Ik heb het de tabellen wel genormaliseerd.

Mvg ULT

Edit 1
Hmm, een update querie hoort ook geen cd terug te geven.
De mysql_num_rows check kan er dus weer uit.

Dan blijft de fout dus ergens anders inzitten.

Edit 2
Het resultaat van de querie is nu als volgt na een update.
De wijziging UPDATE Cd SET Titel = 'GRrrrrOM', Artiest = 'Dragonforce', Verschijningsjaar = '2007' WHERE CD_ID ='' is uitgevoerd

Het lijkt er nu dus op dat hij hem volgens mij wel correct uitvoerd. Toch wijzigd hij ze nog steeds niet echt.

[ Voor 30% gewijzigd door ultimatia op 09-06-2009 13:37 ]


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Je query is nog niet helemaal goed, welk record (die je in je where clausule uniek maakt met CD_ID) moet er worden geupdate? :) Bekijk ook even de PHP manual: mysql_num_rows en mysql_affected_rows voor het verschil tussen beide functies.

offtopic:
Dragonforce, leuke band. :)

[ Voor 11% gewijzigd door CH4OS op 09-06-2009 13:40 ]


Acties:
  • 0 Henk 'm!

  • ultimatia
  • Registratie: November 2007
  • Laatst online: 22-06 22:00
GJtje schreef op dinsdag 09 juni 2009 @ 13:40:
Je query is nog niet helemaal goed, welk record (die je in je where clausule uniek maakt met CD_ID) moet er worden geupdate? :) Bekijk ook even de PHP manual: mysql_num_rows en mysql_affected_rows voor het verschil tussen beide functies.
Klopt, ik zie het nu ook, bij de WHERE CD_ID ='$cdid'"; gaat het nog verkeerd
Ik zal nog even zoeken :p

offtopic:
Dacht ik ook :p

Acties:
  • 0 Henk 'm!

  • ultimatia
  • Registratie: November 2007
  • Laatst online: 22-06 22:00
Hij doet het!!

Denk dat de grootste fout die ik heb gemaakt was dat ik twee keer dezelfde variabelen heb aangemerkt met verschillende outputs.

Iedereen bedankt,
Pagina: 1