Problem z PHP i SQL

Odpowiedz Nowy wątek
2019-05-14 01:59
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 :/

Pozostało 580 znaków

2019-05-14 04:47
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.


edytowany 1x, ostatnio: TomRZ, 2019-05-14 04:47
Wydaje mi się, że na pierwszy rzut oka podany powyżej sposób wydaje się prostszy. Osoba początkująca patrzy na PDO i może lekko spanikować. Wiem, że to tylko takie wrażenie/odczucie, ale myślę, że wiem, z czego to wynika. - cerrato 2019-05-14 09:06
PDO nie jest trudniejsze, tutaj jest schemat: od dawna nie ma żadnych nowych tutoriali po Polsku dla PHP (zniknęła nawet PL wersja php.net), na sieci wiszą stare syfy, początkujący w większości nie szukają materiałów po ang., więc trafiają na koszmarne tutoriale pisane przez amatorów 10-12 lat temu i potem są takie skutki jak wyżej: dziurawy skrypt, źle zaprojektowana baza danych, masakra.... - TomRZ 2019-05-14 14:00
Nie mówię, że jest trudniejsze, ale "groźniej" wygląda, przez co może trochę odstraszać osoby początkujące. - cerrato 2019-05-14 14:43
Uważam, że to kwestia wytłumaczenia, stare tutoriale to po prostu czasy kiedy PDO jeszcze nie było, albo dopiero weszło. - TomRZ 2019-05-14 17:59

Pozostało 580 znaków

2019-05-14 09:17
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.

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 :/ - SzwagierMayster 2019-05-14 09:56

Pozostało 580 znaków

2019-05-14 10:04
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...

dobra działa, błąd był w bazie danych :) - SzwagierMayster 2019-05-14 10:17

Pozostało 580 znaków

2019-05-17 14:14
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
}

Pozostało 580 znaków

2019-05-17 14:41
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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