Ik heb een pagina aangemaakt dat gebruikers gegevens kunnen bewerken maar er viel mij iets op dat je vanaf urlbalk andere regels (en ook ids wat nog niet bestaat) van tabellen kunt bewerken terwijl dat de bedoeling niet is of je voert zomaar bijvoorbeeld letters er achter id= dan zie je nog steeds geen foutmelding.

Hoe zorg ik er voor dat je geen id uit je hoofd kan invoeren en overbodige letters met andere leestekens blokkeren?

Dit helpt bij mij niet:
bindParam(1,is_numeric($_GET['id']))

en dit:
is_numeric(bindParam(1,$_GET['id']))


Beetje opgeschoond om het kleiner te krijgen:
<?PHP
session_start();
if (!(isset($_SESSION['user_login_status']) && $_SESSION['user_login_status'] != '')) {
header ("Location: index.php");
	}
		else 	{
		try {
$dbc = new PDO('mysql:host=localhost; dbname=', '', '');
	} catch (PDOException $e) {
	echo "Error: " . $e->getMessage();
	}
if(isset($_POST['submit_btn'])) {
	$query = "UPDATE tabel SET name=? WHERE id=?";
	$stmt = $dbc->prepare($query);
	$stmt->bindParam(1, $_POST['name']);
	$stmt->bindParam(2, $_POST['uid']);
	if($stmt->execute()) {
		echo "<script>alert('Record updated.');location.href='index.php'</script>";
	} else {
		die('Unable to update record.');
	}
} else {
try {
$query = "SELECT * FROM tabel WHERE id=?";
$stmt = $dbc->prepare($query);
$stmt->bindParam(1,$_GET['id']);
$stmt->execute();
$row=$stmt->fetch(PDO::FETCH_ASSOC);
$username = $row['user_name'];
$id = $row['id'];
	} catch(PDOException $e) {
	echo "Error: " . $e->getMessage();
	}
?>

<form id=".$row["id"]." action="" method="POST">
<input type="hidden" value="<?php echo $id; ?>" name="uid">
  <div class="container">

<div class="panel-heading">
<h3 class="panel-title">Gegevens</h3>
</div>
  <div class="panel-body">
    	<div class="row">
			<div class="col-md-6">
					<table class="table">		
					<tbody>

				<tr>
					<td>Naam</td>
					<td><input class="form-control" type="text" id="formGroupInputSmall" placeholder="Naam"name="username" value="<?php echo $username; ?>"/></td>
				</tr>
					</tbody>
					</table>
					<input class="btn btn-default"  type="submit" name="submit_btn" value="Bevestigen"/>
</form>
			</div>
		</div>
	</div>
  </div>
</body>
<?php
}?>
</html>
<?php
}
?>

<?PHP
session_start();
if (!(isset($_SESSION['user_login_status']) && $_SESSION['user_login_status'] != '')) {
    header ("Location: index.php");
}

// INITIALISATIE ID MET DEFAULTWAARDE 0
$id = 0;
if(isset($_GET['id'])) {
    $id = intval($_GET['id']);
}

// VALIDATIE VAN $id
if($id < 1) {
    echo 'Ongeldige GET parameter id';
}

