Zacznę może od kodu i jego opisu.
W napisanej przeze mnie klasie User pod lupę trafiają dwie jej funkcje, publiczna "set" i prywatna "is_exists", reszta nie ma związku z problemem:
<?php #class_User.php class User { public $error; private $login; private $email; private $password; private $firstname; private $lastname; private $street; private $city; private $postal; public function set($name, $var) { // funkcja ustawiająca wartości zmiennych User::validate($name, $var); // dla loginu i maila if ($name == 'login' || $name == 'email') { User::is_exists($name, $var); } if ($this->error == '') { $this->$name = $var; } } private function is_exists($name, $var) { // funkcja sprawdzająca dostępność loginu/maila // utworzenie połączenia z bazą danych require_once('../db_connect.php'); $result = $dbc->query($query); // zakończenie połączenia z bazą $dbc->close(); if ($result->num_rows) { $result->close(); $this->error .= "Podany $name już istnieje!\n"; return true; } } }
Funkcja set wywoływana jest w pliku który korzysta z utworzonego obiektu klasy User i przekazuje do obiektu za pomocą funkcji set wartości pobrane z formularza. Kod poniżej:
// obsługa formularza // dołączenie pliku z definicją klasy user require_once('../classes/class_User.php'); // usunięcie zbędnych znaków z danych wejściowych // tworzenie nowego obiektu klasy user $user = new User(); // ustawianie wartości zmiennych klasy user $user->set(login, $trimmed['login']); $user->set(firstname, $trimmed['firstname']); $user->set(lastname, $trimmed['lastname']); $user->set(email, $trimmed['email']); ($trimmed['password1'] == $trimmed['password2']) ? $user->set(password, $trimmed['password1']) : $user->error .= "Podane hasła różnią się!\n"; $user->set(street, $trimmed['street']); $user->set(city, $trimmed['city']); $user->set(postal, $trimmed['postal']); $user->set(birthday, $trimmed['birthday']); // wyświetlenie błędu w przypadku nieudanej próby ustawienia zmiennej klasy user, // brak błędu = wywołanie funkcji register klasy user dodającej użytkownika do bazy i wysyłającej email aktywacyjny if (!$user->error == '') echo "\n" . '<p class="error">' . "\n" . str_replace("\n", "<br />\n", $user->error) . "</p>\n"; else $user->register(); }
Jak widać do kontroli błędów podczas walidacji danych służy mi publiczna zmienna error, dzięki niej wiem że nie mam błędu na etapie walidacji który występuje przed felernym sprawdzeniem czy w bazie danych istnieje już podany wcześniej login lub email. Również jak widać wyświetlam sobie utworzone zapytanie przed wykonaniem go, jest ono w 100% poprawne.
W funkcji "is_exists" poprzez dołączenie pliku odpowiedzialnego za utworzenie obiektu przez który łączę się z bazą tworzę właśnie taki obiekt. Błąd połączenia nie jest zwracany a więc teoretycznie też powinienem mieć pewność że obiekt ten zostaje utworzony. Również jak widać obiekt jest tworzony wewnątrz funkcji - a więc lokalnie, dzięki czemu nie muszę się do niego odwoływać globalnie itd, a bezpośrednio za pomocą zmiennej $dbc.
Poniżej kod odpowiedzialny za połączenie z bazą danych:
<?php #db_connect.php // połączenie z bazą danych // stałe dostępu do bazy // nawiązanie połączenia $dbc = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if (mysqli_connect_errno()) { } ?>
Proszę o pomoc, nie pierwszy raz działam w podobny sposób i zawsze radziłem sobie z tym problemem, teraz jednak nie mam zielonego pojęcia skąd on się bierze

Fatal error: Call to a member function query() on a non-object in...
Rozumiem że wywołując składową klasy mysqli - query() - wywala mi błąd bo obiekt nie istnieje...
Przepraszam za zamieszanie, wątek do zamknięcia. Problem najczęściej leży nie tam gdzie go szukamy

Otóż funkcja is_exists zostaje wywołana w jednym skrypcie dwukrotnie, co za tym idzie require_once() nie dołącza drugi raz pliku odpowiedzialnego za połączenie z bazą. Zamiana na require() rozwiązuje problem

