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

[PHP/MySQL] Delete functioneert niet (meer) naar behoren

Pagina: 1
Acties:

  • MoiZie
  • Registratie: Februari 2004
  • Laatst online: 12:02
Ik heb een eigen gecode , zeer basaal, lootjes / cadeautjes / lijstjes site gemaakt, waarin gebruikers cadeau's kunnen verwijderen en toevoegen aan hun verlanglijstje. Dit voor intern gebruik in de familie :) Het heeft eigenlijk altijd gewerkt, maar met het oog op de naderende feestdagen heb ik besloten om 1 en ander te testen. Wat blijkt, toevoegen van cadeau's aan de database werkt nog steeds, echter de verwijder functie is kapot?? Ik heb er nu een middagje naar zitten turen, maar kom er niet uit. De functie 'delete from personen where id='2354' and naam='user'; in PHPMyAdmin werkt prima, dus dat lijkt me qua rechten (dezelfde mysql user uiteraard) in orde..

Iemand die mij kan vertellen welke semicolon ik verkeerd heb staan opeens?

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
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title>Hier staan de lijstjes van andere mensen</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
        <link rel="stylesheet" type="text/css" href="style.css" />


<script LANGUAGE="JavaScript">
<!--
function confirmSubmit()
{
var agree=confirm("Weet je zeker dat je dit cadeau wil verwijderen?");
if (agree)
    return true ;
else
    return false ;
}
// -->
</script>   

    </head>

<body>
    <h2>Hoi, dit is een sinterklaaslijstjessite</h2>


    <a href="../sinterklaas/">Ik wil terug naar het begin</a>
    <br />
    <br />
        Hier kan je de lijstjes van andere personen opvragen!

<?php
        $form = '<form id="form" action="lijstje.php" method="post" action="javascript:alert(\'submit\');">
                    Naam: <select name="naam2" size="5" onchange="document.getElementById(\'form\').submit();"/>

5 options met values

                    <input type="hidden" />
                    </form>';
        echo $form;



//verbinding met database
$con = mysql_connect("bla");
if (!con)
    {
    die('Geen verbinding: ' . mysql_error());
    }

//selecteer database
mysql_select_db("sinterklaas", $con);

$result = mysql_query("select * from personen where naam='" . mysql_real_escape_string($_POST['naam2']) . "' ORDER BY cadeau asc");

if (!$result)
    {
    die('Error: '. mysql_error());
    }

//definieer de tabel en wat erin moet

?>

<table>
    <tr>
        Lijstje van <b> <?php echo $_POST["naam2"]; ?></b>
    </tr>
    <tr>
        <td>
<?php
$naam3 = $_POST["naam2"];
?>
<form name="form1" method="post" action="lijstje.php"> 
<input name="delete" type="submit" id="delete" value="Delete" onClick="return confirmSubmit()">
<input type="hidden" name="naam2" value="<?php echo $naam3; ?>"/>

        </td>
        <td>
            <b>Cadeau</b>
        </td>
        <td>
            <b>Prijs</b>
        </td>
        <td>
            <b>Winkel</b>
        </td>
    </tr>

<?php
// wat moet in de tabel

while($row = mysql_fetch_array($result))
    {
        echo "<tr>";
        echo "<td>";
    ?>
        <input name="del" type="radio" id="radio" value="<? echo $row['id']; ?>">
    <?php
        echo "</td>";
        echo "<td>";
        echo $row ['cadeau'];
        echo "</td>";
        echo "<td>";
        echo '&euro; ', $row ['prijs'];
        echo "</td>";
        echo "<td>";
        echo $row ['winkel'];
        echo "</td>";
        echo "</tr>";
    }
?>
    </form>
</table>
<?php
$delete = mysql_query("delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'");
// $delid = $_POST['del'];
// echo $delid;
// echo mysql_query( $delid ) or die(mysql_error() );
// stop mysql
// echo mysql_affected_rows();
// echo mysql_error();
mysql_close($con);

//stop php
    
?>  
</body>
</html>

  • _reboot_
  • Registratie: December 2004
  • Laatst online: 19-11 16:50
Regel 117: de apostrofs rondom sinterklaas.personen where id=
Als je deze verwijderd is je query ok.
Je kunt ook de query eerst in een variabel plaatsen, bijvoorbeeld: $sql
Dan kun je hem na de definitie echo-en.
en vervolgens uitvoeren: mysql_query($sql)

  • MoiZie
  • Registratie: Februari 2004
  • Laatst online: 12:02
