Ik gebruik het ietwat verouderde boek PHP 5 van Arjan Burger om php te leren.

Ik heb geprobeerd om een script om records uit een tabel te verwijderen aan te passen naar mysqli.
De records uit de tabel worden weergegeven. Echter krijg ik enkele foutmeldingen en lukt het niet om een record te verwijderen.

Notice: Undefined index: actie in /home/nickvzk61/domains/nickvzk61.sixtyone.axc.nl/public_html/testlab/category_del.php on line 26

Notice: Undefined variable: PHP_SELF in /home/nickvzk61/domains/nickvzk61.sixtyone.axc.nl/public_html/testlab/category_del.php on line 39

Notice: Undefined variable: PHP_SELF in /home/nickvzk61/domains/nickvzk61.sixtyone.axc.nl/public_html/testlab/category_del.php on line 39


wie kan mij helpen?


<html>
<head>
	<title>Categorie verwijderen</title>
</head>
<body>
<?php
// errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);

// database connectie maken
// ""localhost","my_user","my_password","my_db"
$db = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// foutmelding weergeven bij mislukte database connectie
if (!$db) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

// uit te voeren actie
// tabelnaam: category
// kolommen: 'category_id' & 'category_name'
if ($_GET["actie"] == "wis" && $_GET["categoryiddel"]) { //is er een categorie ingevoerd?
	if (!mysqli_query($db, "DELETE FROM category WHERE category_id=".$GET[categoryiddel]."")){ //als de query mislukt geef een melding
		echo "Verwijderen van de categorie is mislukt!";
		exit;
	}
}
else{ //laad de tabel
?>
Wis de volgende categorie:<br>
<?php
	$resultaatdelete = mysqli_query($db, "SELECT * FROM category"); // vul de variabale met de gegevens uit de tabel category
	while ($rij = mysqli_fetch_array($resultaatdelete, MYSQLI_BOTH)){ //zolang er een rij gevuld wordt, data weergeven
		$categoryiddel = $rij["category_id"];
		echo $rij["category_name"]."<a href=\"$PHP_SELF?actie=wis&categoryiddel=$categoryiddel\">Wissen</a><br>\n";
	}
}
?>
</body>
</html>


alvast bedankt voor de moeite.
Nick VanRossem op 17/01/2016 23:41:56

Echter krijg ik enkele foutmeldingen


En nu mogen wij die gaan gokken.
Mijn excuses - SanThe - ik zag het ook net bij het herlezen van mijn post. het oorspronkelijk bericht is aangepast.
Die variabelen bestaan blijkbaar (nog) niet.
Zie [php]isset[/php]().
$PHP_SELF bestaat al zo'n 10 jaar al niet meer.

Als je toch naar hetzelfde bestand linkt heb je daar geen variabele voor nodig.
Je mis ook een liggend streepje (underscore) op regel 27 in $GET.

Daarnaast is het misschien ook handig om te controleren op het bestaan van variabelen zoals SanThe aangeeft met behulp van isset() en als je dingen een query(string) in duwt, controleer dan op zijn minst of datgene numeriek is ten einde een ongewenst effect te voorkomen.
Allen vast bedankt voor de hulp!

Ik heb geprobeerd om de tips en opmerkingen toe te passen en heb nu een werkend script zonder foutmeldingen.

- de functie isset() proberen toe te passen.
- regel 27 $GET aangepast naar $_GET + ontbrekende quotes toegevoegd.
- poging tot numerieke controle van $_GET["categoryiddel"] door gebruik van ctype_digit().

het script werkt nu wel, maar graag had ik nog feedback ontvangen of dit wel "correct" is uitgevoerd.

$PHP_SELF heb ik nog wel in gebruik, maar ik heb niet gevonden hoe dit anders zou kunnen. (net even de druk van het boek dat ik gebruik gecontroleerd. Het boek dateert van 2007).


<html>
<head>
	<title>Categorie verwijderen</title>
</head>
<body>
<?php
// errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);

// database connectie maken
// ""localhost","my_user","my_password","my_db"
$db = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// foutmelding weergeven bij mislukte database connectie
if (!$db) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

// uit te voeren actie
// tabelnaam: category
// kolommen: 'category_id' & 'category_name'
if (isset($_GET["actie"]) and $_GET["actie"] == "wis" && ctype_digit($_GET["categoryiddel"])) { //is er een categorie ingevoerd?
	if (!mysqli_query($db, "DELETE FROM category WHERE category_id=".$_GET["categoryiddel"]."")){ //als de query mislukt geef een melding	
		echo "Verwijderen van de categorie is mislukt!";
		exit;
	}
	else{
		echo "De categorie <b>".htmlspecialchars($_GET["categoryiddel"], ENT_QUOTES, "UTF-8")."</b> is verwijderd.<br>";
		$resultaatdelete = mysqli_query($db, "SELECT * FROM category"); // vul de variabale met de gegevens uit de tabel category
		while ($rij = mysqli_fetch_array($resultaatdelete, MYSQLI_BOTH)){ //zolang er een rij gevuld wordt, data weergeven
			$categoryiddel = $rij["category_id"];
			echo $rij["category_name"]."<a href=\"?actie=wis&categoryiddel=$categoryiddel\">Wissen</a><br>\n";
		}
	}
}
else{ //laad de tabel
?>
Wis de volgende categorie:<br>
<?php
	$resultaatdelete = mysqli_query($db, "SELECT * FROM category"); // vul de variabale met de gegevens uit de tabel category
	while ($rij = mysqli_fetch_array($resultaatdelete, MYSQLI_BOTH)){ //zolang er een rij gevuld wordt, data weergeven
		$categoryiddel = $rij["category_id"];
		echo $rij["category_name"]."<a href=\"?actie=wis&categoryiddel=$categoryiddel\">Wissen</a><br>\n";
	}
}
?>
</body>
</html>

if (isset($_GET["actie"]) == "wis" ...)

De function isset() geeft true of false terug en zal dus nooit tekst zijn.
if (isset($_GET["actie"]) and $_GET["actie"] == "wis" ...)

$PHP_SELF kan je gewoon weghalen.
Bedankt - SanThe -, ik heb de aanpassingen uitgevoerd en het script van vorige post ook geupdate.

uit leergierigheid: is er een reden waarom je "AND" gebruikt en niet "&&"?
Het verschil dat ik begrijp is dat "&&" een hogere voorrang heeft ten opzichte van "and".
Ik vind het beter leesbaar.
<?php if (isset($_GET["actie"]) and $_GET["actie"] == "wis" && ctype_digit($_GET["categoryiddel"])) { //is er een categorie ingevoerd?
?>

daar kan nog steeds die 2e ontbreken, dus ook isset() erbij

ik zou het schrijven als onder, maar met isset kan ook

<?php

if(filter_input(INPUT_GET, 'actie') == 'wis' && filter_input(INPUT_GET,'categoryiddel', FILTER_VALIDATE_INT)) { //is er een categorie ingevoerd?
?>


Reageren