• 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
502 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ź 440 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,195 zapytań

142,211 odpowiedzi

322,061 komentarzy

62,519 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 3316p. - dia-Chann
  2. 3251p. - Łukasz Piwowar
  3. 3243p. - Łukasz Eckert
  4. 3222p. - CC PL
  5. 3167p. - Tomasz Bielak
  6. 3157p. - Łukasz Siedlecki
  7. 3133p. - rucin93
  8. 3110p. - Maurycy W
  9. 3028p. - Adrian Wieprzkowicz
  10. 2992p. - Mikbac
  11. 2590p. - Anonim 3619784
  12. 2490p. - Marcin Putra
  13. 2467p. - Michał Telesz
  14. 2427p. - Michal Drewniak
  15. 1949p. - rafalszastok
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!

...