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:

administratie0.php
<?php										
if (isset($_POST['knop_opslaan']))	{
	$aantal['aantal'] = $aantal['aantal'] + 1;
	include("administraties1.php");

} else {
	?><form action="index.php" method="post">
	<p><B>Voer hier de administratie gegevens in.<B></p>												
	<table>
	<tr><td>
	<div class="pf">Naam</div></td><td><input type="text" id="adm_naam" name="adm_naam" value="" tabindex="1" size="107"> 
	</td></tr><tr><td>
	<div class="pf">Straat + Huisnummer</div></td><td><input type="text" id="adm_straat" name="adm_straat" value="" tabindex="2" size="90"> 
	<input type="text" id="adm_huisnummer" name="adm_huisnummer" value="" tabindex="3" size="10">
	</td></tr><tr><td>
	<div class="pf">Postcode + Plaats</div></td><td><input type="text" id="adm_postcode" name="adm_postcode" value="" tabindex="4" size="7">
	<input type="text" id="adm_Plaats" name="adm_Plaats" value="" tabindex="5" size="93">
	</td></tr><tr><td>
	<div class="pf">Telefoonnr</div></td><td><input type="text" id="adm_telefoonnr" name="adm_telefoonnr" value="" tabindex="6" size="20">
	</td></tr><tr><td>
	<div class="pf">KvK</div></td><td><input type="text" id="adm_kvk" name="adm_kvk" value="" tabindex="7" size="20">
	</td></tr><tr><td>
	<div class="pf">BTWnr</div></td><td><input type="text" id="adm_btwnr" name="adm_btwnr" value="" tabindex="8" size="20">
	</td></tr><tr><td>
	<div class="pf">Website</div></td><td><input type="text" id="adm_website" name="adm_website" value="" tabindex="9" size="107">
	</td></tr><tr><td>
	<div class="pf">e-mail</div></td><td><input type="text" id="adm_email" name="adm_email" value="" tabindex="10" size="107">
	</td></tr><tr><td>
	<input type="reset" value="Velden legen" id="knop_reset" name="knop_reset" alt="Alle velden terug zetten in de default waarde" tabindex="11">
	</td><td>
	<input type="submit" value="Opslaan"; id="knop_opslaan" name="knop_opslaan" alt="Administratie opslaan" tabindex="12">
	<?php
}
if (isset($_POST['knop_opslaan'])) {
	$query01 = "INSERT INTO tabel_administraties (	
	administraties_naam, administraties_straat, administraties_huisnr, administraties_postcode, administraties_plaats, administraties_telefoonnr, administraties_kvk, administraties_btwnr, administraties_email
	) VALUES (
	'" . $_POST["adm_naam"] . "', '" . $_POST["adm_straat"] . "', '" . $_POST["adm_huisnummer"] . "', '" . $_POST["adm_postcode"] . "', '" . $_POST["adm_Plaats"] . "', '" . $_POST["adm_telefoonnr"] . "', '" . $_POST["adm_kvk"] . "', '" . $_POST["adm_btwnr"] . "', '" . $_POST["adm_website"] . "', '" . $_POST["adm_email"] . "');";
	$stmt = $dbh->prepare($query01);
	$stmt->execute();
}?>
</table>
</form>


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>";	
?>


Wie heeft er een tip.

Alvast bedankt.
Hier ben ik weer. Ik heb weer een hoop gepuzzeld, en een hoop geleerd.
Maar nu zit ik vast op waarschijnlijk iets kleins.
Ik kom op de pagina administraties0.php?id=1
Dan krijg ik alles goed in beeld en doe een mutatie in 1 of meer velden. en klik op opslaan.
Als ik dan in de database kijk, is er niets gebeurd.
Ikmoet dus ergens een foutje hebben. Maar waar?

Dit is de code van administraties0.php
<?php
include("databaseopenen.php");

// functie die de formuliervelden valideert en foutmeldingen aanmaakt
function validate($naam, $email) {
	$errors = array();
	
	// validatieregels voor de naam
	if(strlen($naam) < 1) {
		$errors[] = 'U heeft geen naam ingevuld.';
	}
	
	// validatieregels voor het mailadres
	if(!strlen($email)) :
		$errors[] = 'U heeft geen email adres ingevuld.';
	elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)):
			$errors[] = 'U heeft een ongeldig email adres ingevuld.';
	endif;
	
	// geef de array met foutmeldingen terug
	return $errors;
}