Er stond inderdaad nog een ' extra in de zin. Ik heb
code:
1
$delete = mysql_query("delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'");

Veranderd in
code:
1
$delete = mysql_query("delete from sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'");


zonder effect. Of bedoelde je dat niet?

[ Voor 4% gewijzigd door MoiZie op 13-10-2013 17:50 ]


  • Tjesus
  • Registratie: Februari 2009
  • Laatst online: 20-11 10:05
Heb je niet een apostrof teveel? Einde van regel 117.

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

NMe

Quia Ego Sic Dico.

En wat heb je zelf al gedaan om te debuggen? Welke waardes zitten er in $_POST? Zijn dat écht de waardes die je verwacht dat erin zitten? Wat gebeurt er als je je query niet uitvoert maar echo't? Ziet hij er dan goed uit? Runt die óók gewoon zoals het hoort in phpMyAdmin? Als je onder of boven je query iets echo't, werkt dat dan of komt dat allemaal überhaupt niet in beeld?

Oftwel: debuggen, debuggen, debuggen. Jij kan dat, wij niet. ;) Zie ook Programming FAQ - Debuggen: hoe doe ik dat?
Tjesus schreef op zondag 13 oktober 2013 @ 17:59:
Heb je niet een apostrof teveel? Einde van regel 117.
Nope.

'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.


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Gewoon voor de zekerheid hoor, maar in je voorbeeld staat er // voor de regel die daadwerkelijk mysql_query uitvoert.

Verder, heb je het afgelopen jaar toevallig php en of mysql geüpgraded?

After all, we are nothing more or less than what we choose to reveal.


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

NMe

Quia Ego Sic Dico.

Devil schreef op maandag 14 oktober 2013 @ 17:41:
Gewoon voor de zekerheid hoor, maar in je voorbeeld staat er // voor de regel die daadwerkelijk mysql_query uitvoert.
Kijk eens naar regel 117. ;)

'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.


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

nvm ;)

After all, we are nothing more or less than what we choose to reveal.


  • borft
  • Registratie: Januari 2002
  • Laatst online: 21-11 11:31
haha er klopt geen hout van de query, er staan allemaal verkeerde quotes in. Afgezien daarvan, waarom zet je een id (wat waarschijnlijk een int is), als string tussen quotes in je query? Test anders eens wat de mysql_query() als resultaat geeft, kijk eens of er door mysql errors gegooid worden, en doe in hemslanaam eens goed escapen. Als je er dan per se op staat om de hopeloos verouderde procedurele interface van mysql te gebruiken, geef dan de actieve connectie mee aan mysql_real_escape_string(), zodat ie daadwerkelijk weet hoe ie moet escapen ;)

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

NMe

Quia Ego Sic Dico.

Er staat één extra quote in die de topicstarter al verwijderd heeft, twee quotes rondom het ID die geen effect mogen hebben op de werking van de query en de tip om de query zelf eens te echoën is al twee keer gegeven. Voor iemand die zo'n vervelend ondertoontje in zijn post heeft mag je wel iets beter lezen. :*

'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.


  • borft
  • Registratie: Januari 2002
  • Laatst online: 21-11 11:31
ok point taken ;) Ik zal iig beter lezen! Oveirgens was mijn tip niet om de query te echo-en, maar om het resultaat te checken, en zo nodig eventuele sql errors te echo-en (ik ben niet de enige die snel leest ;)

Wat constructiever dan:
1. je zou je query kunnen hershrijven naar een prepared statement, daardoor wordt het een stuk leesbaarder:
code:
1
$query = 'DELETE FROM sinterklaas.personen WHERE id = :id AND user = :user';

Let wel, hierna moet je nog wel je query preparen, de variabelen aan je statement binden, en de query executen.
2. of je kunt een sprintf gebruiken om de parameters erin te proppen
code:
1
2
3
$query = sprintf("DELETE FROM sinterklaas.personen WHERE id=%d AND user = '%s'",
mysql_real_escape_string($_POST['del'], $con),
mysql_real_escape_string($_POST[['naam2'], $con));


In beide gevallen geldt, check het resultaat van mysql_query(), en als dat niet true is, dan is er iets mis, eventueel kan je ook nog het aantal affected rows checken (dat moet 1). Overigens gebruik ik zelf uit gewoonte voor dit soort queries nagenoeg altijd een LIMIT 1 aan het eind, voor de zekerheid.

[ Voor 9% gewijzigd door borft op 16-10-2013 13:25 ]


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

borft schreef op woensdag 16 oktober 2013 @ 13:10:
haha er klopt geen hout van de query, er staan allemaal verkeerde quotes in. Afgezien daarvan, waarom zet je een id (wat waarschijnlijk een int is), als string tussen quotes in je query?
Die quotes rond die id is toevallig nou net hetgene dat een sql injection voorkomt in deze code. mysql_real_escape string toepassen op een variabele waarvan je aanneemt dat het een integer is en deze vervolgens zonder quotes in je query zetten is erg gevaarlijk als je niet ook checkt of het wel een int is (of expliciet cast). Stel dat je geen quotes zou gebruiken en iemand post als id "0 = 0".

mysql_escape_string vindt dat prima, want er staat geen ongeldige karakters in die geescaped moeten worden. Vervolgens wordt je query dan "DELETE FROM x WHERE id = 0 = 0". Probeer maar eens in phpMyadmin wat er dan gebeurt (ik zou trouwens select * gebruiken voor de test als je veel om je data geeft ;) )

