Volgens mij is dit een geval van mezelf blind gestaard hebben, waardoor ik de fout niet meer zie.
Ik heb een pagina met items uit een database, waarbij ik een specifiek item kan selecteren via de id.
De code op de verzamelpagina:

<div class="page">
	<div class="leftmenu">
		<?php
			try {
				require_once ('../data/sql_link.php');
				$sql_select = "SELECT id,
									titel,
									introverhaal,
									verhaal,
									datum
								FROM verhalen
								ORDER BY datum";
				$stmt = $db->prepare($sql_select);
				$stmt -> execute(array());
				$results = $stmt->fetchAll();
				?>
				<dl class="leftmenu">
					<?php foreach ($results as $result) { ?>
						<dt><?php echo $result['datum']; ?></dt>
						<dd><?php echo $result['titel']; ?></dd>
						<?php
						}
					?>
				</dl>
				<?php
			}
			catch (PDOException $e) {
				print "Error!: ".$e->getMessage()."<br/>";
				echo 'Iets gaat niet goed.'; 
			} 		
		?>
	</div>
	<div class="article">
		<?php
			foreach ($results as $result) {?>
				<h3><?php echo $result['titel']; ?></h3>
				<?php echo $result['introverhaal'].'<br><span style="text-align:right; font-size:0,925em;"><a href="verhaal.php?id='.$result['id'].'">Lees verder...'.$result['id'].'</a></span><br><hr>';
			}	
		?>
	</div>
</div>

Via de link in dit script 'lees verder...', ga ik naar een nieuwe file. In de browser zie ik als adres: verhaal.php?id=.. en het juiste nummer behorend bij de link.
De code op die pagina die de rij uit de database moet ophalen van het bijbehorende id is:

<div class="page">
	<div class="leftmenu">
		<?php
			ini_set('display_errors',1); // 1 == on , 0 == off
			error_reporting(E_ALL | E_STRICT);

			session_start();
			if (!isset($_GET['id']) OR !ctype_digit($_GET['id'])) {
				echo '<p>Geen verhaal geselecteerd!</p>';
				//exit();
			}
			else {
				$id=$_GET['id'];
				try {
					require_once ('../data/sql_link.php');
					$sql_select = "SELECT id,
										titel,
										verhaal,
										datum
									FROM verhalen
									WHERE id=$id";
					$stmt = $db->prepare($sql_select);
					$stmt -> execute(array());
					$results = $stmt->fetchAll();?>
					<div class="article">
						<?php
							foreach ($results as $result) {?>
								<h3><?php echo $result['id'].' - '.$result['titel']; ?></h3>
								<?php echo $result['verhaal'];
							}
						?>
					</div>
					<?php
				}
				catch(PDOException $e) {
					echo $e->getMessage().'<p>Er is een probleem opgetreden, probeer het later nog eens. Als het probleem blijft bestaan neem contact op via de contactpagina.</p>'; 
					//exit();	
				}
			}
		?>
	</div>
</div>

De link werkt, ik krijg geen foutmeldingen, maar om de een of andere reden wordt niet de juiste rij uit de database geselecteerd. Ik krijg altijd de rij te zien met het laatste id-nummer.

Het is vast een stommiteit, maar ik zie niet waar de fout zit. Kan iemand me helpen?
Weet je zeker dat de URL bij verhaal.php?id=$id klopt? (linken alle URLs niet gewoon naar het laatste id?) Het kan zijn dat twee keer een foreach gebruiken op dezelfde dataset het probleem is (ik heb dit ook wel eens gehad, blijkbaar werkt het net iets anders als je de gegevens in de array uit de database haalt).

Verder doe je volgens mij nog een aantal rare dingen:

- Je gebruikte execute met als parameter een lege array?
- Waarom gebruik je geen prepared statements? je bent nu vatbaar voor SQL injection
- Je gebruikt FetchAll terwijl je ook een WHERE gebruikt, dat is raar want je verwacht dus maar één row terug, dan kun je beter fetch gebruiken.

Reageren