Hallo allemaal,


Momenteel heb ik een edit formulier, die op een paar punten na verder prima werkt.
Het formulier heeft een paar input fields waarmee ik gegevens inzet, nadat ze uit DB zijn gehaald een paar drop down lists.
En ik merk dat alle input fields voor de drop down list gevuld worden met gegevens en alle input fields na de drop down list leeg zijn/blijven.

Iemand een idee voor dit vreemd gedrag?

De volgende code gebruik ik voor mijn edit formulier

<?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.
                
		}
	
// Need the database connection:
require(MYSQL);
if ($_SERVER['REQUEST_METHOD'] == 'POST') { // Handle the form.
	
	//creating veriables for medicinescompany, medicinescountry, medicinetype_id and supplier_id
	$medicinescompany_id = $_POST['companyname'];
	$medicinescountry_id = $_POST['medicinescountry'];
	$medicinetype_id = $_POST['medicinetypename'] ;
	$supplier_id = $_POST['suppliername'];
	
	// Trim all the incoming data:
	$trimmed = array_map('trim', $_POST);
	// Validate and secure the form data:
	$errors = array();
	
	// Check for a medicine name:
	if (!empty($trimmed['medicinename'])) {
		$medicinename = mysqli_real_escape_string ($dbc, $trimmed['medicinename']);
		} else {
			$errors['medicinename'] = "<p class='error'>Medicine name can't be empty</p>";
		}
	
	// Check for a generic name:
	if (!empty($trimmed['genericname'])) {
		$genericname = mysqli_real_escape_string ($dbc, $trimmed['genericname']);
		} else {
			$errors['genericname'] = "<p class='error'>Generic name can't be empty</p>";
		}
	//check for a medicine type name
	if(isset($trimmed['medicinetypename']) && $trimmed['medicinetypename'] > 0){
		$medicinetypename = $trimmed['medicinetypename'];
		} else {
			$errors['medicinetypename'] = "<p class='error'>Please select a medicine type name from the list</p>";
		}
	// Check for a expiration date name:
	if (!empty($trimmed['expiredate'])) {
		$expiredate = mysqli_real_escape_string ($dbc, $trimmed['expiredate']);
		} else {
			$errors['expiredate'] = "<p class='error'>Please select a date from the calendar</p>";
		}
	// Check for quantity:
	if (!empty($trimmed['quantity'])) {
		$quantity = mysqli_real_escape_string ($dbc, $trimmed['quantity']);
		} else {
			$errors['quantity'] = "<p class='error'>Quantity can't be empty</p>";
		}
	$sellingprice = mysqli_real_escape_string ($dbc, $trimmed['sellingprice']);
	
	$purchaseprice = mysqli_real_escape_string ($dbc, $trimmed['purchaseprice']);
	//check for medicine companyname
	if (!empty($trimmed['companyname'])) {
		$medicinecompany = mysqli_real_escape_string ($dbc, $trimmed['companyname']);
		} else {
			$errors['companyname'] = "<p class='error'>Please select a company name from the list</p>";
		}
	//check for medicine countryname
	if (!empty($trimmed['medicinescountry'])) {
		$country = mysqli_real_escape_string ($dbc, $trimmed['medicinescountry']);
		} else {
			$errors['medicinescountry'] = "<p class='error'>Please select a medicine country from the list</p>";
		}		
	// Check for a suppliername:
	if(!empty($trimmed['suppliername'])){
		$suppliername = $trimmed['suppliername'];
		} else {
			$errors['suppliername'] = "<p class='error'>Please select a supplier name from the list</p>";
		}
	

	if (count($errors) == 0) {

		// Define the query.
		$query = "UPDATE medicines SET medicinename='$medicinename', genericname='$genericname', expiredate='$expiredate', quantity='$quantity', sellingprice='$sellingprice',  purchaseprice='$purchaseprice' WHERE id={$_POST['id']}";
		$r = mysqli_query($dbc, $query); // Execute the query.

		// Report on the result:
		if (mysqli_affected_rows($dbc) == 1) {
			header ('Refresh:5; url=medicines.php');
			echo '<p class="addmedtext">This medicine has been updated.</br>
			Within 5 seconds you will redirected to Medicines page...
			</p>';
			include ('includes/footer.php'); // Include the HTML footer.
			exit(); // Stop the page.
		} else {
			echo '<p style="color: red;">Could not update this medicine</p>';
		}

	}else { // If one of the data tests failed.
		echo '<p class="error">Please try again.</p>';
	} // No problem!

}

