Hallo allemaal,

Aan mijn testapplicatie heb ik een zoekfunctie toegevoegd.
Wanneer ik een item zoek, dan wordt het weergegeven precies zoals het bedoeld is in een tabel.
Echter, wanneer ik niets invul en klik op zoeken, dan wordt het laatste item weergegeven!
En wanneer ik zoek op een item wat niet bestaat, dan krijg ik wel de melding "geen zoekresultaten gevonden" en helaas ook veel undefined veriables.

Ik heb zelf het idee dat het te maken met het organiseren van de PHP code, maar ik kom er niet uit.
Kortom, ik heb dus twee problemen en zou graag jullie feedback willen hebben.

Alvast bedankt!

[code]
<?php include "includes/db-config.php"; ?>
<?php include "includes/header.php"; ?>
<?php
if(isset($_POST['submit'])){
$search = $_POST['search'];
$query = "SELECT * FROM medicines ";
$query .= "WHERE med_name LIKE '%$search%'";
$search_query = mysqli_query($connection,$query);
if(!$search_query){
die(mysqli_error($connection));
}

$count = mysqli_num_rows($search_query);
if($count == 0){
echo "No result found";

} else {
while ($row2 = mysqli_fetch_assoc($search_query)){
$medicine_id = $row2['med_id'];
$medicine_name = $row2['med_name'];
$medicine_create_date = $row2['med_create_date'];
$medicine_expire_date = $row2['med_expire_date'];
$medicine_factory = $row2['med_factory_id'];
$medicine_register_date = $row2['med_register_date'];
}
}
?>
<div id="content">
<h1>Search Results</h1>

<?php
echo "<table width='70%' border='solid 1px;'>";
echo "<tr><th>Name</th><th>Production_Date</th><th>Expire_Date</th><th>Created by factory</th><th>Added to database</th><th>Edit</th><th>Delete</th></tr>";
echo "<tr>";
echo "<td>{$medicine_name}</td>" .
"<td>{$medicine_create_date}</td>" .
"<td>{$medicine_expire_date}</td>" .
"<td>{$medicine_factory}</td>" .
"<td>{$medicine_register_date}</td>" .
"<td><a href='edit.php?id={$medicine_id}'>Edit</a></td>" .
"<td><a href='delete.php?id={$medicine_id}'>Delete</a></td>";
echo "</tr>";
echo "</table>"; ?>
<?php } ?>
</div>
<?php include "includes/footer.php"; ?>
[code]
Het volgende heb ik nu toegevoegd, en het werkt ook gelukkig.
Bijkomend probleem is dat de div footer helemaal uitgestrekt wordt van links naar rechts wanneer er gedrukt is op search butten en niets is ingevuld...
Volgens mij is dit geen PHP probleem, maar weet niet zeker

nieuwe code op regel 5


if(isset($_POST['submit']) & !empty($_POST['submit']) & !empty($_POST['search'])){


nieuwe code in regel 41

<?php } else{
	
	
	echo "je hebt niets ingevuld";
} ?>
vraag: in welk geval zou de submitknop geen value naar de server sturen en in hoeverre is dat een reden om dan maar niet te zoeken?

Is de button trouwens aanwezig in de post-request als je na het invullen van het zoek-veld op enter drukt?

Vandaar dat veelal de vraag gesteld wordt: is het een post-request (zie post van Thomas: $_SERVER['REQUEST_METHOD'] == 'POST' )

of in mijn suggestie: om te kijken of het zoekveld in een post-request aanwezig is, en niet leeg (wat impliceert dat het een post-request is)

[size=xsmall]Toevoeging op 18/08/2016 15:36:17:[/size]

wat betreft de layout:

in de code die je toont, mis je in dat geval slechts de <table>

die zou je ook moeten missen als je zoekt op iets dat niet gevonden wordt.
Wat als je zoekt op lasjdlfkjalkjfasjiwjeriwe ?
Als ik nu een letter invul, dan wordt de div footer niet uitgestrekt.
Dit gebeurt enkel wanneer ik helemaal geen letter/string invul.
Betekent dit dat ik de regel 4 moet veranderen naar het volgende:

Btw; wanneer de string "No result found" van regel 14 wordt weergegeven, gebeurt dit aan de rechterkant van het pagina ipv aan de linkerkant of in het midden. Beetje vreemd vind ik dit...
huidige regel 4


