Call to a member function query() on a non-object in

Matze202

Erfahrenes Mitglied
Hi,

ich versuche gerade das erstmal mit MySQLi zu arbeiten, jedoch konnte ich bisher leider keinen Erfolg feststellen, da ich bereits mit diesem ersten Versuch, nur diesen Fatal Error angezeigt bekomme, den ich leider nicht beseitigen konnte. Ich teste nun bereits seit gestern um die selbe Zeit und versuchte über Google & Co eine Lösung zu finden, daher hoffe ich, dass ich nicht wie die letzten male hier gleich wieder angemotzt werde, sondern nur Hilfe erhalte, die zu dieser Sache hilfreich sein könnte.

Dies ist der Fehlercode:
PHP Fatal error: Call to a member function query() on a non-object in /***/func/main.func.inc.php on line 36, referer: http://www.***.de/

in der config.inc.php erstelle ich die Verbindung, lese Verbindungsfehler aus und habe auf utf8 das charset gesetzt
PHP:
  $mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);
  if (mysqli_connect_errno()) {
      printf("Connect failed: %s\n", mysqli_connect_error());
      exit();
  }
  $mysqli->set_charset('utf8');

Hier in der ersten Zeile befindet sich der Inhalt, der Zeile 36 aus der main.func.inc.php.
PHP:
    if($result = $mysqli->query("SELECT id, name, email, v_name, n_name, aktiv FROM user
                              WHERE name = '".$mysqli->real_escape_string($username)."'
                              AND pass = '".md5_pass($mysqli->real_escape_string($passwort))."'")){
      $array = $result->fetch_array(MYSQLI_ASSOC);
    }else{
      echo $mysqli->error;
    }

    if($result2 = $mysqli->query("SELECT * FROM allrss_rechte WHERE uid = '".$array['id']."'")){
      $array2 = $result2->fetch_array(MYSQLI_ASSOC);
    }else{
      echo $mysqli->error;
    }

Hat bitte jemand eine Lösung oder Fehlerbehebungsansetze?

Der Fatal Error erzeugt bei mir übrigens einen 500er Error, weshalb ich alle Fehlermeldungen nur aus den Logfiles lesen kann und mir nicht auf der Seite selbst ausgeben lassen kann.

Ich habe viel bereits über $this-> gelesen und getestet, aber dies erzeugte bei mir leider nur weitere Fatal Error.

Den Code habe ich mir nach besten Wissen und Gewissen, aus den php.net Codes zusammen geschrieben.

Ich habe parallel zu dieser Datenbank-Verbindung noch eine auf dem herkömmlichen MySQL-Code bestehen, welche problemlos funktioniert, die sich so nach und nach von MySQL auf MySQLi umstellen will.

Könnte es eventuell sein, dass diese sich beisen? Weil diese alte Verbindung bisher noch zu viele alte Datenbankabfragen bearbeitet, konnte ich diese aber noch nicht abstellen, denn sonst habe ich ebenfalls viele anderen Fehler. Wenn dies jedoch daran liegt, dann werde ich erstmal alle umschreiben müssen, was ich lieber nach einer funktionierenden Datenbankabfrage über mysqli, so nach und nach umstellen wollte.

M.f.G. Matze202.
 
Dein $mysqli scheint zu diesem Zeitpunkt kein Objekt zu sein. Wird der config-Aufruf sauber durchgeführt?
Schliesst du irgendwo vorher das $mysqli?
 
Danke, für die schnelle Antwort, wie mache ich aus dem $mysqli ein Objekt? bisher suchte ich immer nach dem query. Ich dachte das Objekt erstellt "new mysqli" selbst?

Das $mysqli beende ich erst am Ende der index.php, über welche die Daten komplett bearbeitet werden.

EDIT: ich vermute, dass es an der Funktion liegt, in dem die Datenbankabfrage liegt, weil die $mysqli offensichtlich nicht Global-Verfügbar ist. Dies teste ich gerade aus.
 
Zuletzt bearbeitet:
Jepp, mit new MySqli erstellst du das Objekt. Auf Zeile 36 wendest du es an. Ist es dort bereits/immer nich ein Objekt?

Mach einfach mal vor deiner Zeil 36 ein var_dump($mysqli)
 
Ich habe jetzt den Fehler durch einfügen von folgenden in den Funktionen behoben:

PHP:
  global $mysqli;

Hast du bitte nen Tip, wie ich dieses Objekt für alle Funktionen als Objekt verfügbar machen kann?
 
Ah, das ist innerhalb einer Funktion/Klasse. Dann ists klar.

Du kannst $mysqli der Klasse als Referenz übergeben oder einfach in zukunft so aufrufen
PHP:
$GLOBALS['mysql']->query(...);
 
Ahhh danke dir, hatte nicht gedacht, dass die Objekte von $mysqli, auch von $GLOBALS['mysqli'] verfügbar sind.

Aber jetzt funktioniert es.

Super danke dir ;)
 
Zuletzt bearbeitet:
Öh, aber GLOBALS ist wirklich nur ne ziemlich unsaubere Lösung. Übergib das Objekt eher per Parameter ;)
 
Unsaubere Lösung, wäre es doch nur, wenn man dieses $GLOBALS['mysqli'], erst separat erstellen müßte oder nicht, denn es ist schließlich bereits mit verfügbar.

Mit als Objekten als Parameter übergeben, kenne ich mich leider nicht wirklich aus, wäre es möglich, dass du mir paar Links schicken könntest, denn bei meinen ersten ansätzen mit dem Suchen, habe ich es leider noch nichts gefunden, was mir weiter hilft.

Oder kannst du vielleicht an Hand meines obigen Codes, es kurz erklären?

Gruß Matze202.
 
Naja, die funktionale programmierung ist für mich der erste Schritt zu objektorientierten Programmierung (Du kannst solche sachen wie die MySQLi-Klasse auch selber schreiben, falls du das nicht gewusst hast!, mehr dazu zB hier: http://www.php.net/manual/en/language.oop5.basic.php ) Eines der grundlegenden Konzepte dabei ist es, Daten und Logiken in Objekten oder Funktionen zu kapseln. Also innerhalb der Funktion sollte nicht von außerhalb bekannt sein - außer dem, was über die Paramter übergeben wird ;) Dadurch wird die entsprechende Klasse/das Objekt "austauschbar", ein weiteres wichtiges kritekrium für vernünftigen Code. Konkret bedeutet das: Du kannst deine Funktion mit der des Nachbarn austauschen, solange sie das selbe tut und die gleichen Paramter erwartet.

GLOBALS haut dieses Konstrukt komplett um und macht das eben erklärte nichtig. Also schön die Finger davon lassen.
 
Zurück