$errors = array();
if (isset($_GET["id"])) {
	//Dit kan alleen uitgevoerd worden als id is ingegeven bij de url
	$adm_id = intval($_GET['id']);
	$stmt = $dbh->prepare("SELECT * FROM tabel_administraties WHERE administraties_id=" . $adm_id . " LIMIT 1");
	$stmt->execute();
	//PDO::FETCH_ASSOC: returns an array indexed by column name as returned in your result set 
	$record = $stmt->fetch(PDO::FETCH_ASSOC);
	$adm_naam = $record['administraties_naam'];
	$adm_straat = $record['administraties_straat'];
	$adm_huisnummer = $record['administraties_huisnr'];
	$adm_postcode = $record['administraties_postcode'];
	$adm_plaats = $record['administraties_plaats'];
	$adm_telefoonnr = $record['administraties_telefoonnr'];
	$adm_kvk = $record['administraties_kvk'];
	$adm_btwnr = $record['administraties_btwnr'];
	$adm_website = $record['administraties_website'];
	$adm_email = $record['administraties_email'];
} else {
	//id is niet meegegeven bij de url dus is het een nieuw record
	$adm_id = "nieuw";
	$adm_naam = "";
	$adm_straat = "";
	$adm_huisnummer = "";
	$adm_postcode = "";
	$adm_plaats = "";
	$adm_telefoonnr = "";
	$adm_kvk = "";
	$adm_btwnr= "" ;
	$adm_website = "";
	$adm_email = "";
}
		
// indien het formulier verstuurd is
if($_SERVER['REQUEST_METHOD'] == 'POST') {
	
	// valideer de ingevulde gegevens
	$errors = validate($_POST["adm_naam"], $_POST["adm_email"]);

	// als er dan geen fouten zijn ga na het opslaan naar index.php
	if(!count($errors)) {
		if (isset($_GET["id"])) {
			$query03 = "UPDATE tabel_administraties SET administraties_naam = :administraties_naam,
											administraties_straat = :administraties_straat, 
											administraties_huisnr = :administraties_huisnr, 
											administraties_postcode = :administraties_postcode, 
											administraties_plaats = :administraties_plaats, 
											administraties_telefoonnr = :administraties_telefoonnr, 
											administraties_kvk = :administraties_kvk, 
											administraties_btwnr = :administraties_btwnr, 
											administraties_website = :administraties_website, 
											administraties_email = :administraties_email
					WHERE administraties_id = :administraties_id";
			$stmt->bindParam(':administraties_id',$adm_id);
			$link1 = "index.php?id=" . $adm_id;				
		} else {
			$query03 = "INSERT INTO tabel_administraties (	
			administraties_naam, administraties_straat, administraties_huisnr, administraties_postcode, administraties_plaats, administraties_telefoonnr, administraties_kvk, administraties_btwnr, administraties_website, administraties_email
			) VALUES (	
			:administraties_naam, :administraties_straat, :administraties_huisnr, :administraties_postcode, :administraties_plaats, :administraties_telefoonnr, :administraties_kvk, :administraties_btwnr, :administraties_website, :administraties_email
			)";
			$link1 = "index.php";				
		}
		//gegevens opslaan in de database
		$stmt->bindParam(':administraties_naam',$_POST["adm_naam"]);
		$stmt->bindParam(':administraties_straat',$_POST["adm_straat"]);
		$stmt->bindParam(':administraties_huisnr',$_POST["adm_huisnummer"]);
		$stmt->bindParam(':administraties_postcode',$_POST["adm_postcode"]);
		$stmt->bindParam(':administraties_plaats',$_POST["adm_plaats"]);
		$stmt->bindParam(':administraties_telefoonnr',$_POST["adm_telefoonnr"]);
		$stmt->bindParam(':administraties_kvk',$_POST["adm_kvk"]);
		$stmt->bindParam(':administraties_btwnr',$_POST["adm_btwnr"]);
		$stmt->bindParam(':administraties_website',$_POST["adm_website"]);
		$stmt->bindParam(':administraties_email',$_POST["adm_email"]);$stmt = $dbh->prepare($query03);
		$stmt->execute();
		//PDO::FETCH_ASSOC: returns an array indexed by column name as returned in your result set 
		$record = $stmt->fetch(PDO::FETCH_ASSOC);
		
		header('Location: '.$link1);
		exit;
	}
}

?><!DOCTYPE html>				
<html>
<head>
	<meta charset="utf-8">
	<title>administraties0</title>
	<link rel="stylesheet" type="text/css" href="css/style.css">    
