Probleem met het updaten van een nieuwsbericht.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Thomas R

Thomas R

18/04/2012 16:27:36
Quote Anchor link
Hallo allemaal,

ben al een tijdje de website aan het updaten, en ben aangekomen bij een script waarmee je gemakkelijk de nieuwsberichten kunt beheren, die in de database staan.
Mijn probleem is simpel, als ik een nieuw item toe voeg, geen probleem. Wil ik dat item gaan verwijderen of bewerken, dan bewerkt/verwijdert het script wel een nieuwsitem, maar niet de juiste. Hij bewerkt/verwijdert het nieuwsitem uit de database wat het laagste id heeft en niet het id van het item wat ik bewerk/verwijder. Iemand oplossingen?

Het is zelf gemaakt, het script staat hieronder.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
session_start();
ini_set('error_reporting', E_ALL);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title></title>
    </head>
    <body>
        <?php
        if($_SESSION['adminlogin'] == "1")
        {
            
            $sql = mysql_query("SELECT *, DATE_FORMAT(datum, '%d/%m/%Y') AS plaatsdatum FROM smash_nieuws ORDER BY id DESC") or die(mysql_error());
            
            while($row=mysql_fetch_array($sql))
            {

                if(isset($_POST["save".$row['id']]))
                {

                    $delen = explode("/", $_POST['plaatsdatum']);
                    $plaatsdatum = $delen[2] . '-' . $delen[1] . '-' . $delen[0];
                    
                    $sql2="UPDATE smash_nieuws SET datum='".$plaatsdatum."', naam='".$_POST['naam']."', tekst='".$_POST['tekst']."' WHERE id='".$row['id']."'";
                    @
mysql_query($sql2) or die(mysql_error());

                    $succes="<font style='color: green; font-weight: bold;'>Het nieuwsitem is met succes opgeslagen.</font>".$row['naam']." ".$row['id'];
                }

                
                if(isset($_POST["delete".$row['id']]))
                {

                    $sql3="DELETE FROM smash_nieuws WHERE id='".$row['id']."' AND naam='".$row['naam']."'";
                    @
mysql_query($sql3) or die(mysql_error());
                    
                    $succes="<font style='color: green; font-weight: bold;'>Het nieuwsitem is met succes verwijderd.</font>".$row['naam']." ".$row['id'];
                }
            }

            
            if(isset($_POST['add']) && !empty($_POST['n-plaatsdatum']) && !empty($_POST['n-naam']) && !empty($_POST['n-tekst']))
            {

                $ndelen = explode("/", $_POST['n-plaatsdatum']);
                $nplaatsdatum = $ndelen[2] . '-' . $ndelen[1] . '-' . $ndelen[0];
                    
                $sql4="INSERT INTO smash_nieuws SET datum='".$nplaatsdatum."', naam='".$_POST['n-naam']."', tekst='".$_POST['n-tekst']."'";
                @
mysql_query($sql4) or die(mysql_error());
                
                $succes="<font style='color: green; font-weight: bold;'>Het nieuwsitem is succesvol toegevoegd!</font>";
                
                $_POST['n-plaatsdatum'] = "";
                $_POST['n-naam'] = "";
                $_POST['n-tekst'] = "";
            }

            ?>

            <form class="nieuws-bewerken" action="nieuws-bewerken.php" method="post">
                <a class="kop">Nieuws</a><br>
                <br>
                <table border="0" width="800">
                    <tr class="top">
                        <td align="left" width="600">
                            Naam: <input type="text" class="text" style="width: 300px;" value="<?php echo $_POST['n-naam']; ?>" name="n-naam">
                        </td>
                        <td width="200" align="right">
                            Datum: <input type="text" class="text" style="width: 75px;" value="<?php echo date("d/m/Y"); ?>" name="n-plaatsdatum">
                        </td>
                    </tr>
                    <tr class="bottom">
                        <td style="padding: 0px;" colspan="2">
                            <textarea class="nieuwsitem" onSelect="storeCaret(this);" onClick="storeCaret(this);" onKeyup="storeCaret(this);" onChange="storeCaret(this);" wrap="soft" cols="35" rows="6" name="n-tekst"><?php echo $_POST['n-tekst']; ?></textarea>
                        </td>
                    </tr>
                    <tr height="10">
                        <td></td>
                    </tr>                        
                    <tr height="35">
                        <td colspan="2" align="center">
                            <input type="submit" class="add" value="Toevoegen" onfocus="this.blur();" name="add">
                        </td>
                    </tr>
                    <tr height="20">
                        <td></td>
                    </tr>
                    <?php
                    $sql5
= mysql_query("SELECT *, DATE_FORMAT(datum, '%d/%m/%Y') AS plaatsdatum FROM smash_nieuws ORDER BY id DESC") or die(mysql_error());
                    
                    while($row=mysql_fetch_array($sql5))
                    {

                    ?>

                    <tr class="top">
                        <td align="left" width="600">
                            Naam: <input type="text" class="text" style="width: 300px;" value="<?php echo $row['naam']; ?>" name="naam"> <input type="hidden" name="id" value="<?php echo $row['id']; ?>">
                        </td>
                        <td width="200" align="right">
                            Datum: <input type="text" class="text" style="width: 75px;" value="<?php echo $row['plaatsdatum']; ?>" name="plaatsdatum">
                        </td>
                    </tr>
                    <tr class="bottom">
                        <td style="padding: 0px;" colspan="2">
                            <textarea class="nieuwsitem" onSelect="storeCaret(this);" onClick="storeCaret(this);" onKeyup="storeCaret(this);" onChange="storeCaret(this);" wrap="soft" cols="35" rows="6" name="tekst"><?php echo $row['tekst']; ?></textarea>
                        </td>
                    </tr>
                    <tr height="10">
                        <td></td>
                    </tr>
                    <tr height="35">
                        <td colspan="2" align="center">
                            <input type="submit" class="save" value="Opslaan" onfocus="this.blur();" name="save<?php echo $row['id']; ?>">&nbsp;&nbsp;&nbsp;<input type="submit" class="delete" value="Verwijderen" onfocus="this.blur();" onclick="javascript:return confirm('Weet u zeker dat u het geselecteerde nieuwsitem wilt verwijderen?')" name="delete<?php echo $row['id']; ?>">
                        </td>
                    </tr>
                    <tr height="20">
                        <td></td>
                    </tr>
                    <?php
                    }
                    ?>

                </table>
            </form>
        <?php
        }
        ?>

    </body>
