Momenteel heb ik een medicijn form waar een ingelogde gebruiker een medicijn kan invoeren. Vervolgens worden deze gegevens in verschillende tabellen ingevoerd en dit gaat zonder problemen.
En wat ik nu graag wil bereiken is dat een ingelogde gebruiker de mogelijkheid heeft om de ingevoerde medicijnen te kunnen wijzigen.
Wanneer er geklikt wordt op edit, dan worden alle relevante gegevens van betreffende medicijn op basis van id opgehaald en in het formulier geladen. Dit gaat to zover goed.
Echter, wanneer je klikt op de knop wijzigen dan krijg ik op het scherm de foutmelding: "geen medicijn gekozen" en in de logs krijg ik de foutmeldingen:
"user_registration/med_edit.php' on line 28: Undefined index: id"
"user_registration/med_edit.php' on line 38: Undefined variable: result"
De reden waarom de eerste foutmelding,tweede en derde vaag vindt, omdat er reeds alle relevante medicijn info geladen zijn. Tevens, bestaat result variabel ook.
Ik weet niet of het uitmaakt, maar de info op medicines pagina wordt uit verschillende tabellen weergegeven met als medicine tabel als hoofd tabel..
Mijn tweede vraag is; hoe kan ik gegevens uit een eerder gekozen dropdown-menu weergeven op de edit pagina als in de originele dropdown-menu. En, dat gebruiker in kwestie ziet welke waarde hij gekozen heeft en indien nodig hij een andere waarde kan zien uit de lijst...Hiermee ben ik nog bezig, maar ik dacht misschien heeft iemand een idee/tutorial...
Graag ontvang ik jullie feedback hierover.
Code van edit pagina:
<?php
require ('includes/config.inc.php');
$page_title = 'Overview of all medicines saved to the database';
include ('includes/header.php');
// If no user_id session variable exists, redirect the user:
if (!isset($_SESSION['user_id'])) {
$url = BASE_URL . 'index.php'; // Define the URL.
ob_end_clean(); // Delete the buffer.
header("Location: $url");
exit(); // Quit the script.
}else{
echo "Welcome " . "{$_SESSION['firstname']}". "<br>";
}
// Need the database connection:
require(MYSQL);
// op basis van een id worden gegevens van de vorige pagina geselecteerd en hieronder in het form weergegeven
if(isset($_GET['id'])){
$id = $_GET['id'];
$query = "SELECT medicinename, productiondate, expirationdate, medicineprice FROM medicines WHERE id=$id";
$result = mysqli_query($dbc,$query);
while($row = mysqli_fetch_assoc($result)){
$id= $row['id'];
$medicinename = $row['medicinename'];
$productiondate = $row['productiondate'];
$expirationdate = $row['expirationdate'];
$medicineprice = $row['medicineprice'];
}
} else {
echo "No medicines has been chosen";
}
if(!$result){
die (mysqli_error($dbc));
}
?>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$id= $row['id'];
$update_medicine = "UPDATE medicines SET
medicinename = '$medicinename', productiondate = '$productiondate', expirationdate = '$expirationdate', medicineprice = '$medicineprice'
WHERE id= $id";
$result_update = mysqli_query($dbc,$update_medicine);
if($result_update){
header ("Location: medicines.php");
exit;
} else {
die ("Query failed" . mysqli_error($connection));
}
}
?>
<div>
<h1>Medicines edit page</h1>
<form action="med_edit.php" method="post">
<fieldset>
<legend>Medicines edit form</legend>
<input type="hidden" name="id" value="<?php echo $id; ?>">
<p><label for="medicinename"><b>Medicine Name:</b></label> <input type="text" name="medicinename" id="medicinename" value="<?php if (isset($medicinename)) echo $medicinename; ?>" /></p>
<p><label for="productiondate"><b>Production Date:</b></label> <input type="text" name="productiondate" id="productiondate" value="<?php if (isset($productiondate)) echo $productiondate; ?>" /></p>
<p><b><label for="expirationdate">Expiration Date:</b></label> <input type="text" name="expirationdate" id="expirationdate" value="<?php if (isset($expirationdate)) echo $expirationdate; ?>" /> </p>
<p><b><label for="medicineprise">Medicine price:</b></label> <input type="text" name="medicineprise" id="medicineprise" value="<?php if (isset($medicineprice)) echo $medicineprice; ?>" /> </p>
<input type="submit" name="update_medicine" value="Update medicine">
</fieldset>
</form>
</div>
<?php include "includes/footer.php"; ?>
Ik heb het zo in elkaar gezet:
Let wel, dat ik voor het formulier de php code breek en weer open na het formulier...
Ik krijg nu enkel dat betreffende pagina niet gevonden kan worden en er is geen error in logs....
<?php
// Need the database connection:
require(MYSQL);
// op basis van een id worden gegevens van de vorige pagina geselecteerd en hieronder in het form weergegeven
if(isset($_GET['id'])){
$query = "SELECT id, medicinename, productiondate, expirationdate, medicineprice FROM medicines
WHERE id='".mysqli_real_escape_string($dbc,$_GET['id'])."'";
$result = mysqli_query($dbc,$query);
if($result===true) {
$row = mysqli_fetch_assoc($result)){?>
<div>
<h1>Medicines edit page</h1>
<form action="" method="post">
<fieldset>
<legend>Medicines edit form</legend>
<input type="hidden" name="id" value="<?php echo $id; ?>">
<p><label for="medicinename"><b>Medicine Name:</b></label> <input type="text" name="medicinename" id="medicinename" value="<?php if (isset($medicinename)) echo $medicinename; ?>" /></p>
<p><label for="productiondate"><b>Production Date:</b></label> <input type="text" name="productiondate" id="productiondate" value="<?php if (isset($productiondate)) echo $productiondate; ?>" /></p>
<p><b><label for="expirationdate">Expiration Date:</b></label> <input type="text" name="expirationdate" id="expirationdate" value="<?php if (isset($expirationdate)) echo $expirationdate; ?>" /> </p>
<p><b><label for="medicineprise">Medicine price:</b></label> <input type="text" name="medicineprise" id="medicineprise" value="<?php if (isset($medicineprice)) echo $medicineprice; ?>" /> </p>
<input type="submit" name="update_medicine" value="Update medicine">
</fieldset>
</form>
</div>
<?php } else {
echo "Er is een fout bij ons opgetreden: ".mysqli_error($dbc);
}
} else {
echo "Er is geen medicijn-ID gekozen!";
}
}
?>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$id= $row['id'];
$update_medicine =" UPDATE medicines SET
medicinename = '$medicinename', productiondate = '$productiondate', expirationdate = '$expirationdate', medicineprice = '$medicineprice' WHERE id ='$id'";
$result_update = mysqli_query($dbc,$update_medicine);
if($result_update){
header ("Location: medicines.php");
exit;
} else {
die ("Query failed" . mysqli_error($dbc));
}
}
?>
<?php include "includes/footer.php"; ?>
Nee dit is niet logisch Mohamed. Je wilt namelijk een pagina tonen aan de gebruiker. Maar de inhoud van deze pagina is AFHANKELIJK van een aantal variabelen. Zo kan het zijn dat je de gebruiker een nieuw leeg formulier wilt tonen of een formulier met foutmeldingen of een bedankpagina na een forward met header('Location: ...'). De functie header mag je enkel gebruiken voordat je iets echo-t. Dus moet dit bovenin komen, voor je output (view).
Waarom filter je je input niet? Indien $_GET['id'] geen numerieke waarde bevat heeft het sowieso geen zin om de query uit te voeren. Overigens is het gebruik van real_escape_string() zonder quotes niet veilig. real_escape_string() is ook geen wondermiddel.
Tevens:
- Ariën - op 02/01/2017 13:58:06
<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
// hier je afhandeling
} else {
// hier je formulier.
}
?>
Het lijkt mij beter om de verschillende acties (het weergeven van een formulier, het verwerken van een formulier etc.) beter op te delen in verschillende stukken. Naarmate je scripts langer/complexer worden zijn dit soort constructies steeds minder gewenst.
Het opdelen in verschillende logische eenheden lijkt mij des te meer verstandig omdat ik al ergens ob_end_flush() zag staan - dit houdt in dat je al ergens begonnen was met het weergeven van een HTML-document, maar daar af en toe van af wil zien? Ook dit zou beter opgedeeld moeten worden: of je produceert geldige output (een compleet HTML-document, JSON, iets anders) of je produceert géén output (maar enkel headers die je doorverwijzen of iets dergelijks).
Misschien is dit een goed moment om even een stapje achteruit te doen en eens te kijken hoe de flow van je code/pagina-opbouw handiger aangepakt kan worden. Deze investering verdient zich snel weer terug omdat ontwikkeling en debugging in veel kleinere partjes kan/betrekking heeft.
Probeer nauwkeurig te zijn met inspringen, als ik twee }} achter elkaar zie staan in één lijn, dan is je script erg onduidelijk. Zie ook lijn 35 en 36.
Verder is die() ook niet de juiste manier van fouten afhandelen. Waarom zou je script er helemaal mee moeten stoppen? Alleen bij een location-header is een exit of een die de juiste oplossing.
Door alle adviezen ben ik nu een beetje in de war.
Wat is een duidelijke indeling voor mijn probleem, en ik dacht zelf aan het volgende na het doornemen van alle adviezen:
med_edit pagina
1. sessie controleren om te bepalen of een user ingelogd is en anders door verwijzen naar login pagina
2. dmv get[''] het ID ophalen uit de medicines.php pagina
3. gegevens uit dn ophalen
4. afhandelen van het formulier
5. formulier laten zien?
Wat denken jullie over bovenstaande indeling?
<?php
require ('includes/config.inc.php');
$page_title = 'Overview of all medicines saved to the database';
include ('includes/header.php');
// If no user_id session variable exists, redirect the user:
if (!isset($_SESSION['user_id'])) {
$url = BASE_URL . 'index.php'; // Define the URL.
ob_end_clean(); // Delete the buffer.
header("Location: $url");
exit(); // Quit the script.
}else{
echo "Welcome " . "{$_SESSION['firstname']}". "<br>";
}
// Need the database connection:
require(MYSQL);
// op basis van een id worden gegevens van de vorige pagina geselecteerd en hieronder in het form weergegeven
if(isset($_GET['id'])){
$query = "SELECT id, medicinename, productiondate, expirationdate, medicineprice FROM medicines
WHERE id='".mysqli_real_escape_string($dbc,$_GET['id'])."'";
$result = mysqli_query($dbc,$query);
if($result===true) {
$row = mysqli_fetch_assoc($result)){
} else {
echo "Er is een fout bij ons opgetreden: ".mysqli_error($dbc);
}
} else {
echo "Er is geen medicijn-ID gekozen!";
}
}
?>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$id= $row['id'];
$update_medicine =" UPDATE medicines SET
medicinename = '$medicinename', productiondate = '$productiondate', expirationdate = '$expirationdate', medicineprice = '$medicineprice' WHERE id ='$id'";
$result_update = mysqli_query($dbc,$update_medicine);
if($result_update){
header ("Location: medicines.php");
exit;
} else {
die ("Query failed" . mysqli_error($dbc));
}
}
?>
<div>
<h1>Medicines edit page</h1>
<form action="" method="post">
<fieldset>
<legend>Medicines edit form</legend>
<input type="hidden" name="id" value="<?php echo $id; ?>">
<p><label for="medicinename"><b>Medicine Name:</b></label> <input type="text" name="medicinename" id="medicinename" value="<?php if (isset($medicinename)) echo $medicinename; ?>" /></p>
<p><label for="productiondate"><b>Production Date:</b></label> <input type="text" name="productiondate" id="productiondate" value="<?php if (isset($productiondate)) echo $productiondate; ?>" /></p>
<p><b><label for="expirationdate">Expiration Date:</b></label> <input type="text" name="expirationdate" id="expirationdate" value="<?php if (isset($expirationdate)) echo $expirationdate; ?>" /> </p>
<p><b><label for="medicineprise">Medicine price:</b></label> <input type="text" name="medicineprise" id="medicineprise" value="<?php if (isset($medicineprice)) echo $medicineprice; ?>" /> </p>
<input type="submit" name="update_medicine" value="Update medicine">
</fieldset>
</form>
</div>
<?php include "includes/footer.php"; ?>
Op lijn 28 waar je query met succes uitgevoerd is, daar controleer je of je formulier is verstuurd. En als dat niet verstuurd is, dan toon je het formulier. Dat is in mijn ogen de beste, logische en overzichtelijke keuze.
En ja, er zijn altijd mensen die anders zijn gewend. Genoeg mogelijkheden....
Op jouw manier die je nu hebt zie je ook zonder een meegegeven ID in de URL ook een formulier, en dat hoort niet. Het is eigenlijk een opbouw in de vorm van: Doe dit, en anders dat.. doe zus, en anders zo... doe dit, en anders dat.....
En dat valt dan mooi te nestelen.
De output is wel naar onderen nu. Dat ziet er veel beter uit.
Alleen de include ('includes/header.php'); op regel vier moet naar regel 53. Want in header.php staat ook pure output (neem ik aan).
In aanvulling op de aanmerking van Arien:
Deze hele pagina Heeft absoluut 1 vereiste:
- Er moet een geldige GET variabele 'id' meegegeven worden.
Dit id moet aan de volgende voorwaarden voldoen:
- moet meegegeven worden ( isset($_GET['id']) )
- numeriek geheel getal zijn
- groter dan nul zijn
- voorkomen in de medicines tabel. (dwz controleren of het record gevonden is)
Voldoet id niet aan de voorwaarden dan kun je deze pagina niet weergeven. Toon in dat geval een foutmelding.
verder wat zeur dingetjes:
- Regel 38 de if staat helemaal tegen de kantlijn wat goed is maar dan hoort de } op regel 52 ook tegen de kantlijn
- regel 36 + 37 kunnen vervallen
- de foutmeldingen op regel 17, 30, 33 gaan nu een tekst op het scherm zetten waarna nog de html geopend zal worden. Misschien moet je hier een functie voor maken?
- regel 17 moet in de output komen.
<?php
function showError($tekst)
{
include ('includes/header.php');
echo '<p class="warning">' . $tekst . '</p>';
include ('includes/footer.php');
}
// aanroepen met:
showError("Er is een fout bij ons opgetreden: ".mysqli_error($dbc));
exit; // !!!
?>
Na jullie adviezen heb ik het med_edit.php opnieuw gebouwd, maar kan er helaas nog niets mee doen.
Vooraf controleer ik of het $_GET['id'] is set, niet leeg is en/of het een integer is.
Als het form niet verzonden is, dan wordt het weergegeven. Het is dus het ene of andere...
Helaas heeft het de volgende foutmelding en hopelijk kunnen jullie van mij advies voorzien:
1. Wit pagina, wegens een syntax fout, en volgens http://phpcodechecker.com/ vind ik er eentje op regel 31, maar die { hoort bij regel 38
2. geen idee nog, wegens wit pagina.
Zoals eerder aangegeven wordt het formulier aangegeven wanneer het niet verzonden is, maar ik vraag me af of ik de php code moet breken op form value, omdat daar ook php code staat om vervolgens php code opnieuw te beginnen?
Alvast bedankt voor jullie feedback!
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
?>
<?php
require ('includes/config.inc.php');
$page_title = 'Overview of all medicines saved to the database';
include ('includes/header.php');
// If no user_id session variable exists, redirect the user:
if (!isset($_SESSION['user_id'])) {
$url = BASE_URL . 'index.php'; // Define the URL.
ob_end_clean(); // Delete the buffer.
header("Location: $url");
exit(); // Quit the script.
}else{
echo "Welcome " . "{$_SESSION['firstname']}". "<br>";
}
// Need the database connection:
require(MYSQL);
// op basis van een id worden gegevens van de vorige pagina geselecteerd en hieronder in het form weergegeven
if(isset($_GET['id']) && !empty($_GET['id']) && is_int($_GET['id'])){
$query = "SELECT * FROM medicines WHERE id='".mysqli_real_escape_string($dbc,$_GET['id'])."'";
$result = mysqli_query($dbc,$query);
if($result===true) {
$row = mysqli_fetch_assoc($result){
} else {
echo "Er is een fout bij ons opgetreden: ".mysqli_error($dbc);
}
} else {
echo "Er is geen medicijn-ID gekozen!";
}
}
?>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$id= $row['id'];
$update_medicine =" UPDATE medicines SET
medicinename = '$medicinename', productiondate = '$productiondate', expirationdate = '$expirationdate', medicineprice = '$medicineprice'
WHERE id ='$id'";
$result_update = mysqli_query($dbc,$update_medicine);
if($result_update){
header ("Location: medicines.php");
exit;
} else {
die ("Query failed" . mysqli_error($dbc));
}
} else {
echo '<div>
<h1>Medicines edit page</h1>
<form action="" method="post">
<fieldset>
<legend>Medicines edit form</legend>
<input type="hidden" name="id" value="<?php echo $id; ?>">
<p><label for="medicinename"><b>Medicine Name:</b></label> <input type="text" name="medicinename" id="medicinename" value="<?php if (isset($medicinename)) echo $medicinename; ?>" /></p>
<p><label for="productiondate"><b>Production Date:</b></label> <input type="text" name="productiondate" id="productiondate" value="<?php if (isset($productiondate)) echo $productiondate; ?>" /></p>
<p><b><label for="expirationdate">Expiration Date:</b></label> <input type="text" name="expirationdate" id="expirationdate" value="<?php if (isset($expirationdate)) echo $expirationdate; ?>" /> </p>
<p><b><label for="medicineprise">Medicine price:</b></label> <input type="text" name="medicineprise" id="medicineprise" value="<?php if (isset($medicineprice)) echo $medicineprice; ?>" /> </p>
<input type="submit" name="update_medicine" value="Update medicine">
</fieldset>
</form>
</div>';
}
?>
<?php include "includes/footer.php"; ?>