</head>
<body>
<?php 
	if(count($errors)) {
	echo '<ul id="errors">';
	foreach($errors as $error) {
		echo '<li>' . $error . '</li>';
	}
	echo '</ul>';
	echo '<pre>' . print_r($record, true) . '</pre>';
}
?>
	<table class="empty">
		<tr>
			<td width="250" class="vak1">
			</td>
			<td class="programmadeel">
				<form action="" method="post">
				<h1><B>Administratie (<?php echo $adm_id; ?>)<B></h1>												
				<table>
				<tr><td>
				<div class="pf">Naam : </div></td><td><input type="text" id="adm_naam" name="adm_naam" tabindex="1" size="107"   value="<?php echo $adm_naam; ?>"> 
				</td></tr><tr><td>
				<div class="pf">Straat + Huisnummer : </div></td><td><input type="text" id="adm_straat" name="adm_straat" tabindex="2" size="90"  value="<?php echo $adm_straat; ?>"> 
				<input type="text" id="adm_huisnummer" name="adm_huisnummer" tabindex="3" size="10"  value="<?php echo $adm_huisnummer; ?>">
				</td></tr><tr><td>
				<div class="pf">Postcode + Plaats : </div></td><td><input type="text" id="adm_postcode" name="adm_postcode" tabindex="4" size="7"  value="<?php echo $adm_postcode; ?>">
				<input type="text" id="adm_Plaats" name="adm_plaats" tabindex="5" size="93"  value="<?php echo $adm_plaats; ?>">
				</td></tr><tr><td>
				<div class="pf">Telefoonnr : </div></td><td><input type="text" id="adm_telefoonnr" name="adm_telefoonnr" tabindex="6" size="20"  value="<?php echo $adm_telefoonnr; ?>">
				</td></tr><tr><td>
				<div class="pf">KvK : </div></td><td><input type="text" id="adm_kvk" name="adm_kvk" tabindex="7" size="20"  value="<?php echo $adm_kvk; ?>">
				</td></tr><tr><td>
				<div class="pf">BTWnr : </div></td><td><input type="text" id="adm_btwnr" name="adm_btwnr" tabindex="8" size="20"  value="<?php echo $adm_btwnr; ?>">
				</td></tr><tr><td>
				<div class="pf">Website : </div></td><td><input type="text" id="adm_website" name="adm_website" tabindex="9" size="107"  value="<?php echo $adm_website; ?>">
				</td></tr><tr><td>
				<div class="pf">e-mail : </div></td><td><input type="text" id="adm_email" name="adm_email" tabindex="10" size="107"  value="<?php echo $adm_email; ?>">
				</td></tr><tr><td>
				<input type="reset" value="Velden legen" id="knop_reset" name="knop_reset" alt="Alle velden terug zetten in de default waarde" tabindex="11">
				</td><td>
				<input type="submit" value="Opslaan"; id="knop_opslaan" name="knop_opslaan" alt="Administratie opslaan" tabindex="12">
				</table>
				</form>
			</td>
		</tr>
	</table>
</body>
</html>
1: waarom zit je nog steeds te knoeien met het rechtstreeks opbouwen van een query in prepare? Zie regel 28.
2: Wat doe je op regel 97? Je preparet daar opnieuw, en correct me if I'm wrong, maar volgens mij verlies je dan al je binds.
3: Pas eens wat foutafhandeling toe, ga er niet klakkeloos vanuit dat queries slagen, maar controleer dat ook.
Als je het formulier post heb je dan nog wel een id in de url staan?
bedankt voor jullie antwoorden.

Ben van Velzen,
De Prepare zal ik verbeteren.
Regel 97 gaat over de e-mail in de bind plaatsen. Ik denk niet dat je die bedoelt. Welke bedoel je wel? En hoe kan ik dat testen?
Gaan queries waarvan je het antwoord al weet dan wel eens fout? Ik bedoel, als ik een record heb, en dat record aan de hand van de id oproep, dan gaat het toch niet mis?

-San The -,
Ik denk het wel, want als ik na het bewerken op opslaan klik, ga ik met header naar index.php en in de url staat dan ook het idnummer.
Maar misschien komt die daar op een andere manier. en heb je wel gelijk. Maar hoe test ik dat?
Aan het einde van regel 97 staat dit:
<?php
stmt = $dbh->prepare($query03);
?>
En ik denk niet echt dat dat daar hoort.
Technisch gezien mag toch alles achter elkaar? Alleen voor de leesbaarheid is dat lastig?
Maar ik snap wat je bedoelt. Ik probeer het uit.
Ja, alleen moet je de volgorde wel in acht nemen. Eerst prepare, dan bind. Niet andersom.
Maar helaas, Dat was niet de oplossing. Is er misschien iets waarmee ik eerst het updaten moet activeren?
Nee. Wat je wel moet doen is foutafhandeling inbouwen en eventuele foutmeldingen laten weergeven. Een eenvoudige manier om dit te doen is $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); te gebruiken in je code, en exceptions af te vangen.

Reageren