Daarom is het beter om bij variabele waar je een int verwacht ook specifiek naar int te casten (via (int), inval(), of sprintf met %d ). Op die manier hoef je op die variabele ook geen mysql_real_escape_ te gebruiken.

Beveiliging is meer dan altijd rucksightlos alles door mysql_real_escape_string gooien.

[ Voor 3% gewijzigd door Devil op 16-10-2013 14:25 ]

After all, we are nothing more or less than what we choose to reveal.


  • eM.
  • Registratie: Mei 2010
  • Laatst online: 23-10 10:44

eM.

Regel 47 mist nog wat

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 21-11 21:44
Mja apart dat ie daar niet doodgaat...

Verder lees ik nergens dat de OP de query in PHP heeft laten echo-en, maar alleen dat een soortgelijke query in phpMyAdmin is getest (toch twee verschillende dingen). Je hebt namelijk de naam van de database voor de tabel in het script. Dus 'sinterklaas.personen' i.p.v. 'personen' of heet de tabel echt 'sinterklaas.personen'? In de query die je in phpMyAdmin stopt doe je dat niet en die loopt wel.

Verder vraag ik me af of dit "lijstje.php" is. Zo ja, is het dan niet vreemd dat de delete wordt uitgevoerd nadat het formulier (wederom) is opgebouwd? Dan lijkt het mij dat de verwijderde optie er weer tussen staat en vlak na de opbouw van het formulier pas verwijderd wordt... Maar misschien kijk ik te snel.

[ Voor 36% gewijzigd door Morrar op 16-10-2013 20:27 ]


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

NMe

Quia Ego Sic Dico.

Devil schreef op woensdag 16 oktober 2013 @ 14:23:
[...]

Die quotes rond die id is toevallig nou net hetgene dat een sql injection voorkomt in deze code. mysql_real_escape string toepassen op een variabele waarvan je aanneemt dat het een integer is en deze vervolgens zonder quotes in je query zetten is erg gevaarlijk als je niet ook checkt of het wel een int is (of expliciet cast). Stel dat je geen quotes zou gebruiken en iemand post als id "0 = 0".
Dan bokt je server omdat die query invalid is. ;) Persoonlijk gooi ik trouwens liever een int-cast over intvelden heen voordat ze in een query landen om precies deze reden. :)

'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.


  • 8088
  • Registratie: December 2000
  • Niet online

8088

NaN

Morrar schreef op woensdag 16 oktober 2013 @ 20:17:
Mja apart dat ie daar niet doodgaat...
Dat levert alleen een notice op. En een undefined constant evalueert naar true, dus gaat 'ie niet dood.

[ Voor 9% gewijzigd door 8088 op 16-10-2013 20:51 ]

Do you seek to engage in or have you ever engaged in terrorist activities, espionage, sabotage, or genocide?


  • MoiZie
  • Registratie: Februari 2004
  • Laatst online: 12:02
NMe schreef op zondag 13 oktober 2013 @ 18:39:
En wat heb je zelf al gedaan om te debuggen? Welke waardes zitten er in $_POST? Zijn dat écht de waardes die je verwacht dat erin zitten? Wat gebeurt er als je je query niet uitvoert maar echo't? Ziet hij er dan goed uit? Runt die óók gewoon zoals het hoort in phpMyAdmin? Als je onder of boven je query iets echo't, werkt dat dan of komt dat allemaal überhaupt niet in beeld?

Oftwel: debuggen, debuggen, debuggen. Jij kan dat, wij niet. ;) Zie ook Programming FAQ - Debuggen: hoe doe ik dat?


[...]

