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]
Op je eerste vraag: je zoekopdracht levert *alle* records op als resultaat wanneer je niets invult, immers wordt de zoekquery dan iets als "WHERE med_name LIKE '%%'". Je houdt nergens rekening met het feit dat je meer dan 1 resultaat kan hebben, je overschrijft constant je variabelen (maakt nutteloos extra variabelen aan) en print eenmalig je resultaat.

Op je tweede vraag: op welke regels krijg je deze meldingen? Vermoedelijk vraag je om kolommen die niet bestaan?

De foutmeldingen zijn niet onlogisch, het resultaat ook niet. Je code wel als dit niet is wat je probeert te bereiken.
Hallo Ben,

Wanneer ik niets invul en ik klik op zoeken, dan worden er niet alle records weergegeven, enkel het eerste item in de lijst. Ik ga nog even kijken hoe meerdere resultaten kunnen weergegeven worden. Deze punt is voor mij dus.


Wat bedoel je met dat ik constant de variabelen overschrijf? In andere topic heb ik aangegeven dat ik variabelen gebruik omdat ik het overzichtelijk vind. Als er een andere betere manier is, dan hoor ik dat graag.

Ik krijg onderstaande volgende foutmeldingen
en ik denk dat ik deze undefined foutmelding kan weghalen door de PHP code anders te laten beeindigen... en juist hier kom ik niet uit....


Notice: Undefined variable: medicine_name in D:\xampp\htdocs\inventory_test\search_results.php on line 35

Notice: Undefined variable: medicine_create_date in D:\xampp\htdocs\inventory_test\search_results.php on line 36
Notice: Undefined variable: medicine_expire_date in D:\xampp\htdocs\inventory_test\search_results.php on line 37

Notice: Undefined variable: medicine_factory in D:\xampp\htdocs\inventory_test\search_results.php on line 38

Notice: Undefined variable: medicine_register_date in D:\xampp\htdocs\inventory_test\search_results.php on line 39

Notice: Undefined variable: medicine_id in D:\xampp\htdocs\inventory_test\search_results.php on line 40

Notice: Undefined variable: medicine_id in D:\xampp\htdocs\inventory_test\search_results.php on line 41
Ik krijg onderstaande volgende foutmeldingen
en ik denk dat ik deze undefined foutmelding kan weghalen door de PHP code anders te laten beeindigen... en juist hier kom ik niet uit....

Dit komt omdat je één resultaat afdrukt, of er nu resultaten zijn of niet.

Kijk maar eens naar de codeblokken van je code:
<?php
if (isset($_POST['submit'])) {
    // hier voer je je query uit
    if (!$search_query) {
        // foutmelding
    }
    
    if ($count == 0) {
        // geen resultaten
    } else {
        while ($row2 = mysqli_fetch_assoc($search_query)) {
            // while loop die continu resultaten overschrijft in variabelen
        }        
    }
    // hier druk je één resultaat af, ook al zijn er meerdere, of geen...
}
?>

De structuur van deze code kan anders en beter. Daarnaast komt het de leesbaarheid ten goede wanneer je correct inspringt.
M.a.w zeg je dat ik na de loop moet controleren of er resultaten zijn?
Zo jah dan moet ik beslissen of ik een resultaat of meerdere wil weergeven?

Ik heb alleen geen idee hoe ik dat moet doen. En, voor de while loop controleer ik of de query resultaten heeft of niet...ben een beetje in de waar dus....snap je mij?
ik zou van regel 4 en 5 maken

<?php
if($search = filter_input(INPUT_POST, 'search')) {
?>

Je wilt namelijk in eerste instantie niet weten of er op die knop gedrukt is. Je wilt weten of iemand iets heeft opgegeven waarop gezocht moet worden.

Deze if kijkt of het veld search gepost is EN of de waarde daarin niet leeg is.
Alleen dan lijkt me dat je wilt zoeken.

Verder kan het geen kwaad om een beetje logisch in te springen in je code. Dat maakt het overzichtelijker en leesbaarder.

(en naar mijn mening kan regel 6+7 ook leesbaarder worden door niet 2x iets aan de var toe te voegen, maar door gewoon binnen de query op enter te drukken:

<?php
$query = "SELECT *
FROM tabel
WHERE kolom LIKE '%". $search ."%'";
?>

(en dan ook nog even naar een escape functie kijken voor het geval iemand nog leuke opties weet met ' in de zoekterm)
De handigste plek om resultaten af te drukken is in de while-loop zelf.

<?php
// is er een formulier gesubmit?
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // voer query uit
    $result = mysqli_query($connection, '... je query ...');
    // zijn er resultaten?
    if (mysqli_num_rows($result) == 0) {
        ?><p>Geen resultaten gevonden.</p><?php
    } else {
        // doorloop resultaten...
        while ($row = mysqli_fetch_assoc($result)) {
            // ... en druk deze hier direct af met behulp van $row
        }
    }
    // geef resultaten vrij
    mysqli_free_result($result);
}
?>


Als dit trouwens zoekfunctionaliteit betreft dan is het misschien handiger om te werken met GET in plaats van met POST.

Vermijd ook de introductie van overbodige variabelen.
Ik heb express de while code en de resultaten gescheiden van elkaar gehouden, omdat ik de resultaten in de div content wil weergeven, terwijl de while helemaal aan het begin, dus voor html uitgevoerd wordt, wordt uitgevoerd....

als er dus geen andere manier is, dan zal ik while loop en de resultaten weer samenvoegen...
je kunt die while wel apart houden, maar dan moet je ipv alle info in een variabele stoppen er een array voor gebruiken.

(en dan loop je in je div weer door je array heen.)

Kan wel, maar dan moet je 2x loopen
Update;
Nu heb ik de while loop code en resultaten samengevoegd.
En wanneer ik nu een paar letter invul, dan worden er meerdere resultaten weergegeven, dus zoals het hoort.
Het enige probleem waar ik nu tegen loop is dat alle records worden weergegeven wanneer ik niets invul en klik op search...

Iemand een idee hoe ik dit moet aanpakken?


BTW; voordat ik commentaar krijg over het aanpakken van security :) wil ik zeggen dat jullie allemaal gelijk hebben, en dit pak ik nadat ik de kern van de applicatie werkt :) bedankt voor jullie geduld!



<?php include "includes/db-config.php"; ?>
<?php include "includes/header.php"; ?>
<?php
if(isset($_POST['submit']) & !empty($_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 {
		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 } ?>
</div>
<?php include "includes/footer.php"; ?>
ik heb net al een suggestie gedaan over regel 4 en 5

jij controleert nu of er op de button is gedrukt en of de button niet een lege value had. (waarschijnlijk de caption van de button???)

controleer dan of het zoekvlak niet leeg was.

Reageren