Door
Frits van Leeuwen
op 24-08-2017 21:31
gewijzigd op 24-08-2017 23:15
6.312 views
Hallo allemaal,
Dit is merkwaardig.
Ik heb een case die reageert op 0 records, 1 record en meer dan1 record.
Als er geen record is, en dat is ook zo, toont hij een form.(administratie0.php)
Die verlaat ik na het invullen door op opslaan te klikken en dan wordt een query uitgevoerd:
Dit werkt, want daarna zie ik in de tabel 1 record staan.
Maar aansluitend wil ik de informatie in een ander form weer tonen. Maar die blijkt dan leeg te zijn, terwijl ik toch echt een gevuld record in de tabel zie staan. Met F5 krijg ik het wel in beeld.
Als ik het hele programma opnieuw start, kom ik weer door de case, maar dit keer ziet hij dat er 1 record is en toont hij die met het zelfde form als dat ik eerder gebruikte nadat ik een record had toegevoegd. Maar dit keer zie ik het record wel in het form. Hier volgt de code om het ingevulde record te tonen.
administratie1.php
?php
$query01 = "SELECT * FROM tabel_administraties";
$stmt = $dbh->prepare($query01);
$stmt->execute();
//PDO::FETCH_ASSOC: returns an array indexed by column name as returned in your result set
$record = $stmt->fetch(PDO::FETCH_ASSOC);
echo "<table>";
echo "<tr><td>Administratie van: </td><td>" . $record['administraties_naam'] . "</TD></TR>";
echo "<tr><td>adres is: </td><td>" . $record['administraties_straat'] . " " . $record['administraties_huisnr'] . "</TD></TR>";
echo "<tr><td></td><td>" . $record['administraties_postcode'] . " " . $record['administraties_plaats'] . "</TD></TR>";
echo "<tr><td>Telefoonnr.: </td><td>" . $record['administraties_telefoonnr'] . "</TD></TR>";
echo "<tr><td>K.v.K. nr.: </td><td>" . $record['administraties_kvk'] . "</TD></TR>";
echo "<tr><td>B.T.W. nr.: </td><td>" . $record['administraties_btwnr'] . "</TD></TR>";
echo "<tr><td>e-mail adres: </td><td>" . $record['administraties_email'] . "</TD></TR>";
echo "</table>";
?>
Ik vermoed dat we nog iets missen (de switch/case waar je het over hebt, waar komt die $aantal['aantal'] vandaan, enz), maar met bovenstaande denk ik dat er dit gebeurt:
- administratie0.php#4: Hier toon je de informatie via administraties1.php. Die is dan echter nog niet opgeslagen (= leeg).
- administratie0.php#34+: Hier sla je de informatie pas op.
Daarom zie je de info een 2e keer wel; als ie dan langs regel 4 komt is er wel wat te tonen.
Je zult je 'opslaan' code (blok na regel 34) dus voor je 'toon' code (regel 4) moeten plaatsen (meestal is het sowieso handig om eerst alle 'afhandeling' te doen, en dan pas met je presentatie/weergave aan de slag te gaan.
Verder kun je nog naar SQL-injectie kijken (voer maar eens een "'s Hertogenbosch" in) en Cross Site Scripting (voer maar eens <script>alert("XSS")</script> in).
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
?>
<!DOCTYPE html>
<html>
<head>
<title>Basisbestand</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<header>
</header>
<content>
<?php
include("databaseopenen.php");
echo $b['algemeen']['programmanaam'] . " " . $b['algemeen']['versienummer'];
?>
<table class="empty">
<tr>
<td width="240" class="vak1">
</td>
<td class="programmadeel">
<form action="index.php" method="post">
<?php
if ($file_exist) {
$einde = false;
//aantal record tellen in een tabel
do {
$query00 = "SELECT COUNT(*) as aantal FROM tabel_administraties";
$stmt = $dbh->prepare($query00);
$stmt->execute();
//PDO::FETCH_ASSOC: returns an array indexed by column name as returned in your result set
$aantal = $stmt->fetch(PDO::FETCH_ASSOC);
switch($aantal['aantal']) :
case 0:
include("administraties0.php");
break;
case 1:
include("administraties1.php");
break;
default:
echo "<p>Er zijn meerdere administraties aanwezig.</p>";
//hier volgt een keuze knop van administraties
break;
endswitch;
} while ($einde);
} else {
echo "<p>Vermoedelijk is er iets mis gegaan bij de installatie.</p>";
//knop naar de installatie
echo "<p><button type="submit" formaction=install.php>Click hier om te installeren</button></p>";
}?>
</form>
</td>
</tr>
</table>
</content>
<footer>
</footer>
</body>
</html>
Er zijn geen records aanwezig en ik ga dan naar administraties0.php Er is nog niet op opslaan geklikt, dus val ik eerst in het invulscherm.
Daar vul ik de gegevens in en klik op opslaan.
(Als ik in de tabel kijk, zie ik dat hij daadwerkelijk is opgeslagen.)
Als ik dan opnieuw administraties0.php in ga, is de knop opslaan dus aangeklikt en open ik dus administraties1.php en wordt dit gepubliceerd als of er niets is ingevuld. (Na F5 zie ik in administraties1.php wel het ingevulde record.)
Als ik in de browser het tabblad sluit en opnieuw index.php open, krijg ik ook direct administraties1.php opgestart met daarin het ingevulde record.
- één URL is één pagina. Een indexpagina waar dus een keuze gemaakt kan worden uit verschillende administraties OF een formulier A getoond wordt OF formulier B getoond wordt is een slechte keuze. Maak hier aparte pagina's van en gebruik een REDIRECT om de gebruiker door te sturen naar een andere pagina als dat nodig is.
- Laat formulieren POSTEN naar dezelfde URL. Dus op pagina mysite.nl/new-administration.php post je je formulier naar dezelfde url: ook mysite.nl/new-administration.php. Je action attribuut kun je dan gewoon leeg laten <form action="" method="post">.
- gebruik if($_SERVER['REQUEST_METHOD'] == 'POST') om te checken of je formulier verzonden is
- Nadat een formulier verzonden is ga je de verzonden data VALIDEREN. Dat wil zeggen dat je de invoer controleert op onjuistheden en als die er zijn toon je je formulier opnieuw met een foutmelding. (handig feitje is dat je toch nog steeds op dezelfde URL bent gebleven). Als de gegevens correct zijn doe je wat nodig is zoals gegevens opslaan in de database of het verzenden van een email.
- Nadat een formulier voltooid en verwerkt is REDIRECT ALTIJD de gebruiker. Hiermee voorkom je voor een belangrijk deel dat formulieren twee of meerdere keren in je database toegevoegd worden. Bovendien zal je gebruiker niet meer zo een vervelende alert van zijn browser krijgen met de vraag of die de gegevens opnieuw wil indienen.
- Zet de HTML of de OUTPUT van je webpagina helemaal onder in. Bovenin je code komt je PHP logica (bijvoorbeeld om je formulier te verwerken)
Zo zo.... dat is een hoop informatie. Hier krijg ik een lesje internet programmeren. bedankt hier voor.
Als ik het zo lees, lijkt het me allemaal wel heel logisch. Ik zal mijn kijk op het php programmeren wat moeten wijzigen. Ik begon al steeds meer het gevoel te krijgen dat ik een andere weg in moest slaan, maar zover was ik nog niet. Heb je ook wat tips op dat REDIRECT? Want daar heb ik wel oren naar. Onnodig klikken vind ik niet fijn in mijn programma.
Twee belangrijke dingen:
- voordat je de header() functie gebruikt mag je nog geen enkele OUTPUT verzonden hebben. Dat wil zeggen: geen HTML en geen echo's. ook geen spatie e.d. Dat is (o.a.) waarom ik ook hamer op php logica boven in je code en output onder in je code.
- voeg ook een exit() toe na een redirect om je code dan ook werkelijk te beëindigen.
Na de boel gereorganiseerd te hebben d.m.v. jouw aanwijzingen, werkt het. Bedankt.
Ook zijn mijn pagina's duidelijke en overzichtelijker geworden (in de code natuurlijk)
De uitgebreide uitleg die ik kreeg, verwerk ik beetje bij beetje en ik hoop dat ik hier mee ook tot een goed code ga komen. Toch vind ik het nog wat lastig.
Door het verder doorvoeren van dat wat ik er van heb begrepen of dacht begrepen te hebben, kreeg ik een oud probleem weer terug.
Als ik nu op "opslaan" klik, krijg ik weer een scherm, waarin alle velden van het form weer leeg zijn.
Ook in de database is het nu niet opgeslagen. De nieuwe versie van administratie0.php heb ik hier onder geplaatst. Is dit een beetje wat je bedoelde "Frans Nietbelangrijk"? En wie kan mij vertellen waar ik nu de mist in ga?
en dan kijk je of het formulier via POST verstuurd is:
if($_SERVER['REQUEST_METHOD'] == 'POST') {
Best onlogisch.
Gebruik enkel alleen maar de tweede manier met REQUEST_METHOD bovenaan je script.
Verder lijkt het mij niet de bedoeling of de redirecten naar index, want zo gaat je $_POST waarde verloren, die je prima gebruiken in je formulier, om de ingevulde velden automatisch in te vullen als de validatie niet klopt.
gebruik, weet de pagina toch niet welke knop ik gedrukt heb? En onderaan werd mij geadviseerd om zo min mogelijk php code te hebben. Dus ik breng veel naar de bovenkant van de code.
Ik wil de input die op dit formulier gegeven wordt, in een database hebben, die ik vervolgens op index.php weer uitlees en ga tonen. Dit werkt al wel. Door het omgooien van de structuur bedacht ik weer nieuwe mogelijkheden. En 1 daar van is het presenteren van de administratie op de eerste pagina. En dat gedeelte werkt al wel.