if(isset($_POST['submit']) & !empty($_POST['submit']) & !empty($_POST['search'])){


nieuwe regel 4

$_SERVER["REQUEST_METHOD"] == "POST"


In welke regel zie je de tag <table> ontbreekt?

volledige code van search_results.php


<?php include "includes/db-config.php"; ?>
<?php include "includes/header.php"; ?>
<?php
if(isset($_POST['submit']) & !empty($_POST['submit']) & !empty($_POST['search'])){
$search = $_POST['search'];
$query = "SELECT * FROM medicines ";
$query .= "WHERE med_name LIKE '%$search%'";
$search_query = mysqli_query($connection,$query);
if(!$search_query){
	die(mysqli_error($connection));
	}
$count = mysqli_num_rows($search_query);
if($count == 0){
	echo "No result found";
	
	} else {
		echo "<table width='70%' border='solid 1px;'>";
echo "<tr><th>Name</th><th>Production_Date</th><th>Expire_Date</th><th>Created by factory</th><th>Added to database</th><th>Edit</th><th>Delete</th></tr>";
while ($row2 = mysqli_fetch_assoc($search_query)){
		$medicine_id = $row2['med_id'];
		$medicine_name = $row2['med_name'];
		$medicine_create_date = $row2['med_create_date'];
		$medicine_expire_date = $row2['med_expire_date'];
		$medicine_factory = $row2['med_factory_id'];
		$medicine_register_date = $row2['med_register_date'];
		echo "<tr>";
		echo "<td>{$medicine_name}</td>" .
			 "<td>{$medicine_create_date}</td>" .
			 "<td>{$medicine_expire_date}</td>" .
			 "<td>{$medicine_factory}</td>" .
			 "<td>{$medicine_register_date}</td>" .
			 "<td><a href='edit.php?id={$medicine_id}'>Edit</a></td>" .
			 "<td><a href='delete.php?id={$medicine_id}'>Delete</a></td>";
		echo "</tr>";
		}
echo "</table>";		
}
?>
<div id="content">
<h1>Search Results</h1>
<?php } else{
	
	
	echo "je hebt niets ingevuld";
}
 ?>
</div>
<?php include "includes/footer.php"; ?>
De </div> van regel 47. Waar staat de <div> daarvan? op regel 39?

Maar regel 39 staat in een if-structuur
Je maakt er een rommeltje van en de tips die worden gegeven zie ik niet terug in je laatste code.
Variabelen kopiëren is onzin als je er verder niks mee doet (regel 5, 12 en 20-25).
Spring wat beter in zodat het overzichtelijk blijft (regel 18 en 19 horen in de loop, dus 2 tabs ervoor is duidelijker)

<?php
include "includes/db-config.php";
include "includes/header.php";

echo '<div id="content">'
.'<h1>Search Results</h1>';

if($_SERVER['REQUEST_METHOD'] == "POST") {
if(isset($_POST['search']) && strlen(trim($_POST['search'])) > 0){

$query = "SELECT
med_id,
med_name,
med_create_date,
med_expire_date,
med_factory_id,
med_register_date
FROM
medicines
WHERE
med_name LIKE '%" . mysqli_real_escape_string($connection, $_POST['search']) . "%'";
$search_query = mysqli_query($connection,$query);

if(!$search_query){ // Niet nodig en nooit DIE gebruiken buiten de ontwikkel versie.
die(mysqli_error($connection));
}

if(mysqli_num_rows($search_query) > 0){
echo "<table width='70%' border='solid 1px;'>"
. "<tr>"
. "<th>Name</th>"
. "<th>Production_Date</th>"
. "<th>Expire_Date</th>"
. "<th>Created by factory</th>"
. "<th>Added to database</th>"
. "<th>Edit</th>"
. "<th>Delete</th>"
. "</tr>";
while ($row2 = mysqli_fetch_assoc($search_query)){
echo "<tr>" .
"<td>{$row2['med_name']}</td>" .
"<td>{$row2['med_create_date']}</td>" .
"<td>{$row2['med_expire_date']}</td>" .
"<td>{$row2['med_factory_id']}</td>" .
"<td>{$row2['med_register_date']}</td>" .
"<td><a href='edit.php?id={$row2['med_id']}'>Edit</a></td>" .
"<td><a href='delete.php?id={$row2['med_id']}'>Delete</a></td>" .
"</tr>";
}
echo "</table>";
} else {
echo 'Geen resultaten';
}
} else {
echo 'Niks ingevuld';
}
}

echo '</div>';

include "includes/footer.php";
?>
Ivo P op 18/08/2016 16:18:53

De </div> van regel 47. Waar staat de <div> daarvan? op regel 39?

Maar regel 39 staat in een if-structuur

Die div is van de wrapper.
Elk pagina heb ik als volgt gestructureerd:

<div id="wrapper">
<div id="header"></div>
<div id="content"></div>
<div id="sidebar"></div>
<div id="footer"></div>
</div>


[size=xsmall]Toevoeging op 20/08/2016 14:05:44:[/size]

Michael - op 18/08/2016 17:45:56

Je maakt er een rommeltje van en de tips die worden gegeven zie ik niet terug in je laatste code.
Variabelen kopiëren is onzin als je er verder niks mee doet (regel 5, 12 en 20-25).
Spring wat beter in zodat het overzichtelijk blijft (regel 18 en 19 horen in de loop, dus 2 tabs ervoor is duidelijker)

<?php
include "includes/db-config.php";
include "includes/header.php";

echo '<div id="content">'
.'<h1>Search Results</h1>';

if($_SERVER['REQUEST_METHOD'] == "POST") {
if(isset($_POST['search']) && strlen(trim($_POST['search'])) > 0){

$query = "SELECT
med_id,
med_name,
med_create_date,
med_expire_date,
med_factory_id,
med_register_date
FROM
medicines
WHERE
med_name LIKE '%" . mysqli_real_escape_string($connection, $_POST['search']) . "%'";
$search_query = mysqli_query($connection,$query);

if(!$search_query){ // Niet nodig en nooit DIE gebruiken buiten de ontwikkel versie.
die(mysqli_error($connection));
}

if(mysqli_num_rows($search_query) > 0){
echo "<table width='70%' border='solid 1px;'>"
. "<tr>"
. "<th>Name</th>"
. "<th>Production_Date</th>"
. "<th>Expire_Date</th>"
. "<th>Created by factory</th>"
. "<th>Added to database</th>"
. "<th>Edit</th>"
. "<th>Delete</th>"
. "</tr>";
while ($row2 = mysqli_fetch_assoc($search_query)){
echo "<tr>" .
"<td>{$row2['med_name']}</td>" .
"<td>{$row2['med_create_date']}</td>" .
"<td>{$row2['med_expire_date']}</td>" .
"<td>{$row2['med_factory_id']}</td>" .
"<td>{$row2['med_register_date']}</td>" .
"<td><a href='edit.php?id={$row2['med_id']}'>Edit</a></td>" .
"<td><a href='delete.php?id={$row2['med_id']}'>Delete</a></td>" .
"</tr>";
}
echo "</table>";
} else {
echo 'Geen resultaten';
}
} else {
echo 'Niks ingevuld';
}
}

echo '</div>';

include "includes/footer.php";
?>


Hallo Michael,

Bedankt voor je feedback.
De tips die worden gegeven, heb ik deels gevolgd, want ik wil het zelf begrepen en later als er problemen zijn het zelf oplossen.
En de variabelen van lijn 21 t/m 26 heb ik weer gebruikt in lijn 28 t/m 34.
Jouw code vind ik ook goed, maar vind persoonlijk gevoeliger voor synatx errors.

Update:

Bij nader inzien, vind ik dat je gelijk hebt. Ik zie ook dat je code beter eruit ziet en georganiseerder is. Tnx!
Voor je eigen leesbaarheid én het voorkomen van fouten (een lege regel die een onverklaarbare ruimte in je HTML-elementen maakt), kan dit beter anders doen:

<?php
echo "<tr>" .
"<td>{$row2['med_name']}</td>" .
"<td>{$row2['med_create_date']}</td>" .
"<td>{$row2['med_expire_date']}</td>" .
"<td>{$row2['med_factory_id']}</td>" .
"<td>{$row2['med_register_date']}</td>" .
"<td><a href='edit.php?id={$row2['med_id']}'>Edit</a></td>" .
"<td><a href='delete.php?id={$row2['med_id']}'>Delete</a></td>" .
"</tr>";
?>

Dat kan beter zo.
Let op het escapen etc.
<?php
echo '<tr>
<td>'.$row2['med_name'].'</td>
<td>'.$row2['med_create_date'].'</td>
<td>'.$row2['med_expire_date'].'</td>
<td>'.$row2['med_factory_id']}.'</td>
<td>'.$row2['med_register_date'].'</td>
<td><a href="edit.php?id='.$row2['med_id'].'">Edit</a></td>
<td><a href="delete.php?id='.$row2['med_id'].'">Delete</a></td>
</tr>';
?>

Dus je opent je echo met een enkel haakje.
Je escapet al je variabelen met enkele haakjes
Je gebruikt gewoon dubbele haakjes in HTML (zie onderste regels).
Je sluit niet elke keer je echo af, het is 1 echo!
Eddy E op 21/08/2016 10:35:59

Dus je opent je echo met een enkel haakje.
Je escapet al je variabelen met enkele haakjes
Je gebruikt gewoon dubbele haakjes in HTML (zie onderste regels).
Je sluit niet elke keer je echo af, het is 1 echo!


PHP laat je daarin heel vrij in tegenstelling tot andere programmeertalen die een structuur eisen.
Persoonlijk doe ik het zo omdat ik dat mooier vind. Iedereen heeft zijn eigen manier wat hij/zij het fijnste vind.
<?php
echo '<tr>' . PHP_EOL
. '<td>' . $row2['med_name'] . '</td>' . PHP_EOL
. '</tr>' . PHP_EOL;
?>
"Die div is van de wrapper."

Daar gaat het niet om.

ik bedoelde dat je zelf even in je code de bijbehorende div opzoekt.
dan zie je dat die IN een if staat, maar de </div> komt altijd. ook als de if false was.
Ivo P op 21/08/2016 18:43:28

"Die div is van de wrapper."

Daar gaat het niet om.

ik bedoelde dat je zelf even in je code de bijbehorende div opzoekt.
dan zie je dat die IN een if staat, maar de </div> komt altijd. ook als de if false was.

Aha dat bedoel je.
Inmiddels heb ik het aangepast.
Tnx!

Reageren