try {
    $dbc = new PDO('mysql:host=localhost; dbname=', '', '');
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}
    
}
try {
    $query = "SELECT * FROM tabel WHERE id=?";
    $stmt = $dbc->prepare($query);
    $stmt->bindParam(1, $id);
    $stmt->execute();
    $row=$stmt->fetch(PDO::FETCH_ASSOC);
    $username = $row['user_name'];
    $id = $row['id'];
} catch(PDOException $e) {

// ALLEEN ROW VAN SESSIES IS TOEGESTAAN
if(isset($id)) {
    if($id == $row['user_id']) {
        wijzig_upload_bestand(); // BESTAND MAG NIET GROTER DAN *** ZIJN.
    } else {
        echo "Foei, stout, niet lief! Jij mag niet andermans spulletjes verwijderen.";
    }
} else {
    echo "Zonder ID kan ik niks!";
}

if(isset($_POST['submit_btn'])) { // HIER ZOU JE EERST NOG JE FORMULIER MOETEN VALIDEREN
    $query = "UPDATE tabel SET name=? WHERE id=?, user_id=$_SESSION['user_id']";
    $stmt = $dbc->prepare($query);
    $stmt->bindParam(1, $_POST['name']);
    $stmt->bindParam(2, $_POST['uid']);
    if($stmt->execute()) {
        echo "Geupdated";
    } else {
        echo "Probeer nogmaals";
    }
    
    // EEN GOEDE GEWOONTE IS OM NA HET VERWERKEN VAN EEN 'POST' TE REDIRECTEN
    header ("Location: lijst.php"); // KIES ZELF MAAR NAAR WELKE PAGINA JE WILT

    echo "Error: " . $e->getMessage();
}
?>

<form id="<?php echo $row["id"]; ?>" action="" method="POST">
<input type="hidden" value="<?php echo $id; ?>" name="mid">
          <div class="container">

<div class="panel-heading">
<h3 class="panel-title">Gegevens</h3>
</div>
  <div class="panel-body">
        <div class="row">
            <div class="col-md-6">
                    <table class="table">        
                    <tbody>

                <tr>
                    <td>Naam</td>
                    <td><input class="form-control" type="text" id="formGroupInputSmall" placeholder="Naam"name="username" value="<?php echo $username; ?>"/></td>
                </tr>
                    </tbody>
                    </table>
                    <input class="btn btn-default"  type="submit" name="submit_btn" value="Bevestigen"/>
</form>
            </div>
        </div>
    </div>
  </div>
</body>
</html>
Ik mis nog steeds een goede stroomlijn in de code. Probeer deze eens, dit is een stuk logischer opgebouwd en tevens ook overzichtelijker.


<?PHP
session_start();
if (!(isset($_SESSION['user_login_status']) && $_SESSION['user_login_status'] != '')) {
    header ("Location: index.php");
} else {
	// je bent ingelogd, vervolg de rest van de stappen..
	if(isset($_GET['id']) && $_GET['id'] > 0) {
		// controleer of het ID is ingevuld en groter is dan 0
		// VOER HIER DE REST VAN DE STAPPEN UIT!!!!!
	} else {
		echo "Er is geen ID-nummer ingevuld!";	
	}
	
}
?>

<?PHP
session_start();
if (!(isset($_SESSION['user_login_status']) && $_SESSION['user_login_status'] != '')) {
    header ("Location: index.php");
    exit();
} else {
    // je bent ingelogd, vervolg de rest van de stappen..
    if(isset($_GET['id']) && $_GET['id'] > 0) {
        // controleer of het ID is ingevuld en groter is dan 0
        // VOER HIER DE REST VAN DE STAPPEN UIT!!!!!
	try {
    $dbc = new PDO('mysql:host=localhost; dbname=', '', '');
	} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
	}
	
try {
    $query = "SELECT * FROM tabel WHERE id=?";
    $stmt = $dbc->prepare($query);
    $stmt->bindParam(1, $id);
    $stmt->execute();
    $row=$stmt->fetch(PDO::FETCH_ASSOC);
    $username = $row['user_name'];
    $id = $row['id'];
} catch(PDOException $e) {

if(isset($_POST['submit_btn'])) { // HIER ZOU JE EERST NOG JE FORMULIER MOETEN VALIDEREN
    $query = "UPDATE tabel SET name=? WHERE id=?, user_id=$_SESSION['user_id']";
    $stmt = $dbc->prepare($query);
    $stmt->bindParam(1, $_POST['name']);
    $stmt->bindParam(2, $_POST['uid']);
    if($stmt->execute()) {
        echo "Geupdated";
    } else {
        echo "Probeer nogmaals";
    }
    
    // EEN GOEDE GEWOONTE IS OM NA HET VERWERKEN VAN EEN 'POST' TE REDIRECTEN
    header ("Location: lijst.php"); // KIES ZELF MAAR NAAR WELKE PAGINA JE WILT

    echo "Error: " . $e->getMessage();
}
    } else {
        echo "Er is geen ID-nummer ingevuld!";    
    }
    
}
?>

<form id="<?php echo $row["id"]; ?>" action="" method="POST">
<input type="hidden" value="<?php echo $id; ?>" name="mid">
          <div class="container">

<div class="panel-heading">
<h3 class="panel-title">Gegevens</h3>
</div>
  <div class="panel-body">
        <div class="row">
            <div class="col-md-6">
                    <table class="table">        
                    <tbody>

                <tr>
                    <td>Naam</td>
                    <td><input class="form-control" type="text" id="formGroupInputSmall" placeholder="Naam"name="username" value="<?php echo $username; ?>"/></td>
                </tr>
                    </tbody>
                    </table>
                    <input class="btn btn-default"  type="submit" name="submit_btn" value="Bevestigen"/>
</form>
            </div>
        </div>
    </div>
  </div>
</body>
</html> 
Ik zie nog steeds twee controles of een ID-nummer is ingevuld.
Sorry dat was ik vergeten. Ik heb het aangepast.
Uhm...

<?php
if ($veiligheidsCheckDieMislukt) {
    header('Location: unauthorized.htm');
}

// Deze code wordt gewoon uitgevoerd alvorens je geredirect wordt...
?>

Zet na een header('Location: ...') altijd een exit.

Ik heb dit topic nu een tijdje zitten volgen en ik zit mij een beetje te verbijten over de structuur. Wat ik persoonlijk zou doen is het volgende:
- maak een inventarisatie van de verschillende soorten gebruikers
heb je een superadmin die alles ziet? of alleen maar gebruikers die bij hun eigen werkstukken kunnen?
dit bepaalt mede uit hoeveel verschillende (beheer)schermen je applicatie bestaat

- maak een opdeling in acties, er zijn er al een aantal de revu gepasseerd:
* toevoegen werkstuk
* inzage/wijzigen werkstuk
* verwijderen werkstuk

Overigens zou je over die laatste kunnen nadenken: gooi je echt alles daadwerkelijk weg, of zet je een "deleted" flag op true zodat de gebruiker dit werkstuk niet meer ziet, maar wanneer iemand klaagt dat de computer zijn/haar werkstuk heeft opgegeten, dan kun je deze eenvoudig terughalen

- stop herhalende delen in aparte bestanden
zoals het starten van een sessie, het opbouwen van een database connectie; ook zou je wat hulpfuncties voor database-queries in het leven kunnen roepen

Kortom, misschien wordt het tijd eens inhoudelijk na te denken over het (fatsoenlijk) structureren van je applicatie.
.... en begin daarom eens aan het ontwerpen en uitschrijven van een 'flowchart'.

Zet na een header('Location: ...') altijd een exit.

Toegevoegd

- maak een inventarisatie van de verschillende soorten gebruikers
heb je een superadmin die alles ziet? of alleen maar gebruikers die bij hun eigen werkstukken kunnen?
dit bepaalt mede uit hoeveel verschillende (beheer)schermen je applicatie bestaat

Nee, er is geen superadmin.

- maak een opdeling in acties, er zijn er al een aantal de revu gepasseerd:
* toevoegen werkstuk
* inzage/wijzigen werkstuk
* verwijderen werkstuk

Verwijderen werkstuk is er niet. De reden heb je al opgenoemd.

- stop herhalende delen in aparte bestanden
zoals het starten van een sessie, het opbouwen van een database connectie; ook zou je wat hulpfuncties voor database-queries in het leven kunnen roepen

Include heb ik nog niet gebruikt omdat ik juist hele overzicht wilde tonen.

.... en begin daarom eens aan het ontwerpen en uitschrijven van een 'flowchart'.

Voor edit pagina is flowchart niet nodig toch? Ik bedoel flowchart is voor hele project bedoeld.
Een flow-chart schept wel duidelijkheid, vooral als er diverse controles in het script zitten.

Reageren