</html>


Alvast hartstikke bedankt voor diegene die dit op kan lossen!
Gewijzigd op 18/04/2012 16:57:24 door Thomas R
 
PHP hulp

PHP hulp

25/04/2024 11:39:46
 
Donny Wie weet

Donny Wie weet

18/04/2012 16:47:25
Quote Anchor link
Je moet je code inkorten... En waarom Include je je stylesheet niet?
 
Thomas R

Thomas R

18/04/2012 16:50:49
Quote Anchor link
Fijn dat je zo snel reageert, maar ik vroeg niet om commentaar maar om een oplossing ;) Ik include die niet omdat ik nog niet klaar ben met het bijwerken van het script, zo kan ik de style altijd nog sneller wijzigen.
 
Donny Wie weet

Donny Wie weet

18/04/2012 16:55:03
Quote Anchor link
Thomas Roovers op 18/04/2012 16:50:49:
Fijn dat je zo snel reageert, maar ik vroeg niet om commentaar maar om een oplossing ;) Ik include die niet omdat ik nog niet klaar ben met het bijwerken van het script, zo kan ik de style altijd nog sneller wijzigen.


Ik kan je vertellen dat de meeste reacties van de profs beginnen met "kort even je code in", "haal even het CSS gedeelte weg" en etc. Dat dit niet de oplossing voor je probleem is zag ik ook nog wel in ;)
 
Thomas R

Thomas R

18/04/2012 16:56:32
Quote Anchor link
veel korter kan het php gedeelte trouwens niet volgens mij. en zal de css dan maar weghalen.
 
Frank WD

Frank WD

18/04/2012 17:05:08
Quote Anchor link
Je query is niet veilig voor SQL-Injection.
Gebruik altijd mysql_real_escape_string in je query.

Tevens is het gebruiken van or die() iets uit de middel eeuwen en word overal sterk afgeraden om deze te gebruiken. Je kunt beter een goede foutafhandeling gebruiken.
Zie voor een uitleg hier: Klik

Tevens zie ik op diverse query's staan SELECT * FROM. Ook dit is geen goede manier.
Je haalt hierbij alle velden op die in de database staan. Stel je hebt 10 velden in je DB, daarvan wil je er ma 4 ophalen. JE haalt nu dus 6x overbodige velden op wat extra overbodige geheugen van je server zal vragen. Je kan beter de velden op de plek van * benoemen die je nodig bent.

