Problem z PHP i SQL

0

Witam mam problem bo zamiast rekordów z bazy danych wyskakuje mi błąd:

"Notice: Trying to get property 'num_rows' of non-object", który odnosi się do linijki 26 czyli:
$ile_znaleziono = $wynik->num_rows;

usługi.html:

<form action="wyniki.php" method="post">
      Wyszukaj według:
      <select name="metoda">
       <option value="Cel podróży" />Celu podróży
       <option value="Atrakcja" />Preferowanej atrakcji
       <option value="Koszt" />Budżetu
      </select>
      <br /><br />
      Szukane wyrażenie:
      <input type="text" name="wyrazenie" />
      <input type="submit" name="wyszukaj" />
    </form>

wyniki.php:

 <?php
      $metoda = $_POST['metoda'];
      $wyrazenie = $_POST['wyrazenie'];
      $wyrazenie = trim($wyrazenie);
      if (!$metoda || !$wyrazenie)
      {
        echo 'Brak parametrów wyszukiwania, wróć do poprzednej strony i spóbuj ponownie!';
        exit;
      }
      if (!get_magic_quotes_gpc())
      {
        $metoda = addslashes($metoda);
        $wyrazenie = addslashes($wyrazenie);
      }
      @ $db = new mysqli('localhost','admin',' ','wycieczki');
      
      if (mysqli_connect_errno())
      {
        echo 'Połączenie z bazą nie powiodło się. Spóbuj ponownie';
        exit;
      }
      $db->query('SET NAMES utf8');
      $db->query('SET CHARACTER_SET utf8_unicode_ci');
      $zapytanie = "select * from wycieczka where ".$metoda. " like '%".$wyrazenie."%'";
      $wynik = $db->query($zapytanie);
      $ile_znaleziono = $wynik->num_rows;
      echo '<p> Liczba znalezionych wycieczek: '.$ile_znaleziono.'</p>';
      for ($i=0;$i<$ile_znaleziono;$i++)
      {
        $wiersz = $wynik->fetch_assoc();
        echo '<p><b>'.($i+1).'Cel podróży: '.stripslashes($wiersz['Cel podróży']).'</b><br />';
        echo 'Atrakcja: '.stripslashes($wiersz['Atrakcja']).'<br />';
        echo 'Opis: '.stripslashes($wiersz['Opis']).'<br />';
        echo 'Miejsca: '.stripslashes($wiersz['Miejsca']).'</p><br />';
		echo 'Koszt: '.stripslashes($wiersz['Koszt']).'</p><br />';
      }
      /*$wynik->free();*/
      $db->close();
    ?> 

Nie wiem w czym jest problem. Może ktoś jest w stanie pomóc? Dodam, że wyniki z bazy danych w formularzu dla preferowanej atrakcji i budżetu wyświetlają się bezproblemowo. Tylko błąd wyskakuje przy Celu podróży :/

0

Coś jest źle z kodowaniem, bo w opcji "Cel podróży" są znaki diakrytyczne.

Poza tym ten skrypt jest podatny na atak SQL Injection, można bez problemu wyciągnąć wszystkie dane z bazy danych - np. osobowe, etc.

Inna sprawa jest taka, że samo zapytanie i struktura bazy jest zła, metoda powinna być określana przez liczbowy identyfikator a nie tekstowo, i później szukane przez like %%.

Kolejna sprawa to używanie mysqli zamiast PDO, nie wiem skąd się to bierze u początkujących, wszyscy chyba czytaja w sieci ten sam poradnik do PHP napisany przez jakiegoś janusza 10 lat temu.

1

Skoro komunikat błędu "mówi" że chcesz pobrać własciwośc z "nieobiektu" to znaczy, że $wynik nie jest obiektem.
Jak zerkniesz do dokumentacji: https://www.php.net/manual/en/mysqli.query.php

Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.

To masz wiedze kiedy $wynik nie będzie obiektem a boolean-em.

W prostych słowach: masz zapytanie generujące bład.

0

Odpowiadaj w komentarzach...

Czyli jak to powinno prawidłowo wyglądać? Spędziłem nad tym z pół nocy i nie mogę się pozbyć błędu. Dziwne bo jak wybieram w formularzu szukaj według Preferowanej Atrakcji bądź budżetu to działa a dla Celu podróży już nie

Nie programuje w PHP wiec nie wiem jakie są dobre praktyki ale wypadaloby przynajmniej sprawdzić czy wunik nie ma wartości false

$db->query('SET NAMES utf8');
$db->query('SET CHARACTER_SET utf8_unicode_ci');
$zapytanie = "select * from wycieczka where ".$metoda. " like '%".$wyrazenie."%'";
$wynik = $db->query($zapytanie);
if($wynik === false)  {
	//tu kod do obsługi błednego wykonania zapytania
} else {
	$ile_znaleziono = $wynik->num_rows;
	echo '<p> Liczba znalezionych wycieczek: '.$ile_znaleziono.'</p>';
	for ($i=0;$i<$ile_znaleziono;$i++) {
	$wiersz = $wynik->fetch_assoc();
		echo '<p><b>'.($i+1).'Cel podróży: '.stripslashes($wiersz['Cel podróży']).'</b><br />';
		echo 'Atrakcja: '.stripslashes($wiersz['Atrakcja']).'<br />';
		echo 'Opis: '.stripslashes($wiersz['Opis']).'<br />';
		echo 'Miejsca: '.stripslashes($wiersz['Miejsca']).'</p><br />';
		echo 'Koszt: '.stripslashes($wiersz['Koszt']).'</p><br />';
	}
}

Skoro jednak wiesz kiedy dostajesz błąd i w jakim przypadku, to wyświetl sobie $zapytanie i zobacz co z nim nie tak...

0

To ze byl blad w bazie danych nie rozwiazalo twojego bledu w skrypcie ktory nadal istnieje.
Zaimplementuj tak jak w poscie wyzej

$wynik = $db->query($zapytanie);
if(count($wynik > 0)  {
    // rob dalszy kod
} else {
    // pokaz info ze brak danych w bazie
}
0
if(count($wynik > 0)  {

count dla false zwróci 1 więc wykona sie jak nie ma danych... I sypnie ostrzeżeniem:
https://www.php.net/manual/en/function.count.php

1 użytkowników online, w tym zalogowanych: 0, gości: 1