// 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_numeric($_GET['id'])) {
				
				// Define the query.
				$query = "SELECT id, medicinename, genericname, expiredate, quantity, sellingprice, purchaseprice FROM medicines WHERE id='" . mysqli_real_escape_string($dbc, $_GET['id']) . "'";
                
				if ($result = mysqli_query($dbc, $query)) { // Run the query.
					
					$row = mysqli_fetch_array($result);// Retrieve the information.
					?>
					<form action="med_edit.php?id=<?php echo $_GET['id']; ?>" method="post">
						<h2>Medicine Edit Form</h2>
						<table>
							
								<input type="hidden" name="id" value="<?php echo htmlentities($row['id']);?>">
							
							<tr>
								<td><label for="medicinename"><b>Medicine Name:</b></label></td>
								<td><input type="text" name="medicinename" id="medicinename" value="<?php echo htmlentities($row['medicinename']); ?>" /></td>
								<td><?php if(isset($errors['medicinename'])) echo $errors['medicinename']; ?></td>
							</tr>
							<tr>
								<td><label for="genericname"><b>Generic Name:</b></label></td>
								<td><input type="text" name="genericname" id="genericname" value="<?php echo htmlentities($row['genericname']); ?>" /></td>
								<td><?php if(isset($errors['genericname'])) echo $errors['genericname']; ?></td>
							</tr>
							<tr>
								<td><label for="medicinetypename"><b>Select medicine type:</b></label></td>
								<td><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></td>
								<td><?php if(isset($errors['medicinetypename'])) echo $errors['medicinetypename']; ?></td>
							</tr>
							<tr>
								<td><label for="expiredate"><b>ExpireDate:</b></label></td>
								<td><input type="date" name="expiredate" id="expiredate" value="<?php echo htmlentities($row['expiredate']); ?>" /></td>
								<td><?php if(isset($errors['expiredate'])) echo $errors['expiredate']; ?></td>
							</tr>
							<tr>
								<td><label for="companyname"><b>This medicine belgons to company:</b></label></td>
								<td>
									<?php
									require_once (MYSQL);
									$query = "SELECT * from medicinescompany where userid= '{$_SESSION['user_id']}'";
									$result = mysqli_query($dbc,$query);
									if(!$result){
										die ("query failed" . mysqli_error($dbc));	
									}
									if(mysqli_num_rows($result) == 0){
										echo "Before adding any medicine to the database, please add a <a href='medcom_insert.php'>Medicine Company</a>";
										} else {?>
										<select name="companyname">
										<option value="">---Select---</option>
										<?php while ($row = mysqli_fetch_assoc($result)){
											$medicinescompany_id = $row['id'];
											$companyname = $row['companyname'];
										echo "<option value='$medicinescompany_id'>{$companyname}</option>";
										}
									}
									?>
								</select></td>
								<td><?php if(isset($errors['companyname'])) echo $errors['companyname']; ?></td>
							</tr>
							<tr>
								<td><label for="medicinescountry"><b>This medicine is made in country:</b></label></td>
								<td>
								<?php
								$query2 = "SELECT * from medicinescountry where userid= '{$_SESSION['user_id']}'";
								$result2 = mysqli_query($dbc,$query2);
								if(!$result2){
									die ("query failed" . mysqli_error($dbc));	
								}
								if (mysqli_num_rows($result2) == 0){ 
									echo "Before adding any medicine to the database, please add a <a href='medcountry_insert.php'>Medicine Country</a>";	
									} else { ?>
										<select name="medicinescountry">
										<option value="">---Select---</option>
										<?php while ($row = mysqli_fetch_assoc($result2)){
										$medicinescountry_id = $row['id'];
										$countryname = $row['countryname'];
											echo "<option value='$medicinescountry_id'>{$countryname}</option>"; 	 
									 }
								}
								?>
								</select>
								</td>
								<td><?php if(isset($errors['medicinescountry'])) echo $errors['medicinescountry']; ?></td>
							</tr>
							<tr>
								<td><label for="quantity"><b>Quantity:</b></label></td>
								<td><input type="text" name="quantity" id="quantity" value="<?php echo htmlentities($row['quantity']); ?>" /></td>
								<td><?php if(isset($errors['quantity'])) echo $errors['quantity']; ?></td>
							</tr>
							<tr>
								<td><label for="sellingprice"><b>SellingPrice:</b></label></td>
								<td><input type="text" name="sellingprice" id="sellingprice" value="<?php echo htmlentities($row['sellingprice']); ?>" /></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="purchaseprice"><b>PurchasePrice:</b></label></td>
								<td><input type="text" name="purchaseprice" id="purchaseprice" value="<?php echo htmlentities($row['purchaseprice']); ?>" /></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="suppliername"><b>This medicine is brought to you by supplier:</b></label></td>
								<td>
								<?php
								$querysupplier = "SELECT * from suppliers where userid= '{$_SESSION['user_id']}'";
								$resultsupplier = mysqli_query($dbc,$querysupplier);
								if(!$resultsupplier){
									die ("query failed" . mysqli_error($dbc));	
								}
								if (mysqli_num_rows($resultsupplier) == 0){ 
									echo "Before adding any medicine to the database, please add a <a href='medsuppliers_insert.php'>Medicine Supplier</a> first!";	
									} else { ?>
										<select name="suppliername">
										<option value="">---Select---</option>
										<?php while ($row = mysqli_fetch_assoc($resultsupplier)){
										$supplier_id = $row['id'];
										$suppliername = $row['suppliername'];
									echo "<option value='$supplier_id'>{$suppliername}</option>";
									}
								}
								?>
								</select></td>
								<td><?php if(isset($errors['suppliername'])) echo $errors['suppliername']; ?></td>
							</tr>
							<tr>
								<td></td>
								
								<td colspan="2"><input type="submit" name="submit" value="Update Medicine" class="btn"></td>
							</tr>
						</table>
					</form>
			<?php		
				} else { // Couldn't get the information.
					echo '<p style="color: red;">Could not retrieve the medicine ID</p>';
		}
}// End of main IF.