EDIT:
Voor je vraag. Bij het updaten of deleten van je gegevens kan je in je form action de id mee geven. iets als action="bewerk.php?id=1" In je update of delete query zet je dan weer: WHERE id = 1. Zo zul je de row met id 1 deleten of updaten.
Gewijzigd op 18/04/2012 17:14:38 door Frank WD
 
Thomas R

Thomas R

18/04/2012 17:07:36
Quote Anchor link
Frank WD op 18/04/2012 17:05:08:
Je query is niet veilig voor SQL-Injection.
Gebruik altijd mysql_real_escape_string in je query.

Tevens is het gebruiken van or die() iets uit de middel eeuwen en word overal sterk afgeraden om deze te gebruiken. Je kunt beter een goede foutafhandeling gebruiken.
Zie voor een uitleg hier: Klik

Tevens zie ik op diverse query's staan SELECT * FROM. Ook dit is geen goede manier.
Je haalt hierbij alle velden op die in de database staan. Stel je hebt 10 velden in je DB, daarvan wil je er ma 4 ophalen. JE haalt nu dus 6x overbodige velden op wat extra overbodige geheugen van je server zal vragen. Je kan beter de velden op de plek van * benoemen die je nodig bent.


Er staan 4 gegevens in de database en ik gebruik ze ook alle vier. Ik zal de rest eens doorlezen, maar opnieuw, dit is commentaar en ik wil graag hulp..
 
Frank WD

Frank WD

18/04/2012 17:11:57
Quote Anchor link
Zie mijn Edit van het eerste bericht.

Tevens is dit geen commentaar zoals jij dit ziet.
Dit is hulp bieden bij fouten in je codering, je wilt neem ik aan een code die goed is? Bij een code die goed is hoort ook overige commentaar op je code. Het overige commentaar geef ik jou in mijn vorige bericht.

Voor een oplossing zie mijn laatste toegevoegd stukje tekst.
Tevens ben ik van mening als je het bovenstaande weg schrijft als commentaar? Dan kan ik je niet verder helpen in het probleem.

EDIT:
Als je 4 velden hebt? Dan dien je deze alsnog voluit te schijven in je query.
Je dient dit zelf nog te doen als je 1,000 velden wilt selecteren in je query.
Gewijzigd op 18/04/2012 17:13:36 door Frank WD
 
Thomas R

Thomas R

18/04/2012 17:16:01
Quote Anchor link
Het is geen commentaar nee, mijn fout, en bedankt.

Jij bedoelt, als ik de while open, de <form> tag ook pas openen?
 
Frank WD

Frank WD

18/04/2012 17:26:25
Quote Anchor link
Als je een update of delete wilt doorvoeren op een row.
Ja dan zul je de id mee moeten geven aan je form. En dan zal deze ook in je While mee moeten.

Je kan het ook oplossen door een hidden input veld meen ik.
Maar als dat de manier is van alles? Dat denk ik persoonlijk weer niet.

Tevens zie ik dat je 3 query's heb in 1 pagina. Dit is normaal 'vind ik' niet de manier. Je kan beter verdelen in 3 pagina's: edit.php - toevoegen.php - delete.php
Dit is een persoonlijke mening, wellicht zal er een ander er anders over denken.

Het is geen commentaar nee, mijn fout, en bedankt.
Reden dat je het eerst ziet als commentaar weet ik ook wel. Je ziet het als commentaar omdat het niks toevoegt in het probleem die je hebt. Maar het is wel zeer relevant op je codering. Excusses hierbij aangenomen.
 
Thomas R

Thomas R

