[PHP] Redirect werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Beste Tweakertjes, voor op het werk ben ik een kleine database in elkaar aan het flansen (zonder enige programmeer kennis van PHP, maar ik kom een heel eind met de basic tutorials ;)). Het is de bedoeling dat de gebruiker geredirect wordt naar index.php na het submitten. De officiele methode is de header redirect, maar als ik deze code in het script plaats gebeurt er niks (query word wel uitgevoerd). Ik vroeg me ook af of het mogelijk is om het formulier en query bestand in 1 php bestand te zetten voor het overzicht. (Ik weet dat het mogelijk is kan alleen niet uitvogelen hoe :S). Weet iemand hier wat op? Dit is mijn code:


SQL verwerking:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$username="iets";
$password="iets";
$database="iets";

mysql_connect(localhost,$username,$password);


@mysql_select_db($database);


$query = "INSERT INTO `klantenbestellingen` (datum, naamklant, telnr, artomschrijving, typenr, prijs, besteldbij, bestelddoor, datumorder, gebeld, afgehandeld, opmerkingen) VALUES ('$_POST[datum]', '$_POST[naamklant]', '$_POST[telnr]', '$_POST[artomschrijving]', '$_POST[typenr]', '$_POST[prijs]', '$_POST[besteldbij]', '$_POST[bestelddoor]', '$_POST[datumorder]', '$_POST[gebeld]', '$_POST[afgehandeld]', '$_POST[opmerkingen]')";

mysql_query($query);

mysql_close
?>

<?
header("Location: index.php"); 
?>



Input formuliertje:

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
Intranet -> Klantenbestellingen -> Nieuw invoeren </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<form method="post" action="koi_verwerken.php">
    Datum aangenomen: 
  <label>
  <input type="text" name="datum" id="datum" value="<? print(Date("m-d-y")); ?>" maxlength="6" />
  </label>
  <p>Naam klant: 
    <label>
    <input type="text" name="naamklant" id="naamklant" maxlength="50"/>
    </label>
  </p>
  <p>Telefoonnr: 
    <label>
    <input type="text" name="telnr" id="telnr" maxlength="10" value="06" />
    </label>
</p>
  <p>Omschrijving art.: 
    <label>
    <input type="text" name="artomschrijving" id="artomschrijving" maxlength="50" />
    </label>
  </p>
  <p>Typenr apparaat: 
    <label>
    <input type="text" name="typenr" id="typenr" maxlength="30" />
    </label>
  </p>
  <p>Prijs: 
    <label>
    <input type="text" name="prijs" id="prijs" maxlength="15" value="&euro;" />
    </label>
  </p>
  <p>Besteld bij: 
    <label>
    <input type="text" name="besteldbij" id="besteldbij" maxlength="30" />
    </label>
  </p>
  <p>Besteld door: 
    <label>
    <input type="text" name="bestelddoor" id="bestelddoor" maxlength="30" />
    </label>
</p>
  <p>
    Datum besteld: 
    <label>
    <input type="text" name="datumorder" id="datumorder" value="<? print(Date("m-d-y")); ?>" maxlength="6" />
    </label>
  </p>
  <p>Opmerkingen: 
    <label>
    <textarea name="opmerkingen" id="opmerkingen" cols="45" rows="5" maxlength="300"></textarea>
    </label>
  </p>
<input type="hidden" name="gebeld" id="gebeld" value="Nee">
<input type="hidden" name="afgehandeld" id="afgehandeld" value="Nee">

  <p>&nbsp;</p>
  <p>
    <INPUT TYPE="BUTTON" VALUE="Annuleren" 
ONCLICK="history.go(-1)"><label>
    <input type="submit" value="Invoeren" onclick="this.disabled = true" /> 
    </label>
  </p>
</form>



Weet iemand wat? _/-\o_

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
waarschijnlijk heb je error reporting uitstaan. even bovenaan in je script onderstaande toevoegen:
PHP:
1
error_reporting(E_ALL);


waarschijnlijk krijg je dan wel een error te zien waarmee je verder kunt.

om alles in 1 bestand te stoppen kun je hetvolgende doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

//code hier

?>
<html>
<head>
</head>
<body>
</body>
</html>
<!-- HTML HIER -->


Wil je er wel even op wijzen dat je even rekening moet houden met het falen van toevoegen, dus error afhandeling.

want dit ontbreekt nu compleet!

[ Voor 4% gewijzigd door steffex op 15-05-2009 22:25 ]


Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

mysql_close
=
mysql_close();

En voortaan error_reporting aanzetten? ;)

Ennn voor de zekerheid even:

?>

<?

weghalen. (whitespace voor de header)

[ Voor 36% gewijzigd door krvabo op 15-05-2009 22:25 ]

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • ironx
  • Registratie: Augustus 2001
  • Laatst online: 01-07 19:42
Maak van

code:
1
2
3
4
5
6
7
8
<?
...
mysql_close
?>

<?
header("Location: index.php"); 
?>


eens

code:
1
2
3
4
5
6
<?
...
mysql_close();

header("Location: index.php"); 
?>


Je genereert output voor je een header verstuurd (newline/enter/spatie whatever). Dit is niet toegestaan.
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.

[ Voor 8% gewijzigd door ironx op 15-05-2009 22:27 ]


This posting is provided "AS IS" with no warranties, and confers no rights.


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 08:28
PHP:
1
2
3
?>

<?

Dat zou het probleem kunnen zijn. Die return wordt inclusief header alvast verzonden naar de client en vervolgens probeer je nog iets aan de header te veranderen, die is op dat moment al verzonden. Als je error reporting op E_ALL had gezet, dan zou PHP je dat ook verteld hebben.

Mogelijke oplossingen:
- Die hele return weghalen, dus de hele quote van mij verwijderen
- Redirect mbv javascript of een meta-tag
- output buffering gebruiken

Waarvan de eerste uiteraard de voorkeur verdient m.i.

En het is aan te raden een cursusje PHP te doen, want als je een website met formulieren en een database maakt zonder enige kennis is de kans aanwezig dat je zonder het te weten meer dingen fout doet die tot onverwachte resultaten leiden of tot veiligheidslekken.

edit: sneller typen :p

Verder moet ik nog opmerken dat je code tal van andere fouten bevat:
- mysql_close heeft geen haakjes
- De string van je query wordt niet goed aangemaakt doordat je de waarden uit de POST array verkeerd gebruikt
- De inputwaarden van je query worden niet gecontrolleerd en ge-escaped, dus is de beveiliging niet op orde
- Er wordt niets met foutafhandeling gedaan. Wat krijgt je bezoeker te zien als mysql eruit ligt? Foutonderdrukking door een @ voor de functieaanroep mag geen vervanger zijn voor het controleren op fouten

[ Voor 28% gewijzigd door doeternietoe op 15-05-2009 22:36 ]


Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
hmm vervelend, mijn script is nu als volgt:


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
<?php
error_reporting(E_ALL);
?>

<?
$username="iets";
$password="iets";
$database="iets";

mysql_connect(localhost,$username,$password);


@mysql_select_db($database);


$query = "INSERT INTO `klantenbestellingen` (datum, naamklant, telnr, artomschrijving, typenr, prijs, besteldbij, bestelddoor, datumorder, gebeld, afgehandeld, opmerkingen) VALUES ('$_POST[datum]', '$_POST[naamklant]', '$_POST[telnr]', '$_POST[artomschrijving]', '$_POST[typenr]', '$_POST[prijs]', '$_POST[besteldbij]', '$_POST[bestelddoor]', '$_POST[datumorder]', '$_POST[gebeld]', '$_POST[afgehandeld]', '$_POST[opmerkingen]')";

mysql_query($query);

?>
<?
mysql_close();

header("Location: index.php"); 
?>


En nog steeds een blanko scherm na input. :?

Acties:
  • 0 Henk 'm!

  • RetroTycoon
  • Registratie: Juli 2008
  • Laatst online: 21-09 22:12
Sluit de 2 scripts aan op elkaar :)

Acties:
  • 0 Henk 'm!

  • NLChris
  • Registratie: Juli 2004
  • Laatst online: 07:49
Nog steeds heb je een lege regel die naar de browser verstuurd wordt. (Headers MOETEN voor elke andere data gaan die naar browser gestuurd wordt)

Je kunt dit oplossen door de redirect daarvoor te doen. Maar de meest nette oplossing is het scheiden van code en opmaak. Dan kom je nooit dit soort problemen tegen. Bovendien is het beter te onderhouden.

Bovendien denk ik dat display_errors uit staat. :)

[ Voor 6% gewijzigd door NLChris op 15-05-2009 22:38 ]


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 08:28
En staat er wel iets in index.php? Want het zou afhankelijk van je configuratie zomaar kunnen dat je redirect wel werkt, maar dat index.php leeg is. Haal heel die redirect eens weg en controleer eens of je wel een error ziet. En lees even de laatste edit van het bericht hierboven.

Kort gezegd moet je php-bestand ook beginnen met '<?php' en vervolgens nooit meer '<?php', '<?' of '?>' bevatten. Ook de '?>' aan het einde kun je beter weglaten. Gebruik een onderbreking van de code php slechts als je html in je document wilt gebruiken en verder nooit.

[ Voor 32% gewijzigd door doeternietoe op 15-05-2009 22:43 ]


Acties:
  • 0 Henk 'm!

  • ironx
  • Registratie: Augustus 2001
  • Laatst online: 01-07 19:42