mysqli_close($dbc); // Close the connection.
?>
<?php
include "includes/footer.php";
?>
Kijk eens in de bron je van pagina. Grote kans dat je helemaal onderin een foutmelding aantreft welke je niet op je pagina te zien krijgt om de simpele reden dat je browser het niet meer snapt. Je hebt namelijk net een <select> geopend en komt met een lap tekst in plaats van met <option>s. Die lap tekst is dan je foutmelding. Dat is nou ONDER ANDERE het nadeel van PHP code tussen je HTML!
Als ik de stukken code zo zie, dan zou ik toch denken dat een template-parser een handig idee is. Je scheidt daarmee de HTML van je PHP-code.
Hallo Frank Nietbelangrijk,

Ik heb de broncode van med_edit.php gekeken en ik tref eigenlijk geen foutcode aan, ook niet onderaan het pagina. En, in mijn eerste query voor medicinetype staat ook geen <select> tag er in. Ik probeer enkel een resultaat weer te geven.
Sowieso vraag ik me of ik op de juiste spoor ben om dit probleem op te lossen.
Ikzelf denk dat de volgende stappen nodig en logisch zijn voor het probleem:

1. query uitvoeren met left join om te achterhalen, welke medicinetype opgeslagen is voor bijv medicine id = 120
2. vervolgens vergelijken of het achterhaalde medicinetype overeenkomt met de tabel medicinetype
3. en als dit is waar i, dan laten zien als selected = selected als value en ook standaard moeten ook alle medicinetypes getoond worden

Zijn dit de logische stappen om het probleem op te lossen?

@- Ariën -,
Ongetwijfeld heb je gelijk in dat een template-parser een handig is, al weet ik nu niet wat dat is en hoe ik kan het implementeren, maar het lijkt mij praktisch om eerste huidige problemen op te lossen en daarna te kijken naar bijv. een template-parser..

Btw; heb je nog gekeken naar de URL die in mijn vorige post had aangegeven?
Denk je dat een oplossing voor mijn probleem is?


<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>HawarCo | Medicine Management Software</title>
<link href="../includes/main.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="../includes/jquery-ui.min.css">
<link rel="stylesheet" href="../includes/jquery-ui.theme.min.css">
<style>
  .ui-autocomplete {
			max-height: 300px;
			overflow-y: auto;  /* prevent horizontal scrollbar */
			overflow-x: hidden;
  }
</style>
<script src="../includes/jquery-3.2.1.min.js"></script>
<script src="../includes/jquery-ui.min.js"></script>
  <script>
  $(function() {
    $( "#medicinename" ).autocomplete({
      source: 'includes/search_medicinename.php'
    });
  });
  $(function() {
    $( "#genericname" ).autocomplete({
      source: 'includes/search_genericname.php'
    });
  });
 $(function () {
    $('input.inputA').keyup(function () {
        $('input.inputB').prop('disabled', this.value.length === 0 ? false : true);
    });
    
    $('input.inputB').keyup(function () {
        $('input.inputA').prop('disabled', this.value.length === 0 ? false : true);
    });
});
 </script>