18/04/2012 17:29:18
Quote Anchor link
Frank, het probleem is opgelost, bedankt voor de hulp, heb na de while pas de <form> tag geopend en zo worden het allemaal verschillende forms.
Hieronder de code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php
session_start();
ini_set('error_reporting', E_ALL);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title></title>
    </head>
    <body>
        <?php
        if($_SESSION['adminlogin'] == "1")
        {
            
            if(isset($_POST["save"]))
            {

                $delen = explode("/", $_POST['plaatsdatum']);
                $plaatsdatum = $delen[2] . '-' . $delen[1] . '-' . $delen[0];
                
                $sql2="UPDATE smash_nieuws SET datum='".mysql_real_escape_string($plaatsdatum)."', naam='".mysql_real_escape_string($_POST['naam'])."', tekst='".mysql_real_escape_string($_POST['tekst'])."' WHERE id='".$_GET['id']."'";
                @
mysql_query($sql2) or die(mysql_error());

                $succes="<font style='color: green; font-weight: bold;'>Het nieuwsitem is met succes opgeslagen.</font>";
            }

                
            if(isset($_POST["delete"]))
            {

                $sql3="DELETE FROM smash_nieuws WHERE id='".$_GET['id']."'";
                @
mysql_query($sql3) or die(mysql_error());
            }

            
            if(isset($_POST['add']) && !empty($_POST['n-plaatsdatum']) && !empty($_POST['n-naam']) && !empty($_POST['n-tekst']))
            {

                $ndelen = explode("/", $_POST['n-plaatsdatum']);
                $nplaatsdatum = $ndelen[2] . '-' . $ndelen[1] . '-' . $ndelen[0];
                    
                $sql4="INSERT INTO smash_nieuws SET datum='".mysql_real_escape_string($nplaatsdatum)."', naam='".mysql_real_escape_string($_POST['n-naam'])."', tekst='".mysql_real_escape_string($_POST['n-tekst'])."'";
                @
mysql_query($sql4) or die(mysql_error());
                
                $_POST['n-plaatsdatum'] = "";
                $_POST['n-naam'] = "";
                $_POST['n-tekst'] = "";
            }

            
            if($sql2)
            {

            ?>

            <script>
            $(function() {
                var $succes = $('#succes');
                $succes.slideToggle("slow");
                
                setTimeout( function(){
                    $succes.slideToggle("slow");
                }, 2500);
        
            });
            </script>
            <?php
            }
            ?>

            <a class="kop">Nieuws</a><br>
            <br>
            <div id="succes" style="display: none;">
                <?php
                    echo $succes.'<br><br>';
                ?>

            </div>
            <table border="0" width="800">
                <form class="nieuws-bewerken" action="nieuws-bewerken.php" method="post">
                    <tr class="top">
                        <td align="left" width="600">
                            Naam: <input type="text" class="text" style="width: 300px;" value="<?php echo $_POST['n-naam']; ?>" name="n-naam">
                        </td>
                        <td width="200" align="right">
                            Datum: <input type="text" class="text" style="width: 75px;" value="<?php echo date("d/m/Y"); ?>" name="n-plaatsdatum">
                        </td>
                    </tr>
                    <tr class="bottom">
                        <td style="padding: 0px;" colspan="2">
                            <textarea class="nieuwsitem" onSelect="storeCaret(this);" onClick="storeCaret(this);" onKeyup="storeCaret(this);" onChange="storeCaret(this);" wrap="soft" cols="35" rows="6" name="n-tekst"><?php echo $_POST['n-tekst']; ?></textarea>
                        </td>
                    </tr>
                    <tr height="10">
                        <td></td>
                    </tr>                        
                    <tr height="35">
                        <td colspan="2" align="center">
                            <input type="submit" class="add" value="Toevoegen" onfocus="this.blur();" name="add">
                        </td>
                    </tr>
                    <tr height="20">
                        <td></td>
                    </tr>
                </form>
                <?php
                $sql5
= mysql_query("SELECT *, DATE_FORMAT(datum, '%d/%m/%Y') AS plaatsdatum FROM smash_nieuws ORDER BY id DESC") or die(mysql_error());
                
                while($row=mysql_fetch_array($sql5))
                {

                ?>

                <form class="nieuws-bewerken" action="nieuws-bewerken.php?id=<?php echo $row['id']; ?>" method="post">
                    <tr class="top">
                        <td align="left" width="600">
                            Naam: <input type="text" class="text" style="width: 300px;" value="<?php echo $row['naam']; ?>" name="naam">                        
                        </td>
                        <td width="200" align="right">
                            Datum: <input type="text" class="text" style="width: 75px;" value="<?php echo $row['plaatsdatum']; ?>" name="plaatsdatum">
                        </td>
                    </tr>
                    <tr class="bottom">
                        <td style="padding: 0px;" colspan="2">
                            <textarea class="nieuwsitem" onSelect="storeCaret(this);" onClick="storeCaret(this);" onKeyup="storeCaret(this);" onChange="storeCaret(this);" wrap="soft" cols="35" rows="6" name="tekst"><?php echo $row['tekst']; ?></textarea>
                        </td>
                    </tr>
                    <tr height="10">
                        <td></td>
                    </tr>
                    <tr height="35">
                        <td colspan="2" align="center">
                            <input type="submit" class="save" value="Opslaan" onfocus="this.blur();" name="save">&nbsp;&nbsp;&nbsp;<input type="submit" class="delete" value="Verwijderen" onfocus="this.blur();" onclick="javascript:return confirm('Weet u zeker dat u het geselecteerde nieuwsitem wilt verwijderen?')" name="delete">
                        </td>
                    </tr>
                    <tr height="20">
                        <td></td>
                    </tr>
                </form>
                <?php
                }
                ?>

            </table>
        <?php
        }
        ?>

    </body>