Nope.
Regel 119 t/m 123 laten zien wat ik heb geprobeerd te echo-en. Ik krijg op regel 119 de output Query was empty. Regel 121 geeft de output '0', dus kennelijk werkt de statement niet? Regel 122, dus echo mysql_error geeft geen output whatsoever.
Devil schreef op maandag 14 oktober 2013 @ 17:41:
Gewoon voor de zekerheid hoor, maar in je voorbeeld staat er // voor de regel die daadwerkelijk mysql_query uitvoert.

Verder, heb je het afgelopen jaar toevallig php en of mysql geüpgraded?
Niet specifiek een update gehad, maar wel de laatst beschikbare versie in Saucy (Ubuntu). Hoezo?
borft schreef op woensdag 16 oktober 2013 @ 13:10:
haha er klopt geen hout van de query, er staan allemaal verkeerde quotes in. Afgezien daarvan, waarom zet je een id (wat waarschijnlijk een int is), als string tussen quotes in je query? Test anders eens wat de mysql_query() als resultaat geeft, kijk eens of er door mysql errors gegooid worden, en doe in hemslanaam eens goed escapen. Als je er dan per se op staat om de hopeloos verouderde procedurele interface van mysql te gebruiken, geef dan de actieve connectie mee aan mysql_real_escape_string(), zodat ie daadwerkelijk weet hoe ie moet escapen ;)
Ik weet niet hoe ik de actieve connectie mee moet geven aan mysql_real_escape_string(). Dit is toch puur om rare input te escapen? Wat moet dat met een connectie doen?
borft schreef op woensdag 16 oktober 2013 @ 13:24:
ok point taken ;) Ik zal iig beter lezen! Oveirgens was mijn tip niet om de query te echo-en, maar om het resultaat te checken, en zo nodig eventuele sql errors te echo-en (ik ben niet de enige die snel leest ;)

Wat constructiever dan:
1. je zou je query kunnen hershrijven naar een prepared statement, daardoor wordt het een stuk leesbaarder:
code:
1
$query = 'DELETE FROM sinterklaas.personen WHERE id = :id AND user = :user';

Let wel, hierna moet je nog wel je query preparen, de variabelen aan je statement binden, en de query executen.
2. of je kunt een sprintf gebruiken om de parameters erin te proppen
code:
1
2
3
$query = sprintf("DELETE FROM sinterklaas.personen WHERE id=%d AND user = '%s'",
mysql_real_escape_string($_POST['del'], $con),
mysql_real_escape_string($_POST[['naam2'], $con));


In beide gevallen geldt, check het resultaat van mysql_query(), en als dat niet true is, dan is er iets mis, eventueel kan je ook nog het aantal affected rows checken (dat moet 1). Overigens gebruik ik zelf uit gewoonte voor dit soort queries nagenoeg altijd een LIMIT 1 aan het eind, voor de zekerheid.
Uhm, ik heb je sprintf query proberen te gebruiken, maar de pagina rendert dan helemaal niet meer. Ik gok dan ook op een verkeerd karakter ergens (naast de extra [ in je 3e regel)? Maar ik zie het niet...
Devil schreef op woensdag 16 oktober 2013 @ 14:23:
[...]


Die quotes rond die id is toevallig nou net hetgene dat een sql injection voorkomt in deze code. mysql_real_escape string toepassen op een variabele waarvan je aanneemt dat het een integer is en deze vervolgens zonder quotes in je query zetten is erg gevaarlijk als je niet ook checkt of het wel een int is (of expliciet cast). Stel dat je geen quotes zou gebruiken en iemand post als id "0 = 0".

mysql_escape_string vindt dat prima, want er staat geen ongeldige karakters in die geescaped moeten worden. Vervolgens wordt je query dan "DELETE FROM x WHERE id = 0 = 0". Probeer maar eens in phpMyadmin wat er dan gebeurt (ik zou trouwens select * gebruiken voor de test als je veel om je data geeft ;) )

Daarom is het beter om bij variabele waar je een int verwacht ook specifiek naar int te casten (via (int), inval(), of sprintf met %d ). Op die manier hoef je op die variabele ook geen mysql_real_escape_ te gebruiken.

Beveiliging is meer dan altijd rucksightlos alles door mysql_real_escape_string gooien.
Ik weet niet precies hoe ik een integer moet casten oid (of wat dat überhaupt is). Het is maar een simpele website, waarbij ik had begrepen dat ik met mysql_real_escape_string in ieder geval de eerste problematiek kon voorkomen. Ik wilde niet heel sinterklaas bezig zijn met het repareren van de lijstjes, simpelweg omdat een script de lijstjes omver gooide.
Oh, ik zou niet weten wat?
Morrar schreef op woensdag 16 oktober 2013 @ 20:17:
[...]


Mja apart dat ie daar niet doodgaat...

Verder lees ik nergens dat de OP de query in PHP heeft laten echo-en, maar alleen dat een soortgelijke query in phpMyAdmin is getest (toch twee verschillende dingen). Je hebt namelijk de naam van de database voor de tabel in het script. Dus 'sinterklaas.personen' i.p.v. 'personen' of heet de tabel echt 'sinterklaas.personen'? In de query die je in phpMyAdmin stopt doe je dat niet en die loopt wel.

Verder vraag ik me af of dit "lijstje.php" is. Zo ja, is het dan niet vreemd dat de delete wordt uitgevoerd nadat het formulier (wederom) is opgebouwd? Dan lijkt het mij dat de verwijderde optie er weer tussen staat en vlak na de opbouw van het formulier pas verwijderd wordt... Maar misschien kijk ik te snel.
De query in phpmyadmin is op vele manieren geprobeerd en werkt vrijwel altijd. Welke ik ook toepas in het php script, daar werkt het niet. Of ik nu sinterklaas.personen of personen gebruik staat daar (debug technisch) dus helaas los van.

En dit is inderdaad lijstje.php. Ik weet niet precies wat je bedoelt met volgorde van het verwijderen en opbouwen van het formulier. Mogelijk doel jij op een probleem, wat een mogelijke verklaring zou zijn voor de bug die al een tijdje bestond: na verwijderen van een item, moest de gebruiker het lijstje opnieuw openen om daadwerkelijk ook de verandering te zien. Bij de eerste refresh staat hij er namelijk nog steeds tussen (maar is wel verdwenen uit de database). Maar op dit moment kan ik helemaal niets verwijderen, een iets groter probleem.
NMe schreef op woensdag 16 oktober 2013 @ 20:21:
[...]

Dan bokt je server omdat die query invalid is. ;) Persoonlijk gooi ik trouwens liever een int-cast over intvelden heen voordat ze in een query landen om precies deze reden. :)
Dat is een beetje hocus pocus voor me, int-cast (iets met integers casten zoals Devil zei?) en query landen gaat wat voorbij aan mijn zeer basale PHP / SQL kennis. Ik was al trots dat ik zo ver ben gekomen. :+
8088 schreef op woensdag 16 oktober 2013 @ 20:45:
[...]

