Via een form probeer ik data in te voeren in meerdere/joined tabellen.
Helaas gaat het niet goed, en ik krijg een vage foutmelding m.b.t. een Undefined variable. Deze twee variabelen heb ik eerder aangemaakt in het form gedeeld, nl;
$medicinetype_id
$supplier_id
Verder dan deze foutmelding krijg ik de foutmelding:
Error: Cannot add or update a child row: a foreign key constraint fails (`DB2681116`.`medicines_medicinestype`, CONSTRAINT `medicines_medicinestype_ibfk_2` FOREIGN KEY (`medicinetype_id`) REFERENCES `medicinestype` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
En volgens mij klopt deze foutmelding, omdat het eerder genoemde variabelen mislukt en wordt er geen id gevonden in beide tabellen.
En verder vraag ik me af of mijn code correct is wat betreft syntaxis, logische stappen en veiligheid.
Ik hoop dat mijn verhaal duidelijk is en dat iemand mij wat feedback kan geven hoe ik het wel kan gaan oplossen.
Form code
<form action="med_insert.php" method="post">
<fieldset>
<p><label for="medicinename"><b>Medicine Name:</b></label> <input type="text" name="medicinename" id="medicinename" value="<?php if (isset($trimmed['medicinename'])) echo $trimmed['medicinename']; ?>" /></p>
<p><label for="productiondate"><b>Production Date:</b></label> <input type="text" name="productiondate" id="productiondate" value="<?php if (isset($trimmed['productiondate'])) echo $trimmed['productiondate']; ?>" /></p>
<p><b><label for="expirationdate">Expiration Date:</b></label> <input type="text" name="expirationdate" id="expirationdate" value="<?php if (isset($trimmed['expirationdate'])) echo $trimmed['expirationdate']; ?>" /> </p>
<p><b><label for="medicineprise">Medicine price:</b></label> <input type="text" name="medicineprise" id="medicineprise" value="<?php if (isset($trimmed['medicineprise'])) echo $trimmed['medicineprise']; ?>" /> </p>
<p><label for="medicinetypename"><b>Select medicine type:</b></label>
<select name="medicinetypename">
<option value="">---Select---</option>
<?php
require_once (MYSQL);
$query = "SELECT * from medicinestype";
$result = mysqli_query($dbc,$query);
if(!$result){
die ("query failed" . mysqli_error($dbc));
}
while ($row = mysqli_fetch_assoc($result)){
$medicinetype_id = $row['id'];
$medicinetypename = $row['medicinetypename'];
echo "<option value='$medicinetype_id'>{$medicinetypename}</option>";
}
?>
</select></p>
<p><label for="suppliername"><b>Delivered by supplier:</b></label>
<select name="suppliername">
<option value="">---Select---</option>
<?php
$query2 = "SELECT * from suppliers";
$result2 = mysqli_query($dbc,$query2);
if(!$result2){
die ("query failed" . mysqli_error($dbc));
}
while ($row = mysqli_fetch_assoc($result2)){
$supplier_id = $row['id'];
$suppliername = $row['suppliername'];
echo "<option value='$supplier_id'>{$suppliername}</option>";
}
?>
</select></p>
</fieldset>
<div align="center"><input type="submit" name="submit" value="Insert" /></div>
</form>
Zoals het boven eruit ziet, heeft het formulier een aantal invoer velden en twee dropdown-list. De gegevens van deze dropdown-list worden dmv een php script uit de db gehaald.
Code om in te voeren:
<?php
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']}";
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') { // Handle the form.
// Need the database connection:
require_once (MYSQL);
// Trim all the incoming data:
$trimmed = array_map('trim', $_POST);
// Assume invalid values:
$mn = $pd = $ed = $mp = $mtn = $sp = FALSE;
// Check for a medicine name:
if (preg_match ('/^[A-Z \'.-]{2,20}$/i', $trimmed['medicinename'])) {
$mn = mysqli_real_escape_string ($dbc, $trimmed['medicinename']);
} else {
echo '<p class="error">Please enter a medicine name!</p>';
}
// Check for a production date name:
if (!empty($trimmed['productiondate'])) {
$pd = mysqli_real_escape_string ($dbc, $trimmed['productiondate']);
} else {
echo '<p class="error">Please enter a production date for this medicine!</p>';
}
// Check for a expiration date name:
if (!empty($trimmed['expirationdate'])) {
$ed = mysqli_real_escape_string ($dbc, $trimmed['expirationdate']);
} else {
echo '<p class="error">Please enter an expiration date for this medicine!</p>';
}
// Check for a medicine price:
/*
if (preg_match ('/^[A-Z \'.-]{2,40}$/i', $trimmed['medicineprise'])) {
$mp = mysqli_real_escape_string ($dbc, $trimmed['medicineprise']);
} else {
echo '<p class="error">Please enter an expiration date for this medicine!</p>';
}*/
if(!empty($trimmed['medicinetypename'])){
$mtn = $trimmed['medicinetypename'];
} else {
echo '<p class="error">Please select a medicinetype name for this medicine!</p>';
}
if(!empty($trimmed['suppliername'])){
$sp = $trimmed['suppliername'];
} else {
echo '<p class="error">Please select a medicine supplier for this medicine!</p>';
}
if ($mn && $pd && $ed && $mp && $mtn && $sp) { // If everything's OK...
// Add the medicine to the database:
$q = "INSERT INTO medicines
(medicinename, productiondate, expirationdate,medicineregistration, medicineprice, userid)
VALUES ('$mn','$pd', '$ed', NOW(), '$mp', '{$_SESSION['user_id']})'";
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
$medicine_id= mysqli_insert_id($dbc);
$q2 = "INSERT INTO medicines_medicinestype
(medicine_id,medicinetype_id)
VALUES ('$medicine_id','$medicinetype_id')";
$r2 = mysqli_query ($dbc, $q2) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
$q3 = "INSERT INTO medicines_suppliers
(medicine_id,supplier_id)
VALUES ('$medicine_id','$supplier_id')";
$r3 = mysqli_query ($dbc, $q3) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
if (mysqli_affected_rows($dbc) == 1) { // If it ran OK.
// Finish the page:
echo '<h3>Thanks for adding medicines to the system!</h3>';
include ('includes/footer.php'); // Include the HTML footer.
exit(); // Stop the page.
} else { // If it did not run OK.
echo '<p class="error">There is no medicines saved to the system due to a technical error.
We apologize for any inconvenience.</p>';
}
} else { // If one of the data tests failed.
echo '<p class="error">Please try again.</p>';
}
} // End of the main Submit conditional.
?>