Trying to get property of non-object

OP #3617815
Hallo zusammen
Ich habe das Problem, dass wenn ich eine php-Website ausführen will. 
folgende Fehlermeldung kommt:
1
Notice: Trying to get property of non-object in /var/www/... on line 154

Hier ist der Code:
1
$data = mssql_fetch_object($temp);
2
if($data->change_priority == "1")    <--- Zeile 154
3
{
4
    ....
5
}

Wo liegt das Problem?
Danke für die Hilfe

MfG
P_ Richner schrieb:
> Wo liegt das Problem?

Des Rätsels Lösung hast du doch eh schon selbst sogar zwei Mal gepostet: 
"Trying to get property of non-object".

In Zeile 154 greifst du auf die Property des $data-Objekts zu ("Trying 
to get property..."). Zumindest versuchst du das, denn laut der 
Fehlermeldung ist $data kein Objekt(... of non-object). Also wirf mal 
den Debugger an und schau, was das sonst ist.
P_ Richner schrieb:
> Wo liegt das Problem?

Dokumentation nicht gelesen:
http://www.php.net/manual/en/function.mssql-fetch-object.php

Vor allem:
1
Returns an object with properties that correspond to the fetched row, or FALSE if there are no more rows.

"FALSE" ist kein Objekt, und hat keine Eigenschaft "change_priority".

Also:
$data = mssql_fetch_object($temp);
if (!$data) { die("Something went wrong"); }
if($data->change_priority == "1")


oder mit mssql_num_rows($query) vorher prüfen, wieviele Zeilen gefunden 
wurden, oder, oder...
OP
Εrnst B✶ schrieb:
> $data = mssql_fetch_object($temp);
> if (!$data) { die("Something went wrong"; }
> if($data->change_priority == "1")

Habe es so ausprobiert und ich erhalte die Fehlermeldung "Something went 
wrong". D.h., dass ich keine Daten erhalte. Aber wie kann ich das 
ändern?
Habe es auch mit mssql_fetch_row() und mssql_fetch_array() probiert, 
geht trotzdem nicht.
P_ Richner schrieb:
> Habe es so ausprobiert und ich erhalte die Fehlermeldung "Something went
> wrong". D.h., dass ich keine Daten erhalte. Aber wie kann ich das
> ändern?

1. Datenbanktabelle anlegen
2. Datenbanktabelle mit Daten befüllen
3. Datenbankverbindung herstellen 
http://www.php.net/manual/en/function.mssql-query.php
4. Daten abfragen 
http://www.php.net/manual/en/function.mssql-fetch-object.php
5. Nach dem Erfolgserlebnis erst einmal die DOKU lesen, dort steht das 
mit einfachsten Beispielen beschrieben.

P.S.: schau dir einmal deinen Eingangspost an. Wie glaubst du soll dir 
jemand mit diesem Miniausschnitt gezielt weiterhelfen?
OP
Die Datenbank ist schon vorhanden. Die Website wurde vor vier Jahren 
programmiert und damals funktionierte alles. Jetzt muss ich sie auf den 
neusten Stand bringen...
1
function(...)
2
{
3
  sql_open();
4
  $temp = mssql_query("SELECT * FROM [USER] WHERE [User] = '".ldap_name($_SERVER['AUTHENTICATE_SAMACCOUNTNAME'])."'");
5
  
6
  $data = mssql_fetch_object($temp);
7

8

9
  if (!$data)  
10
    die("Keine Daten erhalten"); 
11

12
  if($data->change_priority == "1")  <-- Fehlermeldung: Notice: Trying to get property of non-object in /var/www/xxx.php on line 162
13
  {
14

15
  }
16
}

Hoffe dies hilft weiter.
Also: Statt die("Keine Daten erhalten") einfach ein die("Useraccount 
existiert nicht") einsetzen, und schon passt alles wieder.

Du versuchst einen Datensatz aus der USER-Tabelle zu lesen, der nicht 
existiert. Wie darauf richtig zu reagieren ist, musst du selber wissen.
Dann geht's los mit schrittweisem Debugging:

1. Welche Query ("SELECT * FROM [USER] WHERE [User] = 
'".ldap_name($_SERVER['AUTHENTICATE_SAMACCOUNTNAME'])."'") wird 
überhaupt erzeugt? Lass dir das ausgeben. Kann das stimmen?

2. Schaut das gut aus, dann führe das direkt in der Datenbank aus. 
Kommen dort Ergebnisse heraus?

3. Wenn ja, dann schau was in deinem $temp (übrigens nicht gerade eine 
gute Variablenbezeichnung) drinsteht. Doku lesen: "Returns a MS SQL 
result resource on success, TRUE if no rows were returned, or FALSE on 
error."
Wenn TRUE oder FALSE, dann hast du hier ein Problem, ansonsten weiter 
mit dem nächsten Schritt:

4. Den Schritt hast du ja schon gemacht, also eigentlich von hinten 
begonnen. Überprüfe $data. Hier steht ja anscheinend FALSE drinnen. 
Trotzdem noch einmal explizit ausgeben lassen und überprüfen was 
wirklich drinsteht.
OP
Hier noch eine Funktion, mit der es geht:
1
function (...)
2
{
3
  sql_open();
4
  $temp = mssql_query("SELECT * FROM [USER] WHERE [User] = '".ldap_name($_SERVER['AUTHENTICATE_SAMACCOUNTNAME'])."'");
5
  $data = mssql_fetch_object($temp);
6
  if($data->change_user == "1")
7
  {
8
     ...
9
  }
10
  sql_close();
11
}

Ich sehe nicht, wo der Unterschied ist.
P_ Richner schrieb:
> Es ist ja codemässig genau dasselbe, nur mit anderen Ausführungen in der
> if()-Abfrage.

Es geht nicht nur darum, was in der Funktion steht, sondern auch 
wann und wo sie ausgeführt wird.

Wenn der Programmierer der funktionierenden Funktion durch Checks 
vorher, durch Programmlogik, Zugriffsbeschränkungen, .htaccess, whatever 
sichergestellt hat, dass seine Funktion nur für gültige, eingeloggte, 
Benutzer ausgeführt wird, und du das für die neue Funktion nicht tust, 
dann geht die alte weiterhin, und deine neue halt nicht, oder nur 
manchmal, oder vielleicht zufälligerweise sogar immer.

=> Du musst verstehen was du tust.
Nicht per Copy&Paste irgendwas zusammenstöpseln, und dann hoffen dass 
ein Webforum das irgendwie in eine lauffähige Form zusammenwürfeln kann.


Sorry wenn das böse klingt, aber so ist es einfach. Wir können hier, 
ohne alles aussenrum zu kennen, nur an Symptomen herumdoktorn, aber das 
eigentliche Problem nicht sehen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.