Dat levert alleen een notice op. En een undefined constant evalueert naar true, dus gaat 'ie niet dood.
Gelukkig werkt het dus desondanks nog steeds.

Ik waardeer alle hulp, volgens mij kijk ik over iets heel simpels heen, omdat het script (zoals ik al zei) tot voor kort heeft gewerkt en ik me niet kan herinneren dat ik iets veranderd heb (maar ik sluit niets uit!). Zou het dan een PHP / MySQL versie probleem zijn?

  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 15:38
Zet de query eens in een variabele en echo deze voordat je hem uitvoert

dus iets als: (mag je zelf even zorgen dat alle tekens goed staan)
PHP:
1
2
3
$query = "delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'";
echo $query;
mysql_query($query);


Kijk dan of de query correct is en of deze werkt in phpmyadmin (door hem te kopieren en plakken)

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Pfff, haal alsjeblieft een boek of tutorial erbij.

Extreem basic, maar voorkauwen:
PHP:
1
$delete = mysql_query("delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'");

Kan je als volgt debuggen:
PHP:
1
2
3
$query = "delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'";
$result = mysql_query($query);
var_dump($query, $result);

Zie je in 1 oogopslag de query en het resultaat. Vervolgens moet je wel direct de fout spotten cq. zien dat query af wijkt van wat je in PHPMyAdmin doet.

edit:
ARgh... :D En dat terwijl ik het topic eerdere negeerde in de hoop dat MoiZie zelf ontdekte hoe hij de query kon bekijken. 8)7


(voorbeeld code nog los van verdere good practices, connection meegeven aan functies, query string opbouw etc. etc.)

[ Voor 7% gewijzigd door Voutloos op 16-10-2013 21:28 . Reden: Ik word oud en traag ]

{signature}


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Voutloos schreef op woensdag 16 oktober 2013 @ 21:26:
Pfff, haal alsjeblieft een boek of tutorial erbij.

Extreem basic, maar voorkauwen:
PHP:
1
$delete = mysql_query("delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'");