Xanthium schreef op vrijdag 15 mei 2009 @ 22:33:
hmm vervelend, mijn script is nu als volgt:

code:
1
2
3
4
5
6
7
8
<?php
error_reporting(E_ALL);
?>

<?
$username="iets";
...
?>


En nog steeds een blanko scherm na input. :?
Je genereert nog steeds output?

[ Voor 29% gewijzigd door ironx op 15-05-2009 22:39 ]


This posting is provided "AS IS" with no warranties, and confers no rights.


Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Ik heb ook een poging gedaan om het formulier en de php in 1 bestand te mergen zoals in de post hiervoor aangegeven, maar ook dat loopt niet lekker; als deze pagina wordt geopend draait ie het sql script al en krijg ik hierdoor elke keer een lege record in de database. Voor de rest werkt het submitten via het formulier wel goed. Ik krijg wel dezelfde pagina te zien na het submitten, ondanks jullie tips. Erg frustrerend.. :/


opvoeren.php

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
<?php
error_reporting(E_ALL);
?>

<?
$username="iets";
$password="iets";
$database="iets";

mysql_connect(localhost,$username,$password);


@mysql_select_db($database);


$query = "INSERT INTO `klantenbestellingen` (datum, naamklant, telnr, artomschrijving, typenr, prijs, besteldbij, bestelddoor, datumorder, gebeld, afgehandeld, opmerkingen) VALUES ('$_POST[datum]', '$_POST[naamklant]', '$_POST[telnr]', '$_POST[artomschrijving]', '$_POST[typenr]', '$_POST[prijs]', '$_POST[besteldbij]', '$_POST[bestelddoor]', '$_POST[datumorder]', '$_POST[gebeld]', '$_POST[afgehandeld]', '$_POST[opmerkingen]')";

mysql_query($query);

?>
<?
mysql_close();
header("Location: index.php"); 
?> 



Intranet -> Klantenbestellingen -> Nieuw invoeren </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<form method="post" action="opvoeren.php">
    Datum aangenomen: 
  <label>
  <input type="text" name="datum" id="datum" value="<? print(Date("m-d-y")); ?>" maxlength="6" />
  </label>
  <p>Naam klant: 
    <label>
    <input type="text" name="naamklant" id="naamklant" maxlength="50"/>
    </label>
  </p>
  <p>Telefoonnr: 
    <label>
    <input type="text" name="telnr" id="telnr" maxlength="10" value="06" />
    </label>
</p>
  <p>Omschrijving art.: 
    <label>
    <input type="text" name="artomschrijving" id="artomschrijving" maxlength="50" />
    </label>
  </p>
  <p>Typenr apparaat: 
    <label>
    <input type="text" name="typenr" id="typenr" maxlength="30" />
    </label>
  </p>
  <p>Prijs: 
    <label>
    <input type="text" name="prijs" id="prijs" maxlength="15" value="&euro;" />
    </label>
  </p>
  <p>Besteld bij: 
    <label>
    <input type="text" name="besteldbij" id="besteldbij" maxlength="30" />
    </label>
  </p>
  <p>Besteld door: 
    <label>
    <input type="text" name="bestelddoor" id="bestelddoor" maxlength="30" />
    </label>
</p>
  <p>
    Datum besteld: 
    <label>
    <input type="text" name="datumorder" id="datumorder" value="<? print(Date("m-d-y")); ?>" maxlength="6" />
    </label>
  </p>
  <p>Opmerkingen: 
    <label>
    <textarea name="opmerkingen" id="opmerkingen" cols="45" rows="5" maxlength="300"></textarea>
    </label>
  </p>
<input type="hidden" name="gebeld" id="gebeld" value="Nee">
<input type="hidden" name="afgehandeld" id="afgehandeld" value="Nee">

  <p>&nbsp;</p>
  <p>
    <INPUT TYPE="BUTTON" VALUE="Annuleren" 
ONCLICK="history.go(-1)"><label>
    <input type="submit" value="Invoeren" onclick="this.disabled = true" /> 
    </label>
  </p>
</form>



P.S. dus als ik het goed begrijp mogen er geen lege regels voorkomen in het script omdat dit voor output zorgt? Alvast bedankt voor jullie hulp zover :)

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 08:28
doeternietoe schreef op vrijdag 15 mei 2009 @ 22:28:
Verder moet ik nog opmerken dat je code tal van andere fouten bevat:
- mysql_close heeft geen haakjes
- De string van je query wordt niet goed aangemaakt doordat je de waarden uit de POST array verkeerd gebruikt
- De inputwaarden van je query worden niet gecontrolleerd en ge-escaped, dus is de beveiliging niet op orde
- Er wordt niets met foutafhandeling gedaan. Wat krijgt je bezoeker te zien als mysql eruit ligt? Foutonderdrukking door een @ voor de functieaanroep mag geen vervanger zijn voor het controleren op fouten
Ga deze oplossen en je fouten zullen verdwijnen als sneeuw voor de zon. :+

Acties:
  • 0 Henk 'm!

  • Japius
  • Registratie: April 2003
  • Laatst online: 30-08 20:57
Je probeert een header te versturen nadat je output hebt verstuurd. Dat mag niet.

Tip: je output staat tussen de ?> en de <?php , in bovenstaande code is dat op regel 4.

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 08:28
Xanthium schreef op vrijdag 15 mei 2009 @ 22:43:
P.S. dus als ik het goed begrijp mogen er geen lege regels voorkomen in het script omdat dit voor output zorgt? Alvast bedankt voor jullie hulp zover :)
Je mag je stuk php niet onderbreken. Eenmaal '<?php' en daarna niet meer, totdat je aan je html begint.

Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
doeternietoe schreef op vrijdag 15 mei 2009 @ 22:28:
[php]?>

edit: sneller typen :p

Verder moet ik nog opmerken dat je code tal van andere fouten bevat:
- mysql_close heeft geen haakjes
- De string van je query wordt niet goed aangemaakt doordat je de waarden uit de POST array verkeerd gebruikt
- De inputwaarden van je query worden niet gecontrolleerd en ge-escaped, dus is de beveiliging niet op orde
- Er wordt niets met foutafhandeling gedaan. Wat krijgt je bezoeker te zien als mysql eruit ligt? Foutonderdrukking door een @ voor de functieaanroep mag geen vervanger zijn voor het controleren op fouten
Security is niet zo van belang omdat deze pagina alleen intern gebruikt zal worden voor enkele medewerkers hier en het is dan ook meer voor het gemak bedoeld zodat het centraal zonder papier ingezien kan worden. Ik heb voor de rest voorbeelden gevolgd van diverse PHP-SQL tutorials en die hebben meestal subtiele verschillen in de opbouw van de verbinding en de afhandeling ervan. Ik neem het dan maar over maar het word dan wel helaas moeilijk om de fouten eruit te vissen :X


ik heb inmiddels de output eruit weten te krijgen en de redirect werkt nu :) bedankt voor het advies. het enige waar ik nu mee tob is hoe ik ervoor zorg dat het php script pas NA submit word uitgevoerd, en niet al meteen als ik de pagina open

[ Voor 9% gewijzigd door Xanthium op 15-05-2009 22:51 ]


Acties:
  • 0 Henk 'm!

  • ironx
  • Registratie: Augustus 2001
  • Laatst online: 01-07 19:42
Xanthium schreef op vrijdag 15 mei 2009 @ 22:43:
Ik heb ook een poging gedaan om het formulier en de php in 1 bestand te mergen zoals in de post hiervoor aangegeven, maar ook dat loopt niet lekker; als deze pagina wordt geopend draait ie het sql script al en krijg ik hierdoor elke keer een lege record in de database.
Dit kan je afvangen door te kijken of het formulier 'gesubmit' is ($_POST e.d. checken)...
P.S. dus als ik het goed begrijp mogen er geen lege regels voorkomen in het script omdat dit voor output zorgt? Alvast bedankt voor jullie hulp zover :)
Klopt... mischien handig om waneer je een functie gebruikt ook te lezen wat er zoal bij komt kijken?
Er staat bij de 'header' functie dus duidelijk dat er totaal geen output mag zijn voor je deze gebruikt. :)

Mischien ook handig om de documentatie altijd binnen handbereik te hebben?

En frustrerend: da's altijd wel met nieuwe dingen die je moet aanleren d:)b


This posting is provided "AS IS" with no warranties, and confers no rights.


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 08:28
Xanthium schreef op vrijdag 15 mei 2009 @ 22:49:
[...]


Security is niet zo van belang omdat deze pagina alleen intern gebruikt zal worden voor enkele medewerkers hier en het is dan ook meer voor het gemak bedoeld zodat het centraal zonder papier ingezien kan worden. Ik heb voor de rest voorbeelden gevolgd van diverse PHP-SQL tutorials en die hebben meestal subtiele verschillen in de opbouw van de verbinding en de afhandeling ervan. Ik neem het dan maar over maar het word dan wel helaas moeilijk om de fouten eruit te vissen :X
Ga dan PHP leren. Officieel geven we op GoT zowiezo geen hulp bij scripts van derden en zijn we ook geen helpdesk, dus als je nog eens wat code wil produceren is dat wel aan te raden. Security kan trouwens wel niet zo'n probleem zijn, maar je wilt ook dat er niet vanalles in de soep loopt als iemand per ongelijk een apostrof, schuine streep of -- gebruikt in de goede/verkeerde combinatie gebruikt.
ik heb inmiddels de output eruit weten te krijgen en de redirect werkt nu :) bedankt voor het advies. het enige waar ik nu mee tob is hoe ik ervoor zorg dat het php script pas NA submit word uitgevoerd, en niet al meteen als ik de pagina open
Goed, nog één keer:

