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

SQL query ze zmienną sesyjną

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
500 wizyt
pytanie zadane 27 stycznia 2018 w PHP przez Bakr Mądrala (6,850 p.)

Witam,

 

Jak zastosować SQL query ze zmienną sesyjną. Mój aktualny kod wygląda tak:

 $rowTask=$result=$mysqli->query("SELECT * FROM recipes WHERE login ={$_SESSION['current_log']}");
      
      
        while($rowTask = $result->fetch_object()) {

          ?>
<img src="<?php echo $rowTask->img; ?>" alt="">

Wynik tego kodu generuje błąd:

 

Fatal error: Call to a member function fetch_object() on a non-object in/home/cabox/workspace/recipes/user-recipes.phpon line32

1 odpowiedź

0 głosów
odpowiedź 27 stycznia 2018 przez Arkadiusz Waluk Ekspert (289,990 p.)

Błąd mówi, że nie da się wywołać metody fetch_object() na czymś, co nie jest obiektem.

Sprawdzamy więc co się mogło stać, że nie ma tam obiektu: http://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.

Przypuszczalnie będzie tam false, czyli błąd. I teraz patrzymy w zapytaniu - czy czasem login z sesji nie jest stringiem? Bo jeśli jest to wypadałoby go wstawić w cudzysłowy/apostrofy. A jeszcze lepiej byłoby wszystkie wartości bindować.

komentarz 27 stycznia 2018 przez Bakr Mądrala (6,850 p.)
edycja 27 stycznia 2018 przez Bakr

Jak to powinno wyglądać?

  $rowTask=$result=$mysqli->query("SELECT * FROM recipes WHERE login =?");
      $rowTask->bind_param($_SESSION['current_log']);

 

komentarz 27 stycznia 2018 przez Arkadiusz Waluk Ekspert (289,990 p.)
Zgadywanie nic nie da, wystarczy sprawdzić w dokumentacji: http://php.net/manual/en/mysqli-stmt.bind-param.php ;)

Jako pierwszy argument trzeba podać po kolei typy bindowanych wartości, a jako kolejne argumenty - wartości. W Twoim przypadku podstawiasz tylko jednego stringa, a więc pierwszym argumentem będzie 's', a drugim podstawiana wartość. No i nie zapomnij o execute() na koniec.
komentarz 27 stycznia 2018 przez Bakr Mądrala (6,850 p.)
$rowTask=$result=$mysqli->query("SELECT * FROM recipes WHERE login =?");
      $rowTask->bind_param('s',$_SESSION["current_log"]);
      $rowTask->execute();

 

komentarz 27 stycznia 2018 przez Arkadiusz Waluk Ekspert (289,990 p.)
Zgadza się, powinno zadziałać.
komentarz 27 stycznia 2018 przez Bakr Mądrala (6,850 p.)

Niestety pojawia się:

Fatal error
: Call to a member function bind_param() on a non-object in
/home/cabox/workspace/recipes/user-recipes.php
on line
28

 

komentarz 27 stycznia 2018 przez Arkadiusz Waluk Ekspert (289,990 p.)
Ach, no oczywiście. Zamiast query() powinieneś użyć prepare(), aby przygotować zapytanie, a nie je wykonać. Gapa ze mnie.
komentarz 27 stycznia 2018 przez Bakr Mądrala (6,850 p.)
Niestety nadal ten sam błąd.
komentarz 27 stycznia 2018 przez Arkadiusz Waluk Ekspert (289,990 p.)
Dziwne. Jak zapisałeś z tym prepare?
komentarz 27 stycznia 2018 przez Bakr Mądrala (6,850 p.)
$rowTask=$result=$mysqli->prepare("SELECT * FROM recipes WHERE login =?");
      $rowTask->bind_param('s',$_SESSION["current_log"]);
      $rowTask->execute();
      
        while($rowTask = $result->fetch_object()) {

 

komentarz 27 stycznia 2018 przez Arkadiusz Waluk Ekspert (289,990 p.)

Dziwne, u mnie działa. Zostaw tylko linijkę z prepare() i za nią wyświetl sobie ostatni błąd, np.:

echo $mysqli->error;

Może tu coś ciekawego baza powie.

komentarz 27 stycznia 2018 przez Bakr Mądrala (6,850 p.)

literówka w bazie ;/

 

Teraz pojawia się:

Fatal error
: Call to undefined method mysqli_stmt::fetch_object() in
/home/cabox/workspace/recipes/user-recipes.php
on line
32

 

komentarz 27 stycznia 2018 przez Arkadiusz Waluk Ekspert (289,990 p.)
Z tego co przeczytałem trzeba jeszcze wywołać metodę get_result() na obiekcie zapytania (u Ciebie $rowTask) i dopiero ona zwróci obiekt mysqli_result na którym możesz wykonać np. fetch_object().

Podobne pytania

0 głosów
1 odpowiedź 314 wizyt
pytanie zadane 24 kwietnia 2019 w SQL, bazy danych przez sapero Gaduła (4,100 p.)
0 głosów
1 odpowiedź 435 wizyt
pytanie zadane 8 sierpnia 2020 w Java przez Szyszka Gaduła (3,510 p.)
0 głosów
1 odpowiedź 137 wizyt
pytanie zadane 15 stycznia 2021 w PHP przez CSSoup Mądrala (6,460 p.)

93,187 zapytań

142,203 odpowiedzi

322,022 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2345p. - dia-Chann
  2. 2306p. - Łukasz Piwowar
  3. 2295p. - Łukasz Eckert
  4. 2282p. - CC PL
  5. 2252p. - Tomasz Bielak
  6. 2219p. - Łukasz Siedlecki
  7. 2215p. - rucin93
  8. 2201p. - Michal Drewniak
  9. 2156p. - Marcin Putra
  10. 2152p. - Adrian Wieprzkowicz
  11. 2105p. - Mikbac
  12. 1941p. - Anonim 3619784
  13. 1733p. - rafalszastok
  14. 1480p. - Michał Telesz
  15. 1469p. - ssynowiec
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...