Kan je als volgt debuggen:
PHP:
1
2
3
$query = "delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'";
$result = mysql_query($query);
var_dump($query, $result);

Zie je in 1 oogopslag de query en het resultaat. Vervolgens moet je wel direct de fout spotten cq. zien dat query af wijkt van wat je in PHPMyAdmin doet.

edit:
ARgh... :D En dat terwijl ik het topic eerdere negeerde in de hoop dat MoiZie zelf ontdekte hoe hij de query kon bekijken. 8)7


(voorbeeld code nog los van verdere good practices, connection meegeven aan functies, query string opbouw etc. etc.)
Die single quote heeft hij er al uit gehaald en dat was niet het probleem.

@ts: als je niet weet wat 'integer casting' betekend dan stop je dat even in Google en dan snap je binnen een paar minuten wat het is en wat het nut er van is (en hoe met doet)

After all, we are nothing more or less than what we choose to reveal.


  • MoiZie
  • Registratie: Februari 2004
  • Laatst online: 12:02
Ramon schreef op woensdag 16 oktober 2013 @ 21:25:
Zet de query eens in een variabele en echo deze voordat je hem uitvoert

dus iets als: (mag je zelf even zorgen dat alle tekens goed staan)
PHP:
1
2
3
$query = "delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'";
echo $query;
mysql_query($query);


Kijk dan of de query correct is en of deze werkt in phpmyadmin (door hem te kopieren en plakken)
Als ik dit doe, komt er een '1' op de pagina te staan. Ongeacht welk item ik wil verwijderen.
Voutloos schreef op woensdag 16 oktober 2013 @ 21:26:
Pfff, haal alsjeblieft een boek of tutorial erbij.

Extreem basic, maar voorkauwen:
PHP:
1
$delete = mysql_query("delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'");

Kan je als volgt debuggen:
PHP:
1
2
3
$query = "delete from 'sinterklaas.personen where id='" . mysql_real_escape_string($_POST['del']) . "' and naam='" . mysql_real_escape_string($_POST['naam2']) . "'";
$result = mysql_query($query);
var_dump($query, $result);

Zie je in 1 oogopslag de query en het resultaat. Vervolgens moet je wel direct de fout spotten cq. zien dat query af wijkt van wat je in PHPMyAdmin doet.

edit:
ARgh... :D En dat terwijl ik het topic eerdere negeerde in de hoop dat MoiZie zelf ontdekte hoe hij de query kon bekijken. 8)7


(voorbeeld code nog los van verdere good practices, connection meegeven aan functies, query string opbouw etc. etc.)
Flauwe opmerking. Ik ben niet te beroerd om zelf dingen uit te zoeken en te vinden, maar ik weet hier absoluut niet waar ik moet beginnen. En om nou een volledige niet-relevante tutorial te volgen voor een pruts-site die ik als 'omdat het kan' en 'het is leuk om te doen' site opgezet heb... En dan vele uren allerlei tutorials te doorgronden en sites te bouwen om 1 kleine fout te vinden? Noem me dan maar lui, maar dat doe ik niet. Wat ik wél wil doen, is de tutorial doornemen die mij leert welke fout ik nu hier gemaakt heb, zodat ik ten eerste de site kan repareren en ten tweede kan tonen dat ik wel degelijk moeite doe.

Los daarvan; je code geeft het resultaat bool(true) bool(false). Omdat de query als eerste staat in var dump, gok ik dat hij dezelfde '1' als het eerder genoemde voorbeeld als output krijgt en die als true ziet. Maar dat weet ik niet zeker. Waarom dan de var dump van $result een '0' zou zijn gaat mij te boven, geen errors dus of zo?

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

MoiZie schreef op woensdag 16 oktober 2013 @ 21:41:
[...]

Als ik dit doe, komt er een '1' op de pagina te staan. Ongeacht welk item ik wil verwijderen.

[...]

Flauwe opmerking. Ik ben niet te beroerd om zelf dingen uit te zoeken en te vinden, maar ik weet hier absoluut niet waar ik moet beginnen. En om nou een volledige niet-relevante tutorial te volgen voor een pruts-site die ik als 'omdat het kan' en 'het is leuk om te doen' site opgezet heb... En dan vele uren allerlei tutorials te doorgronden en sites te bouwen om 1 kleine fout te vinden? Noem me dan maar lui, maar dat doe ik niet. Wat ik wél wil doen, is de tutorial doornemen die mij leert welke fout ik nu hier gemaakt heb, zodat ik ten eerste de site kan repareren en ten tweede kan tonen dat ik wel degelijk moeite doe.

