• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP - Search bar

Object Storage Arubacloud
0 głosów
198 wizyt
pytanie zadane 6 października 2017 w PHP przez makoszet Początkujący (360 p.)

Witam, otóż mam sobie taki kodzik jak poniżej:

<?php
	$connection = mysqli_connect('localhost','root','','search_bar_tutorial');
	$output = "";
	
	if(isset($_POST['search']))
	{
		$searchkey = $_POST['search'];
		$searchkey = preg_replace("#[^0-9a-z]#i","",$searchkey);
		
		$query ="SELECT * FROM products WHERE title LIKE '%$searchkey%' OR  description LIKE '%$searchkey%'" or die("Could not search!");
		$count = mysqli_num_rows($query);
		
		if($count > 0)
		{
			while($row = mysqli_fetch_array($query))
			{
				$title = $row['title'];
				$description = $row['description'];
				
				$output = '<div>'.$title.' '.$description.'</div>';
				echo $output;
			}
		}
		else
		{
			$output = "There was no search result!";
		}
	}

?>
<!DOCTYPE html>
<html lang="pl">
	<head>
		<meta charset="utf-8" />
		<title>Search Bar</title>
	</head>
	<body>
		<form action="index.php" method="post">
			<input type="text" name="search" />
			<input type="submit" value=">>" />
		</form>
	</body>
</html>

Po odpaleniu go, dostaję taki oto błąd:

"Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, string given in"

No i nie bardzo wiem jak się z tym uporać, jakieś sugestie, podpowiedzi?

3 odpowiedzi

+1 głos
odpowiedź 6 października 2017 przez Chess Szeryf (76,710 p.)

Dodaj do kodu tę linię:

$result = mysqli_query($connection,$query);

I zmień tę linię:

while($row = mysqli_fetch_array($query))

na tę:

while($row = mysqli_fetch_array($result))

 

komentarz 6 października 2017 przez xandros Nałogowiec (29,450 p.)
$query jest boolem :X
komentarz 6 października 2017 przez makoszet Początkujący (360 p.)

Jeszcze dla linii:

 $count = mysqli_num_rows($query);

Musiałem podmienić $query na $result i śmiga teraz tak jak chciałem. 

Dziękuję bardzo za pomoc. Tak coś czułem, że o czymś zapomniałem. :P

+1 głos
odpowiedź 6 października 2017 przez demotywatorking Obywatel (1,210 p.)

Masz napisaną kwerendę, ale jest nie wykonujesz, dodaj np.

$result = $connection->query($query);

i potem

$count = $result->num_rows;

 

komentarz 6 października 2017 przez xandros Nałogowiec (29,450 p.)
$query jest boolem :X
komentarz 6 października 2017 przez makoszet Początkujący (360 p.)
Dziękuję bardzo za pomoc :p

Tak coś czułem, że o czymś zapomniałem :D
0 głosów
odpowiedź 6 października 2017 przez xandros Nałogowiec (29,450 p.)

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ł.

komentarz 6 października 2017 przez makoszet Początkujący (360 p.)

Przeanalizuję sobie Twój kod, zawsze będę mieć kolejne źródła do nauki :P

Natomiast mi podziałało już w ten sposób:

<?php
	$connection = mysqli_connect('localhost','root','','search_bar_tutorial');
	$output = "";
	
	if(isset($_POST['search']))
	{
		$searchkey = $_POST['search'];
		$searchkey = preg_replace("#[^0-9a-z]#i","",$searchkey);
		
		$query ="SELECT * FROM products WHERE title LIKE '%$searchkey%' OR  description LIKE '%$searchkey%'" or die("Could not search!");
		$result = $connection->query($query);
		$count = mysqli_num_rows($result);
		
		if($count > 0)
		{
			while($row = mysqli_fetch_array($result))
			{
				$title = $row['title'];
				$description = $row['description'];
				
				$output = '<div>'.$title.' '.$description.'</div>';
				echo $output;
			}
		}
		else
		{
			$output = "There was no search result!";
		}
	}
?>

 

Podobne pytania

0 głosów
1 odpowiedź 105 wizyt
pytanie zadane 27 lipca 2018 w HTML i CSS przez kicuu_ Nowicjusz (210 p.)
0 głosów
0 odpowiedzi 273 wizyt
pytanie zadane 2 lutego 2018 w Inne języki przez robRoy Użytkownik (970 p.)
0 głosów
1 odpowiedź 152 wizyt
pytanie zadane 3 stycznia 2020 w PHP przez niezalogowany

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...