</head>
<body>
<div id="wrapper">
	<div id="header">
	</div>
	<div id="content">
		<div id="navigation">
            <div id="nav">
					<ul class="menu">
                      <li><a href="../index.php">Home</a></li>
                      <li><a href="../medicines.php">Medicines &raquo;</a>
                        <ul>
                          <li><a href="../medicines.php">Medicines &raquo;</a>
                            <ul>
                              <li><a href="../med_insert.php">Insert Medicines</a></li>
                            </ul>
                          </li>
                          <li><a href="../medicinescompanies.php">Medicines companies &raquo;</a>
                            <ul>
                              <li><a href="../medcom_insert.php">Insert medicines company</a></li>
                            </ul>
                          </li>
                          <li><a href="../medicinescountries.php">Medicines countries &raquo;</a>
                            <ul>
                              <li><a href="../medcountry_insert.php">Insert medicines countries</a></li>
                            </ul>
                          </li>
						  <li><a href="../medsuppliers.php">Medicines suppliers &raquo;</a>
                            <ul>
                              <li><a href="../medsuppliers_insert.php">Insert medicines supplier</a></li>
                            </ul>
                          </li>
                         </ul>
                      </li>
                    <li class="menuui"><a href="../medicinesfinance.php">Finance</a></li>
                    <li class="menuui"><a href="../medicinesreports.php">Reports</a></li>
                    </ul></div><div id="search">
					<form class="search" action="medicinesreports.php" method="get">
						<input type="text" name="search" placeholder="Search for medicines...">
						<button type="submit">Search</button>
					</form></div>
              <div id="profile"><p class='login'>Welcome Hawar <a href='logout.php'>Logout</a></p>			  </div>
        </div>
        <div id="second-content">
        <!--ending header-->					<form action="med_edit.php?id=123" method="post">
						<h2>Medicine Edit Form</h2>
						<table>
							
								<input type="hidden" name="id" value="123">
							
							<tr>
								<td><label for="medicinename"><b>Medicine Name:</b></label></td>
								<td><input type="text" name="medicinename" id="medicinename" value="test1" /></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="genericname"><b>Generic Name:</b></label></td>
								<td><input type="text" name="genericname" id="genericname" value="test1" /></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="medicinetypename"><b>Select medicine type:</b></label></td>
								<td><select name="medicinetypename">
								<option value="">---Select---</option>
								<option value='1'>Liquid</option><option value='2'>Tablet</option><option value='3'>Capsules</option><option value='4'>Topical medicines</option><option value='5'>Suppositories</option><option value='6'>Drops</option><option value='7'>Inhalers</option><option value='8'>Injections</option><option value='9'>Implants or patches</option><option value='10'>Buccal or sublingual tablets or liquids</option><option value='11'>Cream</option><option value='12'>Evohaler</option><option value='13'>Insulin</option><option value='14'>Lotion</option><option value='15'>Ointment</option><option value='16'>Powder</option><option value='17'>Spray</option><option value='18'>Sugical items</option><option value='19'>Suspension</option><option value='20'>Syrup</option><option value='21'>Other</option>								</select></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="expiredate"><b>ExpireDate:</b></label></td>
								<td><input type="date" name="expiredate" id="expiredate" value="" /></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="companyname"><b>This medicine belgons to company:</b></label></td>
								<td>
																			<select name="companyname">
										<option value="">---Select---</option>
										<option value='18'>YourHealth252525</option><option value='19'>HawlerMED</option><option value='20'>KurdPharmacy</option><option value='23'>test1</option><option value='24'>geen idee</option><option value='25'>???? ????</option>								</select></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="medicinescountry"><b>This medicine is made in country:</b></label></td>
								<td>
						<select name="medicinescountry"><option value="">---Select---</option><option value='18'>Germany</option><option value='19'>Iran</option><option value='20'>Iraq</option><option value='21'>Turkye</option><option value='22'>The Netherlands</option><option value='25'>???? ????</option><option value='26'>France</option></select>								</td>
								<td></td>
							</tr>
							<tr>
								<td><label for="quantity"><b>Quantity:</b></label></td>
								<td><input type="text" name="quantity" id="quantity" value="" /></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="sellingprice"><b>SellingPrice:</b></label></td>
								<td><input type="text" name="sellingprice" id="sellingprice" value="" /></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="purchaseprice"><b>PurchasePrice:</b></label></td>
								<td><input type="text" name="purchaseprice" id="purchaseprice" value="" /></td>
								<td></td>
							</tr>
							<tr>
								<td><label for="suppliername"><b>This medicine is brought to you by supplier:</b></label></td>
								<td>
																		<select name="suppliername">
										<option value="">---Select---</option>
										<option value='18'>HawlerMED</option><option value='19'>Dr. Haso</option><option value='20'>PharmacyMall</option><option value='23'>???? ????</option>								</select></td>
								<td></td>
							</tr>
							<tr>
								<td></td>
								
								<td colspan="2"><input type="submit" name="submit" value="Update Medicine" class="btn"></td>
							</tr>
						</table>
					</form>
			</div>
	</div>
	<div id="footer">
		<p class="footertekst">This webapplication is designed and created by Hawar Mohammad | Today's date : 
					Saturday 23 rd September, 2017</p>
	</div>