Los daarvan; je code geeft het resultaat bool(true) bool(false). Omdat de query als eerste staat in var dump, gok ik dat hij dezelfde '1' als het eerder genoemde voorbeeld als output krijgt en die als true ziet. Maar dat weet ik niet zeker. Waarom dan de var dump van $result een '0' zou zijn gaat mij te boven, geen errors dus of zo?
Als je echt echo $query; doet en het resultaat is 1 dan zit er iets totaal fout, want dan stuur je dus "1" naar de mysql server als query. Dat gaat natuurlijk nooit werken.

Dus of je volgt niet echt het voorbeeld, of je query klopt van geen kant.

In het voorbeeld wordt dus eerst de query ge-echoed en daarna pas $query naar mysql gestuurd. Volg precies dat voorbeeld en probeer vanuit daar te debuggen.

[ Voor 5% gewijzigd door Devil op 16-10-2013 21:47 ]

After all, we are nothing more or less than what we choose to reveal.


  • MoiZie
  • Registratie: Februari 2004
  • Laatst online: 12:02
Devil schreef op woensdag 16 oktober 2013 @ 21:45:
[...]

Als je echt echo $query; doet en het resultaat is 1 dan zit er iets totaal fout, want dan stuur je dus "1" naar de mysql server als query. Dat gaat natuurlijk nooit werken.

Dus of je volgt niet echt het voorbeeld, of je query klopt van geen kant.

In het voorbeeld wordt dus eerst de query ge-echoed en daarna pas $query naar mysql gestuurd. Volg precies dat voorbeeld en probeer vanuit daar te debuggen.
Ah! Ik ben een stapje verder. Ik heb bij het overnemen de fout gemaakt om na '$query =' door te gaan met mysql_query(".

Nu komt er inderdaad netjes een query uit;

code:
1
delete from sinterklaas.personen where id='' and naam='moizie'

Er wordt dus geen id meegegeven. Maar de user weer plukt hij wel uit de post. Dus dan zit het probleem ergens in de id die niet meegegeven wordt bij selectie van de radio button in de betreffende table row, lijkt me..

  • Slurpgeit
  • Registratie: November 2003
  • Laatst online: 22-11 21:27
Totaal unrelated, maar dit:

PHP:
1
Lijstje van <b> <?php echo $_POST["naam2"]; ?></b>


is kwetsbaar voor XSS (?naam2=<script>alert('xss')</script>). Dus iets als:

PHP:
1
Lijstje van <b> <?php echo htmlentities($_POST["naam2"], ENT_QUOTES); ?></b>


werkt beter.

Zelfde principe met dit stukje:

PHP:
1
2
3
4
5
6
<?php
$naam3 = $_POST["naam2"];
?>
<form name="form1" method="post" action="lijstje.php"> 
<input name="delete" type="submit" id="delete" value="Delete" onClick="return confirmSubmit()">
<input type="hidden" name="naam2" value="<?php echo $naam3; ?>"/>

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ik weet niet of het nou zo zinvol is om een hobby-bob die bezig is met een sinterklaaslijstje dat al niet hoogstaand geprogrammeerd in elkaar zit te wijzen op XSS....

verder m.b.t. het eerst moeten refreshen van de pagina om de verwijdering ook daadwerkelijk te zien (het "oude" probleem): php wordt gewoon van boven naar beneden, regel voor regel uitgevoerd... wat nu bij jou gebeurt is dat jij EERST met een query alle lijstjes-items ophaalt van een gebruiker... en DAARNA pas het item verwijderd.... in de EERSTE opvraging zit dit verwijderde item er dus nog gewoon bij.. het was toen immers nog niet verwijderd.... dit is simpel op te lossen door je delete-acties die nu helemaal onderaan in je script staan, bovenaan te zetten... zodat EERST het item wordt verwijderd en DAARNA pas de lijstjes-items worden opgevraagd...

met betrekking tot je missende ID.... kijk eens in de bron van je pagina of de <input radio> value wel een waarde bevat?

  • MoiZie
  • Registratie: Februari 2004
  • Laatst online: 12:02
P.O. Box schreef op woensdag 16 oktober 2013 @ 22:25:
ik weet niet of het nou zo zinvol is om een hobby-bob die bezig is met een sinterklaaslijstje dat al niet hoogstaand geprogrammeerd in elkaar zit te wijzen op XSS....

verder m.b.t. het eerst moeten refreshen van de pagina om de verwijdering ook daadwerkelijk te zien (het "oude" probleem): php wordt gewoon van boven naar beneden, regel voor regel uitgevoerd... wat nu bij jou gbeurt is dat jij EERST met een query alle lijstjes-items ophaalt van een gebruiker... en DAARNA pas het item verwijderd.... in de EERSTE opvraging zit dit verwijderde item er dus nog gewoon bij.. het was toen immers nog niet verwijderd.... dit is simpel op te lossen door je delete-acties die nu helemaal onderaan in je script staan, bovenaan te zetten... zodat EERST het item wordt verwijderd en DAARNA pas de lijstjes-items worden opgevraagd...

met betrekking tot je missende ID.... kijk eens in de bron van je pagina of de <input radio> value wel een waarde bevat?
Aha, fout gevonden. Die laatste opmerking was alles wat dus kennelijk nodig was om te veranderen aan het document:

Regel 99 oorspronkelijk:
code:
1
        <input name="del" type="radio" id="radio" value="<? echo $row['id']; ?>">

Regel 99 nu:
code:
1
        <input name="del" type="radio" id="radio" value="<?php echo $row['id']; ?>">

Opgelost, dank. Nu surprises gaan maken. Offline. Zonder PHP.

Iedereen dank voor de moeite, voor deze hobby-bob-sinterklaas :)

