Forum: PC Hard- und Software Trying to get property of non-object


von TM F. (p_richner)


Lesenswert?

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

von Jan H. (j_hansen)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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...

: Bearbeitet durch User
von TM F. (p_richner)


Lesenswert?

Ε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.

: Bearbeitet durch User
von Jan H. (j_hansen)


Lesenswert?

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?

von TM F. (p_richner)


Lesenswert?

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.

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

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.

von TM F. (p_richner)


Lesenswert?

Εrnst B✶ schrieb:
> ein die("Useraccount
> existiert nicht") einsetzen, und schon passt alles wieder.

Wenn ich die ("Keine Daten erhalten") herausnehme,funktioniert es, es 
zeigt einfach die Fehlermeldungen an. Unterdrücken könnte ich sie auch, 
dies löst jedoch nicht das Problem.

von Jan H. (j_hansen)


Lesenswert?

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.

von TM F. (p_richner)


Lesenswert?

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.

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

P_ Richner schrieb:
> Ich sehe nicht, wo der Unterschied ist.

Die eine Funktion wird nur dann aufgerufen, wenn der Benutzer korrekt 
eingeloggt ist. Deine neue funktion wird scheinbar auch dann aufgerufen, 
wenn das nicht der Fall ist.
=> Ich hoffe, das ist keine Sicherheitsrelevante Sache, an der du 
arbeitest...

von TM F. (p_richner)


Lesenswert?

Εrnst B✶ schrieb:
> Deine neue funktion wird scheinbar auch dann aufgerufen,
> wenn das nicht der Fall ist.

Es ist ja codemässig genau dasselbe, nur mit anderen Ausführungen in der 
if()-Abfrage.

> Ich hoffe, das ist keine Sicherheitsrelevante Sache, an der du
> arbeitest...
Nein ist es nicht

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

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.

: Bearbeitet durch User
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

P_ Richner schrieb:
> $temp = mssql_quer

man sollte auch prüfen ob DAS überhaupt geklappt hat.

P_ Richner schrieb:
> und damals funktionierte alles

Wenn alles funktioniert, warum änderst du es dann?

von TM F. (p_richner)


Lesenswert?

Ich habe das Problem sehr wahrscheinlich herausgefunden. Ich muss zuerst 
ein Anmeldefeld machen, danach mit diesem Benutzernamen weiter arbeiten.
MfG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.