</div>

</body>
</html> 
Mohamed nvt op 23/09/2017 10:50:59

@- Ariën -,
Ongetwijfeld heb je gelijk in dat een template-parser een handig is, al weet ik nu niet wat dat is en hoe ik kan het implementeren, maar het lijkt mij praktisch om eerste huidige problemen op te lossen en daarna te kijken naar bijv. een template-parser..

Je kan een templateparser ook zelf bouwenp omdat PHP zelf al prima zijn werk kan doen, maar je kan ook een bestaande parser gebruiken zoals Twig of Smarty. Ikzelf gebruik de laatste. Die gebruikt ook caching wat je webapplicatie zelf nog eens versnelt. Wel weet ik dat Smarty behoorlijk met een hoop overbodige functies zit, maar ik heb er goede ervaringen mee.

Een stukje template-code als voorbeeld:

{include file="header.tpl"}
{include file="trackers.tpl"}
{strip}
	<h1>{$data.title}</h1>
	{$data.content}
{/strip}
{include file="footer.tpl"}

Hiermee haal ik dus de pagina's van mijn CMS-systeem op. Titel en data hierin opgehaald, en met de {$variabelen} dus vervangen in de juiste teksten. De includes spreken denk ik voor zich en de {strip} is om wit-ruimtes te strippen.
- Ariën - op 23/09/2017 14:23:16

Je kan een templateparser ook zelf bouwenp omdat PHP zelf al prima zijn werk kan doen, maar je kan ook een bestaande parser gebruiken zoals Twig of Smarty. Ikzelf gebruik de laatste. Die gebruikt ook caching wat je webapplicatie zelf nog eens versnelt. Wel weet ik dat Smarty behoorlijk met een hoop overbodige functies zit, maar ik heb er goede ervaringen mee.


En Twig ook.

Compilation Cache¶
All template loaders can cache the compiled templates on the filesystem for future reuse. It speeds up Twig a lot as templates are only compiled once; and the performance boost is even larger if you use a PHP accelerator such as APC. See the cache and auto_reload options of Twig_Environment above for more information.


Maar... gewoon "code on top and html on bottom" maakt je code al beter, beter leesbaar en zorgt dat je later makkelijk met losse templates (met of zonder template parser) kunt gaan werken.
Update:

Om op basis van een ID van het vorige pagina, te kunnen achterhalen welke medicinetype bij een medicijn hoort, werkt nu wel.
In de query moest ik nog aangeven medicines.id ipv id.

De volgende stap is nu denk ik het resultaat uit het query te vergelijken met wat het resultaat wat uit while loop komt en het te laten zien en hier lukt het me helaas niet...

$mtquery = "SELECT
                            medicines.id,medicines.medicinename,medicines.medicinetype_id,medicinestype.medicinetypename
                            FROM medicines
                            LEFT JOIN medicinestype ON medicinestype.id=medicines.medicinetype_id
                            WHERE medicines.id='" . mysqli_real_escape_string($dbc, $_GET['id']) . "'";
                            
							 if ($mtresult = mysqli_query($dbc, $mtquery)){ // run the query
									$mtrow = mysqli_fetch_array($mtresult);// Retrieve the information.
									echo $mtrow['medicinetypename'];
									} else {
										echo "nothing";
									}


[size=xsmall]Toevoeging op 24/09/2017 09:26:30:[/size]

Update;

Issue is opgelost ;-)
Iedereen bedankt voor het meedenken ;-)

Reageren