Wat dacht je van:
PHP:
1
2
3
if(! empty( $_POST[ 'naamklant' ] ) ){
  //de code die uitgevoerd moet worden als het formulier wordt ingevuld.
}


En zet ook even een exit; achter de redirect, ook net zo netjes.

Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
ik ga eens kijken hoever ik kom :), bedankt zover

[ Voor 18% gewijzigd door Xanthium op 15-05-2009 23:03 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Paar opmerkingen:

- Weet je ook wat die '@' voor de functie doet?
- zet een die() of exit; achter je redirect, niet omdat t netjes is maar omdat het noodzakelijk is
- als je geen code zet tussen ?> en <?php dan moet je die er dus niet neerzetten, slaat nergens op en kan alleen maar problemen geven.
- Zoek eens op "SQL injection"

Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
Cartman! schreef op zaterdag 16 mei 2009 @ 12:07:
Paar opmerkingen:

- Weet je ook wat die '@' voor de functie doet?
- zet een die() of exit; achter je redirect, niet omdat t netjes is maar omdat het noodzakelijk is
- als je geen code zet tussen ?> en <?php dan moet je die er dus niet neerzetten, slaat nergens op en kan alleen maar problemen geven.
- Zoek eens op "SQL injection"
- Nee... O+
- ik zal een die erachter zetten
- dit probleem is idd nu opgelost, de redirect werkt goed
- ja ik heb wel een stukje code bij het script gezet om rare tekens uit de input te filteren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function sanitize($value, $type)
{
  $value = (!get_magic_quotes_gpc()) ? addslashes($value) : $value;

  switch ($type) {
    case "text":
      $value = ($value != "") ? "'" . $value . "'" : "NULL";
      break;
    case "long":
    case "int":
      $value = ($value != "") ? intval($value) : "NULL";
      break;
    case "double":
      $value = ($value != "") ? "'" . doubleval($value) . "'" : "NULL";
      break;
    case "date":
      $value = ($value != "") ? "'" . $value . "'" : "NULL";
      break;
  }

  return $value;
}


ik kom er alleen niet uit hoe ik het script en formulier in 1 php file kan mergen zonder dat deze zichzelf al uitvoert als de pagina geopend word :X

Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Je zou het direct uitvoeren kunnen stoppen d.m.v. een if constructie met een check op $_SERVER['REQUEST_METHOD'].

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 08:28
Cartman! schreef op zaterdag 16 mei 2009 @ 12:07:
- zet een die() of exit; achter je redirect, niet omdat t netjes is maar omdat het noodzakelijk is
Het is niet netjes, maar de redirect werkt wel gewoon hoor :)
Xanthium schreef op zaterdag 16 mei 2009 @ 15:14:
ik kom er alleen niet uit hoe ik het script en formulier in 1 php file kan mergen zonder dat deze zichzelf al uitvoert als de pagina geopend word :X
Ik heb je de benodigde code letterlijk gegeven. Als je dat niet kunt toepassen moet je maar een cursus PHP gaan doen. Op internet staan ze bij bosjes.

Hoe ga jij ooit die pagina onderhouden als je geen snars van PHP weet?

Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
doeternietoe schreef op zaterdag 16 mei 2009 @ 15:32:
[...]

Het is niet netjes, maar de redirect werkt wel gewoon hoor :)

[...]

Ik heb je de benodigde code letterlijk gegeven. Als je dat niet kunt toepassen moet je maar een cursus PHP gaan doen. Op internet staan ze bij bosjes.

Hoe ga jij ooit die pagina onderhouden als je geen snars van PHP weet?
nou het is meer een eenmalige opzet die ik wil doen om het bestelproces te digitaliseren. het is voor de rest niet de bedoeling dat ik er steeds mee bezig zal zijn. :|

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
doeternietoe schreef op zaterdag 16 mei 2009 @ 15:32:
[...]

Het is niet netjes, maar de redirect werkt wel gewoon hoor :)
En als een browser besluit (om welke reden dan ook) de redirect te negeren? Dan laat ie de rest van je pagina zien terwijl de reden van redict bijv. is dat een gebruiker content niet mag zien.

Xanthium: waarom laat je dat dan niet over aan iemand die wel weet wat ie doet :?

[ Voor 10% gewijzigd door Cartman! op 16-05-2009 17:02 ]


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 08:28
Cartman! schreef op zaterdag 16 mei 2009 @ 17:01:
[...]

En als een browser besluit (om welke reden dan ook) de redirect te negeren? Dan laat ie de rest van je pagina zien terwijl de reden van redict bijv. is dat een gebruiker content niet mag zien.
Als je reden voor een redirect is dat een gebruiker de pagina niet mag zien dan doe je imho sowieso iets fout.
Xanthium: waarom laat je dat dan niet over aan iemand die wel weet wat ie doet :?
offtopic:
doet-i ook, hij vraagt alles wat-i niet weet op GoT :+


Ik ben het overigens wel met je eens.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
doeternietoe schreef op zaterdag 16 mei 2009 @ 17:07:
[...]

Als je reden voor een redirect is dat een gebruiker de pagina niet mag zien dan doe je imho sowieso iets fout.
Nee hoor, dat is een hele logische toepassing. Voorbeeld:

PHP:
1
2
3
4
5
6
7
8
9
// doe iets

if ($this->isUserError()) {
  // Stuur de user terug naar de vorige pagina
  header('Location: http://www.example.org/pagina/');
  exit;
} else {
  // render de pagina
}
Dus als je header(); exit; binnen een if staat is het helemaal niet zo vreemd dat je hem gebruikt om de rest van de pagina niet te tonen (danwel niet uit te voeren).

[ Voor 9% gewijzigd door HuHu op 16-05-2009 17:47 ]


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Nu online

Johnny

ondergewaardeerde internetguru

Een kleine toevoeging op de topic start, daar staat de volgende header:
HTTP:
1
Location: index.php


Het gevolg is dat je het adres http://example.com/index.php in je adresbalk krijgt. Het is handiger om dan gewoon dit te doen:

HTTP:
1
Location: .

Waarna je wordt doorgestuurd naar http://example.com/

Dit truukje werkt overginds ook voor HTML-links naar de homepage, gewoon een punt gebruiken.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Johnny schreef op zaterdag 16 mei 2009 @ 17:58:
Een kleine toevoeging op de topic start, daar staat de volgende header:
HTTP:
1
Location: index.php


Het gevolg is dat je het adres http://example.com/index.php in je adresbalk krijgt. Het is handiger om dan gewoon dit te doen:

HTTP:
1
Location: .

Waarna je wordt doorgestuurd naar http://example.com/

Dit truukje werkt overginds ook voor HTML-links naar de homepage, gewoon een punt gebruiken.
Nog een kleine toevoeging dan: het is verplicht de volledige URL te vermelden bij zo'n redirect:

PHP:
1
2
3
4
5
// Fout
header('Location: index.php');

// Goed
header('Location: http://example.org/index.php');


Op het moment dat je dat doet hoef je ook niet meer te redirecten naar '.', maar gewoon naar de volledige URL zonder iets erachter.

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 08:28
HuHu schreef op zaterdag 16 mei 2009 @ 17:47:
[...]
Nee hoor, dat is een hele logische toepassing. Voorbeeld:

PHP:
1
2
3
4
5
6
7
8
9
// doe iets

if ($this->isUserError()) {
  // Stuur de user terug naar de vorige pagina
  header('Location: http://www.example.org/pagina/');
  exit;
} else {
  // render de pagina
}
Dus als je header(); exit; binnen een if staat is het helemaal niet zo vreemd dat je hem gebruikt om de rest van de pagina niet te tonen (danwel niet uit te voeren).
Maar de exit; doet de stuk achter de deur, niet de redirect :+ Overigens zou je strict genomen in je voorbeeld danwel de exit;, danwel de else{} weg kunnen laten.

Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
doeternietoe schreef op zaterdag 16 mei 2009 @ 17:07:
[...]

Als je reden voor een redirect is dat een gebruiker de pagina niet mag zien dan doe je imho sowieso iets fout.

[...]

offtopic:
doet-i ook, hij vraagt alles wat-i niet weet op GoT :+


Ik ben het overigens wel met je eens.
omdat ik het wel interessant vind om het zelf uit te vogelen, ook al kost dat soms wat meer moeite :P de baas heeft ook niet zoveel zin om hier een externe firma voor in te huren. Het was dan ook niet de bedoeling om hier irritatie op te wekken met mijn vragen. Ik heb helaas het idee dat dit wel het geval was. :|

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Het is niet erg om vragen te stellen maar er wordt wel een soort verwacht dat je weet waar je mee bezig bent. Het is gewoon een vak wat iemand kan hebben en niet zomaar iets wat je even erbij prutst. Dat kan wel, maar dan kun je potentieel sites maken waarbij een kwaadwillende bezoeker je database even leeggooit. Dus om nu die paar honderd euro te besparen kun je jezelf een hoop problemen op de hals halen. Als het uiteindelijk wel goed (blijft) werken is het mooi meegenomen natuurlijk want zelf oplossen is niet per definitie slecht.

Acties:
  • 0 Henk 'm!

  • MrNGm
  • Registratie: Augustus 2004
  • Laatst online: 01-09 13:45