Edit: Oh en de suggestie om de $delete op te schuiven naar het begin, vlak na de mysql connectie werkt inderdaad ook. Dus ik ben een blije hobby-bob.

[ Voor 4% gewijzigd door MoiZie op 16-10-2013 22:43 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Devil schreef op woensdag 16 oktober 2013 @ 21:41:
Die single quote heeft hij er al uit gehaald en dat was niet het probleem.
Ik heb _niets_ aan de query string veranderd. De quotes die er nu nog in staan moeten er ook vooral in blijven met huidige manier van escapen. Ten overvloede: mysql_real_escape_string is alleen veilig als het ook als string (dus binnen quotes) in de query terecht komt. Int cast kan ook maar dit is allemaal al behandeld. En inderdaad nog een lesje te ver voorlopig.
MoiZie schreef op woensdag 16 oktober 2013 @ 21:41:
Flauwe opmerking.
[...]
Wat ik wél wil doen, is de tutorial doornemen die mij leert welke fout ik nu hier gemaakt heb, zodat ik ten eerste de site kan repareren en ten tweede kan tonen dat ik wel degelijk moeite doe.
Nou ja, je begrijpt variabelen niet. Hoe ik (en Ramon) de query eerst in een variabele opslaan is toch echt basis kennis. Ik garandeer je dat het in de eerste stappen van een tutorial/boek behandeld wordt. Zo niet zijn de keywords dus string, variable en assignment. ;) Wat ik ook wil garanderen: Noteer mijn post in je agenda voor over een maand en expirementeer in de tussentijd lekker met PHP. Ik beloof je dat je 't over een maandje met mij eens bent en 't niet meer flauw vindt. :)
MoiZie schreef op woensdag 16 oktober 2013 @ 21:58:
Er wordt dus geen id meegegeven. Maar de user weer plukt hij wel uit de post. Dus dan zit het probleem ergens in de id die niet meegegeven wordt bij selectie van de radio button in de betreffende table row, lijkt me..
Nu var_dump() in je toolkit zit: zet var_dump($_POST); neer en je weet wat je allemaal binnenkrijgt.

{signature}


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

MoiZie schreef op woensdag 16 oktober 2013 @ 22:30:
[...]

Aha, fout gevonden. Die laatste opmerking was alles wat dus kennelijk nodig was om te veranderen aan het document:

Regel 99 oorspronkelijk:
code:
1
        <input name="del" type="radio" id="radio" value="<? echo $row['id']; ?>">

Regel 99 nu:
code:
1
        <input name="del" type="radio" id="radio" value="<?php echo $row['id']; ?>">

Opgelost, dank. Nu surprises gaan maken. Offline. Zonder PHP.

Iedereen dank voor de moeite, voor deze hobby-bob-sinterklaas :)

Edit: Oh en de suggestie om de $delete op te schuiven naar het begin, vlak na de mysql connectie werkt inderdaad ook. Dus ik ben een blije hobby-bob.
Nieuwere php versie dus, of andere ini. <?=$row['id'];?> werkt vanaf php 5.4 zelfs als short_open_tag uit staat. <?= vervangt dan dus <?php echo
<? echo werkt alleen als short_open_tag aan staat in php.ini

[ Voor 7% gewijzigd door Devil op 16-10-2013 23:13 ]

After all, we are nothing more or less than what we choose to reveal.

Pagina: 1