Dużo.
Masz np. tutaj błąd:
$query ="SELECT * FROM products WHERE title LIKE '%$searchkey%' OR description LIKE '%$searchkey%'" or die("Could not search!");
$query jest boolem. To jest to samo co:
$query = 'string' or null;
Na wstępie podpowiem, byś przerzucił łączenie z bazą i zapytanie do innego pliku i stworzył tam funkcje, która to wykonuje.
Każda funkcja ma robić tylko jedną rzecz. Ma ją robić dobrze. Nie ma mieć więcej niż 3 nestedy. Ma mieć mniej niż 31 lini kodu.
Search raczej powinien być przesyłany http_method GET, a nie POST. Pobieramy dane (GET), a nie tworzymy/wysyłamy (POST).
Wpierw przewalidowałbym searcha:
function isValidSearch($input)
{
return preg_match("#[^0-9a-z]#i", $input);
}
stworzyłbym połączenie z bazą:
function getConnection()
{
return mysqli_connect('localhost', 'root', '', 'search_bar_tutorial');
}
później spróbował znależć w bazie (używając bindowania zmiennych):
function getProductWhereDescriptionOrTitleIsLike($search)
{
$connection = getConnection();
$search = '%' . $search . '%';
$query = 'SELECT * FROM products WHERE title LIKE :title OR description LIKE :description';
$statement = $connection->prepare($query);
$statement->bind_param('ss', $search, $search);
return $statement->execute() ? $statement->get_result()->fetch_all(MYSQLI_ASSOC) : [];
}
Z htmlem najprościej zrobiłbym coś takiego:
<?php
$search = !empty($_GET['search']) ? $_GET['search'] : null;
$products = isValidSearch($search) ? getProductWhereDescriptionOrTitleIsLike($search) : [];
?>
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<title>Search Bar</title>
</head>
<body>
<form action="index.php" method="get">
<input title="search" type="text" name="search">
<input type="submit" value=">>">
</form>
<?php if ($products): ?>
<section>
<?php foreach ($products as $product): ?>
<article>
<?= $product['title'] . ' ' . $product['description'] ?>
</article>
<?php endforeach; ?>
</section>
<?php endif; ?>
</body>
</html>
Ofc, dałoby rade to o wiele lepiej zrobić, ale ten post musiałby przekształcić się w artykuł.