Volgens mij is zoiets je streven... Dat mysql_close(); is in principe niet nodig (dat doet PHP zelf wel aan het einde van het script)

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
97
98
99
100
101
102
103
<?php
error_reporting(E_ALL);

if (isset($_POST) && !empty($_POST)) {
  $username="iets";
  $password="iets";
  $database="iets";

  $db = mysql_connect('localhost',$username,$password);
  mysql_select_db($database);

  $SQL = "INSERT INTO `klantenbestellingen`
    (datum, naamklant, telnr, artomschrijving, typenr, prijs, besteldbij, bestelddoor, datumorder, gebeld, afgehandeld, opmerkingen)
    VALUES (
      '".$_POST['datum']."',
      '".$_POST['naamklant']."',
      '".$_POST['telnr']."',
      '".$_POST['artomschrijving']."',
      '".$_POST['typenr']."',
      '".$_POST['prijs']."',
      '".$_POST['besteldbij']."',
      '".$_POST['bestelddoor']."',
      '".$_POST['datumorder']."',
      '".$_POST['gebeld']."',
      '".$_POST['afgehandeld']."',
      '".$_POST['opmerkingen']."'
    )";
  $query = mysql_query(mysql_real_escape_string($SQL));
  if (mysql_affected_rows($query) > 0) {
    header("Location: index.php");
  } else {
    die('Er is iets fout gegaan bij MySQL: '.mysql_error());
  }
} else {

?> 
Intranet -> Klantenbestellingen -> Nieuw invoeren </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<form method="post" action="opvoeren.php">
    Datum aangenomen: 
  <label>
  <input type="text" name="datum" id="datum" value="<? print(Date("m-d-y")); ?>" maxlength="6" />
  </label>
  <p>Naam klant: 
    <label>
    <input type="text" name="naamklant" id="naamklant" maxlength="50"/>
    </label>
  </p>
  <p>Telefoonnr: 
    <label>
    <input type="text" name="telnr" id="telnr" maxlength="10" value="06" />
    </label>
</p>
  <p>Omschrijving art.: 
    <label>
    <input type="text" name="artomschrijving" id="artomschrijving" maxlength="50" />
    </label>
  </p>
  <p>Typenr apparaat: 
    <label>
    <input type="text" name="typenr" id="typenr" maxlength="30" />
    </label>
  </p>
  <p>Prijs: 
    <label>
    <input type="text" name="prijs" id="prijs" maxlength="15" value="&euro;" />
    </label>
  </p>
  <p>Besteld bij: 
    <label>
    <input type="text" name="besteldbij" id="besteldbij" maxlength="30" />
    </label>
  </p>
  <p>Besteld door: 
    <label>
    <input type="text" name="bestelddoor" id="bestelddoor" maxlength="30" />
    </label>
</p>
  <p>
    Datum besteld: 
    <label>
    <input type="text" name="datumorder" id="datumorder" value="<? print(Date("m-d-y")); ?>" maxlength="6" />
    </label>
  </p>
  <p>Opmerkingen: 
    <label>
    <textarea name="opmerkingen" id="opmerkingen" cols="45" rows="5" maxlength="300"></textarea>
    </label>
  </p>
<input type="hidden" name="gebeld" id="gebeld" value="Nee">
<input type="hidden" name="afgehandeld" id="afgehandeld" value="Nee">

  <p>&nbsp;</p>
  <p>
    <INPUT TYPE="BUTTON" VALUE="Annuleren" 
ONCLICK="history.go(-1)"><label>
    <input type="submit" value="Invoeren" onclick="this.disabled = true" /> 
    </label>
  </p>
</form>
<?
}


Wat heb ik allemaal aangepast?
  • Je $query variabele was eigenlijk een SQL statement, oftewel, de variabelenaam hoort daar dus ook gewoon $SQL (of $sql, net wat je wil) te zijn.
  • Daar bijkomend, hoe zet je variabelen in je code. Een van de (betere, imho) is door ze te escapen. Als je $var in een string wil verwerken kan dat op de volgende paar manieren:
    PHP:
    1
    2
    3
    4
    5
    
    $var = 'tralala';
    echo "De variabele heeft $var als waarde."; // let op de dubbele aanhalingstekens
    echo 'De variabele heeft '.$var.' als waarde'; // enkele aanhalingstekens en een . vóór en achter de variabelenaam.
    echo "De variabele heeft '".$var."' als waarde"; // output: De variabele heeft 'tralala' als waarde
    echo 'De variabele heeft "'.$var." als waarde'; // output: De variabele heeft "tralala" als waarde

    Het laatste geval is het voorbeeld van escapen en in mijn ogen de beste oplossing. Door gebruik te maken van syntax highlighting (alle mooie kleurtjes) zie je in 1 oogopslag of je ergens een aanhalingsteken bent vergeten en waar je variabelen staan...



    Zoals je kan zien is er iets fout gegaan met het plaatsen van de aanhalingstekens, het had eigenlijk zo gemoeten:
    PHP:
    1
    2
    
    $var = 'tralala';
    echo 'De variabele heeft "'.$var.'" als waarde'; // output: De variabele heeft "tralala" als waarde

    Ik zou zeggen, zoek de verschillen in jouw code en de aangepaste code hierboven mbt het plaatsen van de $_POST variabelen.
  • Door mysql_query() in een variabele te stoppen ($query) kan je 'm later voeren aan mysql_affected_rows() om te checken of er wel wat de database is ingegaan.
  • Het heeft geen zin om ?> (nieuwe regel) <? te doen, laat deze ook gewoon weg als je nog niet klaar bent met je script. Je begint je script met <?php (of <? ) en eindigt deze pas als je óf een gehele HTML pagina in wil voegen, óf je per se al je PHP scripts 'netjes' wil afsluiten.
  • Ik heb een if-else constructie voor jouw doel gemaakt (een formulier & verwerker in 1 pagina)... let ook op alle mooie kleurtjes in het PHP gedeelte van de code.
Ik hoop dat je er wat aan hebt... Soms is een volledig 'goed' (imho :+) codevoorbeeld handiger dan allerlei tips hoe het beter moet.

Acties:
  • 0 Henk 'm!

Verwijderd

MrNGm schreef op zondag 17 mei 2009 @ 00:45:
Ik hoop dat je er wat aan hebt... Soms is een volledig 'goed' (imho :+) codevoorbeeld handiger dan allerlei tips hoe het beter moet.
Tjah, ben ik niet met je eens. Dan ga je er namelijk vanuit dat degene zich er echt in gaat verdiepen en er iets van leert. Maar iemand die zich erin zou gaan verdiepen gaat eigenlijk per definitie al niet zo'n simpele vraag op een forum stellen maar zoekt het zelf uit.

Daarnaast zitten er een aantal zaken goed fout in jouw voorbeeld, dus een goed voorbeeld is het sowieso niet. Zo leer je iemand niets en als ze er al iets van leren dan leer je het verkeerde IMHO, NOFI.

Je insteek is dus in theorie goed, maar in de praktijk hebben mensen meer aan losse tips. Anders kun je net zo goed script requests toestaan en dat zie ik in ieder geval niet graag gebeuren.

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Wat ik al eens gebruik in dit geval is een buffer.
PHP:
1
2
3
4
5
ob_start();
// code

ob_end_clean();
header(...);
In de code zet ik dan alle foutmeldingen in een string of array die ik op het einde in de sessie variabelen weg schrijf. Na de redirect kijk ik gewoon of er een foutmeling in de sessie zit en die druk ik dan af. (met kleurtjes ed.). Als er geen foutmelding aanwezig was laat ik de gebruiker weten dat de bewerking gelukt is.

Maar door alles in een buffer te steken en die te cleanen/verwijderen kan je ook geen toevallige foutmeldingen krijgen die de redirect tegen houden. Zo krijgt de gebruiker toch zijn oorspronkelijke pagina en een foutmelding wat er mis is gegaan. En kan de gebruiker ook gewoon onmiddelijk opnieuw proberen.

Acties:
  • 0 Henk 'm!

  • soulrider
  • Registratie: April 2005
  • Laatst online: 27-11-2017
offtopic:

[quote]MrNGm schreef op zondag 17 mei 2009 @ 00:45:
...
[code=php]
....
echo 'De variabele heeft "'.$var." als waarde'; // output: De variabele heeft "tralala" als waarde
[/code]
...
[/quote]
Die laatste (De rest heb ik geknipt) heeft echter een error als resultaat hoor ;)
je mist een " ' " : . " ipv . ' " (extra spaties toegevoegd voor deuidelijkheid)
correct:
[code=php]
.....
echo 'De variabele heeft "'.$var.'" als waarde'; // output: De variabele heeft "tralala" als waarde :+
[/code]
(maar vermoedelijke was het een typo tussen al je goede uitleg en voorbeelden)


edit: blijkbaar heb ik onbedoeld bewezen hoe belangrijk het is volledig wakker te zijn als je iemand anders code herleest O-) het staat er inderdaad al vermeld in de goede uitleg en voorbeelden. (en zelfs bruikbare code voor de TS)

