Przekazanie zapytania do bazy do funkcji w klasie: ten sam kod zachowuje się różnie w zależności czy jest w funkcji czy nie

Odpowiedz Nowy wątek
2019-09-09 12:43
0

Mam pewien obiekt HTML ładujące dane z bazy danych:

<select class="my_select_box" data-placeholder="Select Your Options">
                        <?php 
                        $sql2 = "SELECT * FROM `owners` ";
                        $result2 = $conn->query($sql2) or die(mysqli_error($conn));
                        ?>
                        <?php while($row2 = $result2->fetch_array()): ?>
                            <option><?= $row2["Name"] ?></option>
                        <?php endwhile ?>
                    </select>

Powyższy kod pobierający dane z bazy danych chciałbym przenieść do osobnej klasy:

// getting_data.php:

class DataLoader{

    private $ownersCache;
    private $conn;

    function __construct($conn)
    {
        $this->conn = $conn;

        if ($this->conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        }
    }

    function loadOwners(){
        //clog("$this->ownersCache");
        if(!is_null($this->ownersCache))
            clog($this->ownersCache->fetch_array());
        else    
            clog("null");

        $sql = "SELECT * FROM `owners`";
        if(is_null($this->ownersCache)){

            $this->ownersCache = $this->conn->query($sql) or die(mysqli_error($this->conn));
        }

        return $this->conn->query($sql) or die(mysqli_error($this->conn));
    }
}

HTML używający klasy wygląda wtedy tak:

include 'parts/getting_data.php';
$dataLoader = new DataLoader($conn);
[...]
<select class="my_select_box" data-placeholder="Select Your Options">
                        <?php 
                        $sql2 = "SELECT * FROM `owners` ";
                        $result2 = $conn->query($sql2) or die(mysqli_error($conn));
                        ?>
                        <?php while($row2 = $dataLoader->loadOwners($conn)->fetch_array()): ?>
                            <option><?= $row2["Name"] ?></option>
                        <?php endwhile ?>
                    </select>

Niestety, mimo że w zasadzie robię to samo (funkcja zwraca dokładnie to samo zapytanie którego używałem wcześniej), to w przypadku drugiej wersji pojawia się błąd:

Fatal error: Uncaught Error: Call to a member function fetch_array() on bool in /var/www/html/app/permissions.php on line 100

Ma ktoś pomysł o co może chodzić?

edytowany 1x, ostatnio: iteredi, 2019-09-09 12:45

Pozostało 580 znaków

2019-09-09 14:46
0

To znaczy, że w pliku permissions.php w linii 100 przekazujesz do funckji fetch_array() wartość typu bool :)

A tak na serio to nie wiem co jest w pliku permissions.php i gdzie jest odwołanie do tego pliku. Moim zdaniem problem jest tu:

if(!is_null($this->ownersCache))
            clog($this->ownersCache->fetch_array());
        else    
            clog("null");
Rozumiem treść błędu, nie rozumiem jego znaczenia. Według dokumentacji, fetch_array() powinien albo zwrócić tablicę stringów z danymi, albo NULL. Nie ma nigdzie mowy o wartości bool. Co do podesłanego przez ciebie fragmentu: wykomentowanie go nie pomaga. - iteredi 2019-09-09 20:58
Nie mogę już edytować posta, ale permissions.php to fragment html'a ze znacznikiem <select>. Wspomniana w błędzie linijka numer 100: <?php while($row2 = $dataLoader->loadOwners($conn)->fetch_array()): ?> - iteredi 2019-09-09 20:59
Ok, to wrzuć kod pliku permissions.php - leonpro778 2019-09-09 21:00
Dobra, źle się wyraziłem trochę wcześniej. Próbujesz "użyć" funkcji fetch_array() na "logicznym typie danych". Tak naprawdę $dataLoader->loadOwners($conn) zwraca Ci wartość typu boolean. Zrób sobie var_dump($dataLoader->loadOwners($conn)) i zobacz co dostaniesz. - leonpro778 2019-09-10 04:23

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