</html>

[size=xsmall][i]Toevoeging op 18/04/2012 17:31:49:[/i][/size]

Ik heb het eerst inderdaad met een hidden field geprobeert, maar dit wertke dus niet.

Ik houd het trouwens allemaal op n pagina omdat dit voor de gebruiker van het script veel duidelijker is, geen weergave verandering of zoiets.

Alles op n pagina en gelijk de wijzigen zien die je doorvoert lijkt me beter toch?
 
Frank WD

Frank WD

18/04/2012 17:32:52
Quote Anchor link
Mooi dat het is opgelost.

Hoop alleen dat je ook wat doet met de overige tips.
Succes er mee.
 
Thomas R

Thomas R

18/04/2012 17:33:32
Quote Anchor link
Ik heb het eerst inderdaad met een hidden field geprobeert, maar dit wertke dus niet.

Ik houd het trouwens allemaal op één pagina omdat dit voor de gebruiker van het script veel duidelijker is, geen weergave verandering of zoiets.

Alles op één pagina en gelijk de wijzigen zien die je doorvoert lijkt me beter toch?

Toevoeging op 18/04/2012 17:34:33:

nog één vraagje, als je iets update of insert in de database moet je dus altijd, voor alles, mysql_real_escape_string zetten?
 
Obelix Idefix

Obelix Idefix

18/04/2012 18:07:12
Quote Anchor link
Voor bijna alles.
Als je goed controleert of iets een getal is, hoef je daar niet perse mysql_real_escape_string over heen te zetten. Een wachtwoord (uiteraard gecodeerd / met zout en peper) hoeft ook niet.
 
Frank WD

Frank WD

18/04/2012 18:21:41
Quote Anchor link
Bij een INSERT of UPDATE moet je wegens SQL-injection altijd die mysql_real_escape_string voor gebruiken idd.

Iets in de geest als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$query
= ("INSERT INTO
        table
    (
        veld_1,
        veld_2,
        veld_3.
        veld_4
    )
    VALUES
    (
        '"
.mysql_real_escape_string($_POST['veld_1'])."',
        '"
.mysql_real_escape_string($_POST['veld_2'])."',
        '"
.mysql_real_escape_string($_POST['veld_3'])."',
        '"
.mysql_real_escape_string($_POST['veld_4'])."'
    )"
);
?>


Het opvragen van je gegevens van de gevens gebruik je verder niks in je query.
Alleen bij het echoén van je rows zul je deze weer moeten omzetten. Dit doe je met html

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
echo '    
    '
. htmlspecialchars($row['veld_1']).'<br />
    '
. htmlspecialchars($row['veld_2']).'<br/>
    '
. htmlspecialchars($row['veld_3']).'<br />
    '
. htmlspecialchars($row['veld_4']).' ';
?>


Alles op één pagina en gelijk de wijzigen zien die je doorvoert lijkt me beter toch?
Ik zal voor deze opzet kiezen persoonlijk:
+---------------------------------+
| Overzicht alle nieuws berichten |
+-------+----------+-----------+
| Titel 1 | Edit-icon | Dele-icon |
+-------+----------+-----------+
| Titel 2 | Edit-icon | Dele-icon |
+-------+----------+-----------+
| Titel 3 | Edit-icon | Dele-icon |
+-------+----------+----------+

Je hebt dan de volgende pagina's als waarde:
Toevoeg.php: Voor het toevoegen van een nieuw Nieuws Bericht
Overzicht.php: Voor het tonen alle rows op Nieuws Titel
edit.php: Voor het UPDATE van een Nieuws Bericht.
delete.php: Voor het verwijderen van een Nieuws Bericht

Op deze manier hou je alles apart van elkaar.
Gewijzigd op 18/04/2012 18:26:34 door Frank WD
 
Thomas R

Thomas R

18/04/2012 19:21:02
Quote Anchor link
Waarom moet je bij het selecteren van de gegevens uit de tabel, ook weer htmlspecialchars gebruiken?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.