[ Voor 27% gewijzigd door soulrider op 17-05-2009 03:48 . Reden: (was niet aanvallend bedoeld, ik zag de verdere uitleg als 'ander voorbeeld' en niet als ''fout voorbeeld, en hier is het juiste" ]


Acties:
  • 0 Henk 'm!

  • MrNGm
  • Registratie: Augustus 2004
  • Laatst online: 01-09 13:45
Verwijderd schreef op zondag 17 mei 2009 @ 00:57:
Daarnaast zitten er een aantal zaken goed fout in jouw voorbeeld, dus een goed voorbeeld is het sowieso niet. Zo leer je iemand niets en als ze er al iets van leren dan leer je het verkeerde IMHO, NOFI.
Vertel... Kennelijk staan de beste stuurlui alsnog aan wal, want ik heb nog geen nuttige inbreng van jou gezien in dit topic (uiteraard nofi }:O). Ik zou dan graag willen weten wat er niet klopt en waarom iemand er dan helemaal niets van kan leren. Door een ander codevoorbeeld te geven prikkel je juist, zodat TS zichzelf gaat afvragen waarom iemand bepaalde regels code daar en daar neerzet. Precies hetzelfde is er nu bij jou gebeurd hoor :*)...

Gaat het "een aantal zaken goed fout" toevallig om het volgende?
soulrider schreef op zondag 17 mei 2009 @ 01:47:
offtopic:
[...]

Die laatste (De rest heb ik geknipt) heeft echter een error als resultaat hoor ;)
je mist een " ' " : . " ipv . ' " (extra spaties toegevoegd voor deuidelijkheid)
correct:
PHP:
1
2
.....
echo 'De variabele heeft "'.$var.'" als waarde'; // output: De variabele heeft "tralala" als waarde :+

(maar vermoedelijke was het een typo tussen al je goede uitleg en voorbeelden)
alwaar ik toch redelijk duidelijk eronder heb gezet hoe waardevol syntax highlighting is?
MrNGm schreef op zondag 17 mei 2009 @ 00:45:
PHP:
1
2
3
4
5
$var = 'tralala';
echo "De variabele heeft $var als waarde."; // let op de dubbele aanhalingstekens
echo 'De variabele heeft '.$var.' als waarde'; // enkele aanhalingstekens en een . vóór en achter de variabelenaam.
echo "De variabele heeft '".$var."' als waarde"; // output: De variabele heeft 'tralala' als waarde
echo 'De variabele heeft "'.$var." als waarde'; // output: De variabele heeft "tralala" als waarde

Het laatste geval is het voorbeeld van escapen en in mijn ogen de beste oplossing. Door gebruik te maken van syntax highlighting [...] zie je in 1 oogopslag of je ergens een aanhalingsteken bent vergeten en waar je variabelen staan...



Zoals je kan zien is er iets fout gegaan met het plaatsen van de aanhalingstekens, het had eigenlijk zo gemoeten:
PHP:
1
2
$var = 'tralala';
echo 'De variabele heeft "'.$var.'" als waarde'; // output: De variabele heeft "tralala" als waarde
Care to read? Thanks :O

offtopic:
Waar gaat het heen.. ik geef een redelijk compleet codevoorbeeld, inclusief extra uitleg en ik word er direct op aangevallen. Geef zelf dan een duw in de goede richting in plaats van te zeggen dat je script requests moet gaan toestaan. Dit is gewoon een legitieme vraag van een beginneling en ik ben zo vrij geweest zijn beginscript te verbeteren. De tips die hem gegeven zijn werden niet goed opgepakt; doe dit en dat.. ja, als beginner weet je dat toch allemaal niet? Ga je het allemaal lekker zelf uitzoeken? Mooi, dan kunnen we ook meteen GoT sluiten, iedereen zoekt het toch lekker zelf uit. Tuurlijk, Google en php.net/docs helpen een eind, maar iets als GoT moet toch zulke beginnelingen steunen en bruikbare tips danwel duidelijke codevoorbeelden geven. Iemand anders met ongeveer hetzelfde probleem leest dan even dit topic door en vindt zo zijn oplossing. Scheelt weer een nieuw topic aanmaken... Kan me dan even niet schelen dat iemand met bijna 5k posts me loopt af te zeiken omdat ie de FAQ/beleid zo goed kent. Ga lekker fietsen dan... Als je graag op dit stukje off-topic wil reageren (je mag al blij zijn dat ik de tags eromheen heb gezet) DM me dan even in plaats van dit topic te vervuilen met niet-behulpzame posts. Uiteraad NOFI hè, zoals ze dat zo mooi kunnen zeggen :+

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom niet gewoon een header refresh als je klaar bent met je script?

header('Refresh: 0; url=index.php');

Deze kan overal in het script gebruikt worden itt header location

Of zie ik iets over het hoofd?

Acties:
  • 0 Henk 'm!

  • danslo
  • Registratie: Januari 2003
  • Laatst online: 10:55
Verwijderd schreef op zondag 17 mei 2009 @ 09:26:
Waarom niet gewoon een header refresh als je klaar bent met je script?

header('Refresh: 0; url=index.php');

Deze kan overal in het script gebruikt worden itt header location

Of zie ik iets over het hoofd?
Ja, het feit dat header() calls ongeacht de parameter die je gebruikt niet na content kunnen komen. Dit zou je geweten hebben als je even snel de PHP documentatie van de header() functie had doorgelezen. Overigens ook prima te beantwoorden met simpele logica (het woord zegt het namelijk al) of een simpele basiskennis van het HTTP protocol.

Je bent zeer waarschijnlijk in de war met een meta refresh.

[ Voor 11% gewijzigd door danslo op 17-05-2009 09:43 ]


Acties:
  • 0 Henk 'm!

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 13-09 17:10
MrNGm schreef op zondag 17 mei 2009 @ 00:45:
Volgens mij is zoiets je streven... Dat mysql_close(); is in principe niet nodig (dat doet PHP zelf wel aan het einde van het script)
...
Ondanks dat je streven (uiteraard) goed is zitten er toch een aantal grote fouten in je script. Met één simpele request zou ik je gehele database leeg kunnen gooien, door de $_POST array direct te gebruiken (zonder te filteren) creeëer je een werkelijk enorm beveiligingslek, zoek ook eens op SQL Injection.

code:
1
if (isset($_POST) && !empty($_POST)) {


Dat is een vrij aparte manier om te kijken of er data is gepost naar de server. De $_POST variable wordt altijd aangemaakt. Zelfs in de CLI waar een POST onmogelijk is, en het zal altijd een array zijn. Het eerste deel van je if-statement zal dus altijd evalueren naar true. Een betere manier om te checken is, zoals iemand anders al voorgedragen heeft, de $_SERVER['REQUEST_METHOD'] te vergelijken met POST.

Heb je verder zelf een idee wat MySQL_Real_Escape_String doet? Door deze op de gehele query uit te voeren zal deze waarschijnlijk niet eens uitgevoerd kunnen worden omdat alles geescaped wordt. Je moet de functies uitvoeren op variablen die je in de query gebruikt, niet op de query zelf.

code:
1
$sQuery = 'SELECT * FROM table WHERE foo=' . MySQL_Real_Escape_String ($bar);


Verder nog wat kleinere dingetjes; MySQL_Affected_Rows neemt helemaal geen statement als argument, die neemt een resource (connectie) als statement. De functie pakt standaard het resultaat van de laatst uitgevoerde MySQL query. Door variablen buiten quotes te halen bevorder je de leesbaarheid absoluut, maar dat heet geen escaping en het is best-practice om alles wat je opent zelf ook weer te sluiten (en dus niet te vertrouwen op de PHP engine die het zelf wel doet. Op het moment dat jij klaar bent met een resource, ware het een bestand of een MySQL connectie, moet je hem afsluiten met de daarvoor bedoelde functie.

Begrijp me niet verkeerd, niemand zeikt je af, beschouw het puur als opbouwende kritiek. PHP is jammergenoeg een taal waarin heel veel mensen hun eigen regeltjes bedenken, en het geven van code waarmee een database binnen een paar seconde verwijderd kan worden gaat dat niet verbeteren. Het kan gebeuren, het is een leertraject en er zijn doodgewoon heel veel dingen waarmee je rekening moet houden. Een fundamentele gedachte hierbij is dat externe input ($_SERVER['HTTP_*'], $_COOKIE, $_POST, $_GET etcetera) nooit, maar dan ook echt nooit vertrouwd moet worden, en je altijd moet filteren. PHP heeft sinds versie 5.2 een ingebouwde filter extensie daarvoor, dat werkt echt perfect.

Verder is het natuurlijk aan te raden om MySQLi of PDO te gebruiken. Beide libraries kunnen voor MySQL de nieuwe MySQLnd driver gebruiken wat de performance zeker kan verbeteren, plus ze bieden een mooie object-oriëntated interface.

[ Voor 5% gewijzigd door Peter op 17-05-2009 10:19 ]


Acties:
  • 0 Henk 'm!

  • MrNGm
  • Registratie: Augustus 2004
  • Laatst online: 01-09 13:45
Kijk, hier heb ik wat aan... Wat TRRoads deed was afzeiken zonder ook maar enige kennis van zaken te hebben of aan te geven wat er fout was.

Klopt dat mysql_real_escape_string() niet over de gehele SQL moest maar over de argumenten... Een simpel foreach loopje over $_POST waarden had dit beter kunnen oplossen.
Wat ik dan meestal doe, is voor de input name een key uit de database gebruiken (bijvoorbeeld <input type="text" name="log_commentaar" />) en dan mbv substr() alleen de waardes gebruiken die beginnen met log_. Vervolgens stop ik die waardes in een nieuwe array, met de key als index, gaat ongeveer 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
foreach ($_POST as $key => $value) {
  if (substr($key, 0, 4) == 'log_') {
    $key = mysql_real_escape_string($key);
    $data[$key] = mysql_real_escape_string($value);
  }
}
$SQL = 'INSERT INTO `tabel` (';
foreach ($data as $k => $v) {
  $SQL .= "'".$k."', ";
}
$SQL = substr($SQL, 0, strlen($SQL)-2);
$SQL .= ') ';

$SQL .= 'VALUES (';
foreach ($data as $key => $val) {
  $SQL .= "'".$val."', ";
}
$SQL = substr($SQL, 0, strlen($SQL)-2);
$SQL .= ')';
$query = mysql_query($SQL);
if (mysql_affected_rows() > 0) {
  header('Location: ./');
} else {
  die('Foutje: '.mysql_error());
}


Klopt ook dat mysql_affected_rows() geen argument meeneemt... Het zal het tijdstip geweest zijn (:z) en het feit dat ik meer van mijn eigen framework gebruik maak dan van losse functies. Om mysql_affected_rows() aan te roepen doe ik dan gewoon $this->db->Fetch($Query, 'affected'); en dan staat er wel leuk de $Query variabele, maar die wordt in de Fetch functie dan helemaal niet gebruikt. Het is altijd weer even wennen om 'normale' PHP code te schrijven.
Peter schreef op zondag 17 mei 2009 @ 10:17:
code:
1
if (isset($_POST) && !empty($_POST)) {


Dat is een vrij aparte manier om te kijken of er data is gepost naar de server. De $_POST variable wordt altijd aangemaakt. Zelfs in de CLI waar een POST onmogelijk is, en het zal altijd een array zijn. Het eerste deel van je if-statement zal dus altijd evalueren naar true. Een betere manier om te checken is, zoals iemand anders al voorgedragen heeft, de $_SERVER['REQUEST_METHOD'] te vergelijken met POST.
Het heeft bij mij altijd gewerkt. Ook al is de array aangemaakt, als er niks inzit dan returnt empty($_POST) uiteraard true, maar omdat ik wil dat deze juist false moet returnen, klopt het wel... Vandaar dat uitroepteken :)

Toevoeginkje:
Peter schreef op zondag 17 mei 2009 @ 10:17:
Ondanks dat je streven (uiteraard) goed is zitten er toch een aantal grote fouten in je script. Met één simpele request zou ik je gehele database leeg kunnen gooien, door de $_POST array direct te gebruiken (zonder te filteren) creeëer je een werkelijk enorm beveiligingslek, zoek ook eens op SQL Injection.
Klopt ook helemaal. In dit geval heb ik het SQL statement letterlijk overgenomen en eigenlijk alleen maar laten zien hoe je (ik) variabelen scheidt van tekst. Zelf doe ik dit overigens nooit, zie ook bovenstaand voorbeeld. Nog beter is om de tabelkeys al ergens te hebben, zodat je 1 bron minder aan SQL injectie gevoelige data moet gaan escapen. (voorbeeldje :+)

[ Voor 14% gewijzigd door MrNGm op 17-05-2009 13:34 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 10:36

Patriot

Fulltime #whatpulsert

kluyze schreef op zondag 17 mei 2009 @ 01:05:
Wat ik al eens gebruik in dit geval is een buffer.
PHP:
1
2
3
4
5
ob_start();
// code

ob_end_clean();
header(...);
In de code zet ik dan alle foutmeldingen in een string of array die ik op het einde in de sessie variabelen weg schrijf. Na de redirect kijk ik gewoon of er een foutmeling in de sessie zit en die druk ik dan af. (met kleurtjes ed.). Als er geen foutmelding aanwezig was laat ik de gebruiker weten dat de bewerking gelukt is.

Maar door alles in een buffer te steken en die te cleanen/verwijderen kan je ook geen toevallige foutmeldingen krijgen die de redirect tegen houden. Zo krijgt de gebruiker toch zijn oorspronkelijke pagina en een foutmelding wat er mis is gegaan. En kan de gebruiker ook gewoon onmiddelijk opnieuw proberen.
Je beschermt jezelf maar deels hiermee, je kunt altijd nog fouten tegenkomen die buiten de output buffer vallen. Het is eigenlijk sowieso niet zo verstandig om fouten zomaar te weergeven in je code. Je eigen error handler gebruiken en error reporting op 0 zetten (Of display_errors = Off in php.ini) is imho het verstandigst, zo heb je maximale controle over wat je wilt laten zien, en het ergste wat er kan gebeuren is dat een gebruiker een lege pagina te zien krijgt.

EDIT:
MrNGm schreef op zondag 17 mei 2009 @ 13:24:
[...]

Het heeft bij mij altijd gewerkt. Ook al is de array aangemaakt, als er niks inzit dan returnt empty($_POST) uiteraard true, maar omdat ik wil dat deze juist false moet returnen, klopt het wel... Vandaar dat uitroepteken :)
Het gaat er dan ook niet om dat het niet zou werken, het gaat erom dat het niet echt netjes is om zo'n nutteloos statement in je PHP-code te hebben staan.

[ Voor 16% gewijzigd door Patriot op 17-05-2009 13:40 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Peter schreef op zondag 17 mei 2009 @ 10:17:
code:
1
$sQuery = 'SELECT * FROM table WHERE foo=' . MySQL_Real_Escape_String ($bar);
Dit is niet veilig.
mysql_real_escape_string() is enkel voor het escapen van strings in een mysql query context. Dan moet het dus ook een string zijn, dus horen er quotes omheen in de query zelf. Als iemand nu foo de waarde '1 OR 1' geeft wordt je hele tabel geselecteerd. ;)

offtopic:
En laat de naam van php functies maar as is, die camel casing slaat nergens op.
MrNGm schreef op zondag 17 mei 2009 @ 13:24:
Klopt dat mysql_real_escape_string() niet over de gehele SQL moest maar over de argumenten... Een simpel foreach loopje over $_POST waarden had dit beter kunnen oplossen.
Escapen is context afhankelijk. Botweg een willekeurige escape functie over al je input halen raakt kan noch wal. Je bouwt nu enkel magic_quotes na, een feature welke gaat verdwijnen omdat deze bewezen vol gaten zit. :z

edit:
offtopic:
Ik had het niet over overbodige quotes. Ik geef enkel aan dat het botweg alles op dezelfde manier escapen zonder naar context te kijken nooit waterdicht kan zijn. Maar goed, dit topic gaat niet over escaping, en daar gaat op got ook nooit een topic over komen zonder hele volkstammen welke misinformatie moeten verspreiden.

[ Voor 14% gewijzigd door Voutloos op 17-05-2009 14:04 ]

{signature}


Acties:
  • 0 Henk 'm!

  • MrNGm
  • Registratie: Augustus 2004
  • Laatst online: 01-09 13:45
Voutloos schreef op zondag 17 mei 2009 @ 13:46:
Escapen is context afhankelijk. Botweg een willekeurige escape functie over al je input halen raakt kan noch wal. Je bouwt nu enkel magic_quotes na, een feature welke gaat verdwijnen omdat deze bewezen vol gaten zit. :z
Je moet het ook niet te moeilijk maken... TS wil een _simpel_ formuliertje met een database gebruiken, voor intern gebruik... Ik weet ook wel dat een integer niet tussen aanhalingstekens hoeft, maar wat maakt dat voor TS nu uit? Zijn redirect werkte niet en hij heeft hiervoor hulp gevraagd. Best practices komen wel bij de moeilijkere apps die wat afhankelijker van dingen zijn.

Het zijn ook slechts voorbeelden en geen copy/paste vanuit mijn framework. Maar 'nuff said hierover. Hoe ver is TS nu eigenlijk gekomen?

Acties:
  • 0 Henk 'm!

Verwijderd

MrNGm schreef op zondag 17 mei 2009 @ 13:24:
[...]
Kijk, hier heb ik wat aan... Wat TRRoads deed was afzeiken zonder ook maar enige kennis van zaken te hebben of aan te geven wat er fout was.
:z

Ja joh, wat jij wil. Ik ga niet vertellen wat er fout zit in jouw script omdat dat volledig offtopic is. Je hebt nu met je slechte voorbeeld al het hele topic gekaapt en dat is juist net niet de bedoeling.

Beetje raar om dan te zeggen dat ik geen kennis van zaken heb, dit kan gerust zo zijn maar niets wat ik heb gezegd kan dit aangeven. Jij hebt aan de andere kant in een uitgebreid voorbeeld laten zien dat jij geen kennis van zaken hebt. En hiermee breng je jouw bad practices over op iemand anders die wel wil leren.

Wat je hier ook aangeeft is dat het vooral niet te moeilijk gemaakt moet worden omdat de TS alleen een simpel formulier wil hebben. Je spreekt jezelf hiermee enorm tegen. Aan de ene kant geef je een volledig voorbeeld omdat je wil dat de TS er iets van leert. Maar aan de andere kant wil je em ook niet echt het juiste leren en vooral niet meer dan absoluut noodzakelijk want daar had de TS immers niet om gevraagd.

Het is geen scriptrequest wat je moet voldoen, zoiets is hier niet eens toegestaan. Ofwel help de TS op weg met goede tips en stuur eventueel wat aan in de juiste richting. Maar ga vooral niet de oplossing kant en klaar posten en dan al helemaal niet de foute oplossing.

[ Voor 30% gewijzigd door Verwijderd op 17-05-2009 14:07 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 10:36

Patriot

Fulltime #whatpulsert

Verwijderd schreef op zondag 17 mei 2009 @ 14:05:
[...]

En hiermee breng je jouw bad practices over op iemand anders die wel wil leren.
In principe is het natuurlijk wel zo dat het verwijzen naar 'de tutorials die wel te vinden zijn via google' ook niet echt handig is, omdat die ook bol staan van foute code en bad practices. In principe kun je dan beter zo'n reactie hebben waarin die gebruikt worden, dan kunnen gebruikers die wel beter weten zoiets direct opvangen door te vermelden waarom da fout/bad practice is. Als je mensen tutorials laat volgen komen ze drie weken later nog eens terug en dan ben je ook weer uren bezig met het verbeteren van veelgemaakte fouten/bad practices (om ze vervolgens direct weer van het kastje naar de muur te sturen door aan te geven dat ze de tutorials 'beter/opnieuw moeten lezen').
MrNGm schreef op zondag 17 mei 2009 @ 13:53:
[...]

Je moet het ook niet te moeilijk maken... TS wil een _simpel_ formuliertje met een database gebruiken, voor intern gebruik... Ik weet ook wel dat een integer niet tussen aanhalingstekens hoeft, maar wat maakt dat voor TS nu uit? Zijn redirect werkte niet en hij heeft hiervoor hulp gevraagd. Best practices komen wel bij de moeilijkere apps die wat afhankelijker van dingen zijn.
Het gaat natuurlijk om het principe. Je moet iemand geen foute dingen leren, daar schiet niemand iets mee op. Denk je dat de TS daarmee is geholpen, als hij iets fout leert? Volgende keer maakt hij een ander scriptje, dat doet hij met de kennis die hij hier opdoet. Vervolgens maakt hij daar een cruciale fout omdat jij gezegd heb dat het in dit geval 'wel zo kon', terwijl dat in dat geval misschien wel helemaal niet kan. De TS komt weer terug en krijgt vervolgens wéér een boel gezeik over zich heen, omdat jij vind dat het nu niet nodig is om het hem goed te leren?

Het is in het geval van deze TS misschien niet hoe het zal lopen, maar als ik je goed begrijp zou je dit in meerdere gevallen toepassen, en dat lijkt me geen goed plan.

[ Voor 41% gewijzigd door Patriot op 17-05-2009 14:27 ]


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 08:28
Ik kan de TS eigenlijk alleen maar aanraden een goed boek over php te nemen en te lezen, want sommige dingen die hier worden aangeraden zijn absoluut nonsense. De meeste dingen zijn gelukkig al enigzins gecorrigeerd, maar een paar opmerkingen wil ik toch wel maken:

- @MrNGm: Het maakt natuurlijk niet uit dat een script enkel een simpele taak heeft en alleen intern wordt gebruikt, je moet iemand gewoon geen foute dingen gaan aanleren. Bovendien lijkt me het niet zo'n goed idee om complete lappen code hier te posten. Het is primo niet de bedoeling van dit forum en secundo leert de TS er niets van. (zeker niet als er zoveel fouten inzitten, maar dat daargelaten)
- @kluyze: output buffering gebruiken om fouten te loggen en ze pas op een later tijdstip weer te geven lijkt me misbruik van output buffering. In PHP gebruiken we daar andere oplossingen voor: http://nl2.php.net/set_error_handler
- @MrNgM, nogmaals: een foreach op $_POST gebruiken om database input te escapen. Begrijp jij wel waarom je input moet escapen? Dit is absoluut geen garantie op een gelukte/veilige query. Denk alleen even aan de input van een integer veld. Daar gebruik je in je query gewoon quotes voor en je controlleert niet of er wel een cijfer inzit?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Modbreak:Kunnen we het hier een beetje gezellig houden A.U.B.

Het is geen probleem om opbouwende kritiek te hebben op aangedragen oplossingen, maar laten we het niet op de man gaan spelen.

Verder is het denk het belangrijkst om door te krijgen Waarom iets werkt of niet. En zoals ook al eerder gezegd, is het ook voor een interne applicatie belangrijk om op de veiligheid te letten, zeker als het niet veel meer werk is ( Maar misschien wat meer tijd kost om te snappen waarom het (niet) veilig is ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • MrNGm
  • Registratie: Augustus 2004
  • Laatst online: 01-09 13:45
doeternietoe schreef op maandag 18 mei 2009 @ 09:46:
- @MrNgM, nogmaals: een foreach op $_POST gebruiken om database input te escapen. Begrijp jij wel waarom je input moet escapen? Dit is absoluut geen garantie op een gelukte/veilige query. Denk alleen even aan de input van een integer veld. Daar gebruik je in je query gewoon quotes voor en je controlleert niet of er wel een cijfer inzit?
Lezen blijft nog steeds een kunst, ik heb gezegd dat het op die manier zou kunnen, verschillende datatypen daarbuiten gelaten. Heck, hier is genoeg over gezegd en ik ga me niet meer verantwoorden voor bepaalde stukken code die ik al dan niet goed of fout heb opgeschreven. Laat TS dan maar lekker prutsen, het zelf uitzoeken of een boek kopen, zoals jullie 'm aanraden, want daar leert ie van, en niet van complete codevoorbeelden waar tig fouten inzitten... 8)7 :O

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

MrNGm schreef op maandag 18 mei 2009 @ 12:32:
[...]


Lezen blijft nog steeds een kunst, ik heb gezegd dat het op die manier zou kunnen, verschillende datatypen daarbuiten gelaten.
Met alle respect, en nofi, maar lezen is inderdaad een kunst. In het gequote stukje tekst wordt juist aangegeven dat het maar bot escapen van de POST array juist niet zou kunnen. Escapen is context afhankelijk. Het is niet voor niks dat zelfs de mensen achter PHP ingezien hebben dat alles maar escapen misschien toch niet echt zo'n heel juiste oplossing was.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 10:36

Patriot

Fulltime #whatpulsert

MrNGm schreef op maandag 18 mei 2009 @ 12:32:
[...]


Lezen blijft nog steeds een kunst, ik heb gezegd dat het op die manier zou kunnen, verschillende datatypen daarbuiten gelaten. Heck, hier is genoeg over gezegd en ik ga me niet meer verantwoorden voor bepaalde stukken code die ik al dan niet goed of fout heb opgeschreven.
Zo hé! Dat is lekker makkelijk, gewoon wat slechte code neerplempen en dan zeggen dat het niet uitmaakt omdat je je er niet verantwoordelijk meer voor voelt? Je scriptjes gaan gewoon op meerdere punten de fout in. Niet zo erg dat je script (onder bepaalde voorwaarden) niet werkt, maar wel erg genoeg om een beginneling foute dingen te leren. Die past dat later toe in andere situaties en dan kan er zoveel meer misgaan.

Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
-

[ Voor 99% gewijzigd door Xanthium op 21-05-2009 23:38 ]


Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Je hebt een oud boek wat met allow globals werkt, een erg onveilige manier.

Je if $action moet een if isset($_POST['action']) worden, maar beter maak je gebruik van het controleren of er gepost is zonder op een speciale variabelenaam te controleren.

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
krvabo schreef op donderdag 21 mei 2009 @ 23:07:
Je hebt een oud boek wat met allow globals werkt, een erg onveilige manier.

Je if $action moet een if isset($_POST['action']) worden, maar beter maak je gebruik van het controleren of er gepost is zonder op een speciale variabelenaam te controleren.
hmm ja ik heb de code wat geherstructureerd en de redirect werkt inmiddels goed na de form submit. in principe gaat alles zoals het hoort, alleen de data wordt niet geupdate na het submitten. Dit is de huidige code:

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<?php

if($_SERVER['REQUEST_METHOD'] == 'POST'){

$db = mysql_connect("localhost", "iets", "iets");
mysql_select_db("iets");

$datum = mysql_escape_string(strip_tags($_POST['datum']));
$naamklant = mysql_escape_string(strip_tags($_POST['naamklant']));
$mobiel = mysql_escape_string(strip_tags($_POST['mobiel']));
$telvast = mysql_escape_string(strip_tags($_POST['telvast']));
$omschrijving = mysql_escape_string(strip_tags($_POST['omschrijving']));
$typenr = mysql_escape_string(strip_tags($_POST['typenr']));
$prijs = mysql_escape_string(strip_tags($_POST['prijs']));
$besteldbij = mysql_escape_string(strip_tags($_POST['besteldbij']));
$bestelddoor = mysql_escape_string(strip_tags($_POST['bestelddoor']));
$datumbesteld = mysql_escape_string(strip_tags($_POST['datumbesteld']));
$opmerkingen = mysql_escape_string(strip_tags($_POST['opmerkingen']));
$gebeld = mysql_escape_string(strip_tags($_POST['gebeld']));
$afgehandeld = mysql_escape_string(strip_tags($_POST['afgehandeld']));



$order_SQL_update="UPDATE klantenbestellingen SET 
datum='$datum',
naamklant='$naamklant',
mobiel='$mobiel',
telvast='$telvast',
omschrijving='$omschrijving',
typenr='$typenr',
prijs='$prijs',
besteldbij='$besteldbij',
bestelddoor='$bestelddoor',
datumbesteld='$datumbesteld',
opmerkingen='$opmerkingen',
gebeld='$gebeld',
afgehandeld='$afgehandeld' WHERE order_id='$order_id'";  

mysql_close();
header("Location: index.php");
exit; 


}else{
?>


<?
$db = mysql_connect("localhost", "iets", "iets");
mysql_select_db("iets");

$SQL_order="SELECT * FROM klantenbestellingen WHERE order_id=" . $_GET['order_id'];
$order_result=mysql_query($SQL_order);
$order=mysql_fetch_array($order_result);
?>


<html>
<head>
<title>Klantenorder Bijwerken</title>
<style type="text/css">
<!--
body,td,th {
    font-family: Arial, Helvetica, sans-serif;
    font-size: 10px;
    color: #000000;
}
body {
    background-color: #FFFFFF;
}
a:link {
    color: #000000;
    text-decoration: none;
}
a:visited {
    text-decoration: none;
    color: #000000;
}
a:hover {
    text-decoration: underline;
    color: #000000;
}
a:active {
    text-decoration: none;
    color: #000000;
}
-->
</style>
</head><body>
<a href="../index.php">Intranet</a> -> <a href="index.php">Klantenbestellingen</a> -> Bestelling bijwerken </p>
<p>&nbsp;</p>
<table width="565" border="0" cellspacing="0" cellpadding="0"><tr><td width="565" height="480"><form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
  <table width="565" border="0" cellspacing="0" cellpadding="0">
    <tr>
      <td>Datum aangenomen:</td>
      <td height="22"><input type="text" name="datum" value="<?php echo $order['datum'] ?>" maxlength="8" /></td>
    </tr>
    <tr>
      <td>Naam klant:</td>
      <td height="22"><input type="text" name="naamklant" value="<?php echo $order['naamklant'] ?>" maxlength="50"/></td>
    </tr>
    <tr>
      <td>Mobiel nummer:
        <label> </label></td>
      <td height="19"><input type="text" name="mobiel" maxlength="11" value="<?php echo $order['mobiel'] ?>" /></td>
    </tr>
    <tr>
      <td>Vast nummer:</td>
      <td height="22"><input type="text" name="telvast" maxlength="11" value="<?php echo $order['telvast'] ?>" /></td>
    </tr>
    <tr>
      <td>Omschrijving artikel:</td>
      <td height="22"><input type="text" name="omschrijving" value="<?php echo $order['omschrijving'] ?>" maxlength="50" /></td>
    </tr>
    <tr>
      <td>Typenr apparaat:</td>
      <td height="22"><input type="text" name="typenr" value="<?php echo $order['typenr'] ?>" maxlength="30" /></td>
    </tr>
    <tr>
      <td>Prijs:
        <label> </label></td>
      <td height="22"><input type="text" name="prijs" maxlength="10" value="<?php echo $order['prijs'] ?>" /></td>
    </tr>
    <tr>
      <td>Besteld bij:</td>
      <td height="22"><input type="text" name="besteldbij" value="<?php echo $order['besteldbij'] ?>" maxlength="30" /></td>
    </tr>
    <tr>
      <td>Besteld door:</td>
      <td height="22"><input type="text" name="bestelddoor" maxlength="30" value="<?php echo $order['bestelddoor'] ?>" /></td>
    </tr>
    <tr>
      <td>Datum besteld:</td>
      <td height="19"><input type="text" name="datumbesteld" id="datumorder" value="<?php echo $order['datumbesteld'] ?>" maxlength="8" /></td>
    </tr>
    <tr>
        <td>Klant gebeld:</td>
        <td height="19"><select name="gebeld" selected="<?php echo $order['gebeld'] ?>"><option value="Ja">Ja</option><option value="Nee">Nee</option><option value="N.B.">N.B.</option></select>
    <tr>
    <tr>
        <td>Order afgehandeld:</td>
        <td height="19"><select name="afgehandeld" selected="<?php echo $order['afgehandeld'] ?>"><option value="Ja">Ja</option><option value="Nee">Nee</option><option value="N.B.">N.B.</option></select>
    <tr>
      <td>Opmerkingen:</td>
      <td height="83"><textarea name="opmerkingen" cols="45" rows="5" maxlength="300"><?php echo $order['opmerkingen'] ?></textarea></td>
    </tr>
    <tr>
      <td width="152"></td>
      <td width="413" height="62"><label></label>
        <p>
            <input type="BUTTON" value="Annuleren" 
onclick="history.go(-1)" />
            <label>
            <input type="submit" value="Bijwerken" onclick="this.disabled = true" />
            </label>
        </p></td>
    </tr>
  </table><input type="hidden" name="order_id" value="<?php echo $order['order_id'] ?>">
  </form></td>
  </tr>
</table>
</body></html>


<?php
mysql_close();
}
?>


Ik heb al meerdere keren lopen pielen met de SQL update opdracht maar niks helpt :?

Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Je voert de query dan ook niet uit ;)
Je stelt hem alleen op :P

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
krvabo schreef op donderdag 21 mei 2009 @ 23:43:
Je voert de query dan ook niet uit ;)
Je stelt hem alleen op :P
haha beginnersfout O+

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql_query("UPDATE klantenbestellingen SET 
datum='$datum',
naamklant='$naamklant',
mobiel='$mobiel',
telvast='$telvast',
omschrijving='$omschrijving',
typenr='$typenr',
prijs='$prijs',
besteldbij='$besteldbij',
bestelddoor='$bestelddoor',
datumbesteld='$datumbesteld',
opmerkingen='$opmerkingen',
gebeld='$gebeld',
afgehandeld='$afgehandeld' WHERE order_id='$order_id'");


mysql_close();
header("Location: index.php");
exit;


werkt nog steeds niet though... zelfde gedrag nog steeds :(

[ Voor 196% gewijzigd door Xanthium op 21-05-2009 23:54 ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Als ik mysql_close() hier gebruik op mijn webserver dan werkt alles ook niet meer, misschien als je die eruit kan halen kijken of die het dan wel doet.

Maar goed, ik heb ook even naar je query gekeken, zelf vind ik het altijd overzichtelijker als je buiten de quotes werkt. Dan word het ook een stuk overzichtelijker als het goed is.

PHP:
1
2
3
4
5
6
7
8
9
10
mysql_query("UPDATE klantenbestellingen SET 
datum='" . $datum . "', naamklant='" . $naamklant . "', mobiel='" . $mobiel . "', telvast='" . $telvast . "',
omschrijving='" . $omschrijving . "', typenr='" . $typenr . "', prijs='" . $prijs . "', besteldbij='" . $besteldbij . "',
bestelddoor='" . $bestelddoor . "', datumbesteld='" . $datumbesteld . "', opmerkingen='" . $opmerkingen . "',
gebeld='" . $gebeld . "', afgehandeld='" . $afgehandeld . "' 
WHERE 
order_id='" . $order_id . "'");

header("Location: index.php");
exit;


PS: dit is al reeds eerder gezegd maar goed.

Acties:
  • 0 Henk 'm!

  • Xanthium
  • Registratie: September 2005
  • Laatst online: 25-07 11:59
bedankt voor de tip :) maar het script reageert helaas nog steeds hetzelfde na het invoeren van je tips.. eigenaardig taaltje dat PHP af en toe... :|

[ Voor 63% gewijzigd door Xanthium op 22-05-2009 00:06 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je hebt ook geen enkele vorm van foutafvanging erin, dan is het logisch dat je niet ziet waarom het niet werkt.

Voeg foutafhandeling aan het uitvoeren van de query toe dan zul je zien dat MySQL jou precies kan vertellen waarom het niet werkt.

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 10:36

Patriot

Fulltime #whatpulsert

Xanthium schreef op vrijdag 22 mei 2009 @ 00:06:
[...]


bedankt voor de tip :) maar het script reageert helaas nog steeds hetzelfde na het invoeren van je tips.. eigenaardig taaltje dat PHP af en toe... :|
Het ligt aan het feit dat $order_id niet bestaat in de context van die query, PHP staat waarschijnlijk op dit moment zo ingesteld dat hij daar niet over zeikt en vervangt het door niets, je krijgt dus effectief deze query:

SQL:
1
UPDATE [...] WHERE order_id = ''


@MrNGm: Ook meteen een heel erg goede reden waarom je om een integer de haakjes weg moet laten. Door de haakjes leek de query te werken. Zelfs met goede foutafvanging was het resultaat hetzelfde geweest (namelijk geen update). Als de haakjes er niet stonden zou de query niet eens draaien.

Acties:
  • 0 Henk 'm!

  • MichelG
  • Registratie: Januari 2004
  • Laatst online: 20-09 00:26
SQL verwerking:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$username="iets";
$password="iets";
$database="iets";

mysql_connect(localhost,$username,$password);


@mysql_select_db($database);


$query = "INSERT INTO `klantenbestellingen` (datum, naamklant, telnr, artomschrijving, typenr, prijs, besteldbij, bestelddoor, datumorder, gebeld, afgehandeld, opmerkingen) VALUES ('$_POST[datum]', '$_POST[naamklant]', '$_POST[telnr]', '$_POST[artomschrijving]', '$_POST[typenr]', '$_POST[prijs]', '$_POST[besteldbij]', '$_POST[bestelddoor]', '$_POST[datumorder]', '$_POST[gebeld]', '$_POST[afgehandeld]', '$_POST[opmerkingen]')";

mysql_query($query);

mysql_close
?>

<?
header("Location: index.php"); 
?>
Om een header("Location functie .... te laten werken. Mag er geen enkel stukje html in de pagina staan. Zowel geen php foutmeldingen als witte regels. Zo zou in jou geval regel 18 verwijderen al de oplossing zijn. Met de rest van je code bemoei ik me niet, maar dat is wat ik zie ....
Pagina: 1