PHP Variablen korrekt anmelden

Also,

Konfiguration: WinVista/Business 32 mit xampp 1.7.4
In der php.ini Einstellungen:
display_errors = Off
display_startup_errors = Off

Problem:
in dieser Version von xampp bzw. php.ini werden standardmäßig die o.g. Var’s auf ‚On‘ gesetzt. Bei meinem Mietserver (RootServer bei 1&1) und bei mir (local) ‚normalerweise‘ nicht.
Ich glaubte bis heute, dass ich sauber programmiere in PHP, Erfahrungen habe ich seit Jahre in Asm (für DOS) und Delphi (32 Win) bestätigten mir das. Nun muss ich feststellen, das meine Seiten Fehler enthalten, die ich ohne die ‚Display_errors‘ auf ‚On‘ nie bemerkt hätte.
Kann mir jemand eine Hilfe geben, die mir die korrekte Anmeldung von Variablen außerhalb einer Klasse (normales PHP-File mit Übergabe von Var’s) ohne Fehlermeldung, und innerhalb einer Klasse bzw. innerhalb einer nur für die Funktion in der Klasse gültigen Variablen beschreibt?

Bitte keinen Mist schreiben, wenn ihr nicht Asm kennt!

MfG

MacFlie

Mist

Also ASM kenne ich nicht ^^ aber ich denke ich kann doch etwas beitragen.

Wenn ich das richtig verstehe, möchtest du eine Variable im voraus sozusagen „bereitstellen“ um sie dann später nutzen zu können.
Mhh als Erstes würde mir einfach die public var einfallen. Also du deklarierst deine class:
class MeineKlasse {
private $eineKlasseninterneVar;
public $eineKlassenexterneVar;

}
somit kannst du innerhalb deines Codes, ein Objekt dieser Klasse erzeugen
$objekt = new MeineKlasse();
und dann auf die Variable zugreifen $objekt->$eineKlassenexterneVar; und sie wir eine normale Variable benutzen.

Hoffe ich hab dein Thema verstanden und konnte dir damit helfen.

LG
core

Hallo MacFlie,

bitte auch wenn man Asm kennt keinen Mist schreiben… Übrigens: Asm hat äußerst wenig mit PHP zu tun! Asm zu kennen hilft in Sachen PHP so gut wie überhaupt nicht.
Tut mir leid, aber diese Anmerkung hat mich gestört, angesichts dieser höchst schwammigen Frage.

Wie soll ich aus diesen Informationshäppchen ermitteln, was es für ein Fehler sein könnte?
Keine Angabe zu den (möglicherweise unterschiedlichen) PHP-Versionen.
Keine Angaben über die genaue Fehlermeldung.
Keine Angabe über die gewünschte Variablen-Übergabe (per Formular? Cookie? Rein innerhalb PHP)?
Dazu dann noch die Formulierung „anmelden von Variablen“? Was soll das meinen? Deklaration?
Kein Beispiel für eine scheinbar fehlerhafte Übergabe.
Es könnte alles sein!

php.net bietet unter documentation Kapitel über die Basics von Variablen und Klassen. Vielleicht hilft das eher weiter als ein ellenlanges hin- und her fragen bis hier jemand versteht, was das Problem eigentlich genau ist?

Falls du antwortest, bitte folgende Informationen beifügen:

  • Angaben über die verwendeten PHP-Versionen (ja, ich kann per Google herausfinden, welche Version in xampp 1.7.4 drin steckt, aber es ist immer hilfreich, wenn die Information schon da ist. Und ich kann nicht googeln, was das für ein RootServer ist aber ich hoffe wirklich sehr, dass da nicht auch xampp läuft…)
  • die genaue Fehlermeldung mit dazugehörigem Quelltext oder einem schnell gestrickten Beispiel, dass die Meldung auch produziert.
  • Was ist mit „Anmelden“ gemeint? Deklaration?
  • Was ist mit „Übergabe“ genau gemeint? Das ergibt sich sicherlich aus dem Code-Beispiel und/oder der Fehlermeldung.

Ich möchte wirklich gern helfen, sonst würde ich hier nicht jede Anfrage beantworten. Aber ohne genaue Angaben zum Problem kann ich das leider nicht.

MfG

frozen

Bevor ich Mist schreibe bin ich raus!
Gruß
Ralf

Hallo Macflie,

ich kenne kein Assembler, aber ich kann dir Lesestoff geben:
http://www.php.net/manual/de/language.variables.scop…

Hier ist beschrieben wann welche Variablen wie lange gültig sind.

In PHP müssen Variablen nicht definiert werden, bei der ersten Benutzung werden sie implizit initialisiert. Die Variablen in PHP haben auch keinen festen Typ, Du kannst $a erst als varchar/String und in der nächsten Zeile als Float nutzen.

Ich hoffe das hilft Dir bei Deiner Suche nach den Fehlern ein wenig weiter.

Wenn Du konkrete Fehlermeldungen hast die Dir dein PHP auswirft, kannst Du die gerne mitsamt Quellcode durchgeben.

Viele Grüße,
Markus

Hi

Poste doch mal einer der Fehlermeldungen…

Also so ein ähnliches Problem hatte ich auch einmal bei einem Projekt. Das hat dann damit geendet, dass ich wirklich übernommene / übergebene Variablen mit
$_GET(‚var‘) bzw $_POST(‚var‘) angesprochen und nur noch innerhalb des Scriptes mit einfachen Variablen gearbeitet hab.

Danach war alles in Butter und hat auch besser funktioniert

die Schreibweise war ausgesprochen wichtig

also wenn ich in einem Formular eine Variable $email hatte (input-Feld im POST-Formular)) und dieses an sich selbst abgeschickt hab, um einen Datenbank-Eintrag zu machen, dann kam also im Schreib-Befehl
$_POST(‚email‘) an… (übergeben / bestellte Ware)

Habe ich in der URL mal eine Variable xy eingebaut - war es auf der ankommenden Seite
$_GET(‚xy‘) (bekommen / unbestellte Ware)

so meine „Eselsbrücken“

ich hoffe, dass dies bei Deinem Problem hilft.

mfg
IBO

Hallo,

Konfiguration: WinVista/Business 32 mit xampp 1.7.4
In der php.ini Einstellungen:
display_errors = Off
display_startup_errors = Off

Was sagt jeweils register_globals?
Die aktuellste Version von xampp ist 1.8.1

Problem:
in dieser Version von xampp bzw. php.ini werden standardmäßig
die o.g. Var’s auf ‚On‘ gesetzt. Bei meinem Mietserver
(RootServer bei 1&1) und bei mir (local) ‚normalerweise‘
nicht.
Ich glaubte bis heute, dass ich sauber programmiere in PHP,
(32 Win) bestätigten mir das. Nun muss ich feststellen, das
meine Seiten Fehler enthalten, die ich ohne die
‚Display_errors‘ auf ‚On‘ nie bemerkt hätte.

Auf Entwicklungssystemen sollte man immer mit display_errors=on Arbeiten.
Unabhängig davon: Welche Fehlermeldungen kommen denn genau?

Kann mir jemand eine Hilfe geben, die mir die korrekte
Anmeldung von Variablen außerhalb einer Klasse (normales
PHP-File mit Übergabe von Var’s) ohne Fehlermeldung, und
innerhalb einer Klasse bzw. innerhalb einer nur für die
Funktion in der Klasse gültigen Variablen beschreibt?:

Ich empfehle hierzu http://www.php.net/manual/de/langref.php
Dort steht alles wissenswerte inklusive Beispielcode.

Bitte keinen Mist schreiben, wenn ihr nicht Asm kennt!

ASM hat mit PHP nach meinem Kenntnisstand nichts zu tun.

MfG

MacFlie

Honeyhead

Hi,
hast du noch niemals die o.g. Var’s auf ‚On‘ gesetzt?
display_errors = On
display_startup_errors = On

Innerhalb einer Klasse kommen keine Fehler, da die Var’s korrekt angebeldet sind. Nur außerhalb, in norm PHP-Files.

sieh es dir an. Meine Seite war auf einen mit Fehlernotizen voll.

MacFlie

Hi,

In jeder Sprache musst du eine Variable korrekt anmelden. Und meiner Meinung nach ist es in Assembler auf der Commando-Ebene am schwierigsten, denn du rechnest nur noch in Bit’s & Byte’s in Hex-Zahlen je nach Breite des Prozessorsregisters (8Bit, 16Bit, 32Bit,…). Aber, darauf komm es gar nicht an, es geht um die korrekte Anmeldung der Var’s in PHP.
Jemand schrieb mir die Var’s werden in PHP automatisch angemeldet. OK! Doch wenn ich die genannte Funktionen in der php.ini auf ‚On‘ setze kommen die Fehlermeldungen. Ob local und auf dem Server im Net. Ich kann damit leben, dass diese Optionen in der php.ini auf ‚Off‘ gesetzt sind und das Programm läuft (ca. 10.000 Code-Zeilen), doch es befriedigt mich nicht, ich halte es für nicht perfekt!

so long Ryder

Hi,

das ist schon richtig was du sagst. Doch jetzt kommt das große ABER, - die große Ausnahme. Setzte doch mal die genannten Optionen:

display_errors = Off
display_startup_errors = Off

alle auf ‚On‘ beende deinen Browser, fahre den Apache runter und wider hoch, starte den Browser und starte das Script neu; und schreib mir deine Erfahrungen.

so long Rayder

Hi,

es ist vollkommen egal, wie Variablen in anderen Programmiersprachen wie Assembler, Delphi, C, C++ oder anderen „angemeldet“ werden. Ob du Variablen in Assembler deklarieren kannst, interessiert oder beeindruckt mich nicht im geringsten. Wir reden hier von PHP.

Es ist richtig, Variablen werden in PHP in der Regel automatisch deklariert und auch initialisiert. Sie werden auch durchaus automatisch zwischen verschiedensten Typen konvertiert. Das kann manche Dinge stark vereinfachen - es kann aber auch zu sehr schwer zu identifizierenden Fehlern führen.

Es gibt in Klassen die Möglichkeit, Typen vorzugeben und auch mittels dem Schlüsselwort var Eigenschaften einer Klasse zu deklarieren. Das ist allerdings mittlerweile veraltet und wurde durch eine Deklaration mittels gleichzeitiger Sichtbarkeitsangabe ersetzt.

Es gibt also ohne die Fehlermeldungen und/oder Beispielcode nicht die geringste Möglichkeit, festzustellen, was dein eigentliches Problem ist! Vielleicht ist die Fehlermeldung irreführend und dein Problem hat gar nichts mit der Deklaration von Variablen zu tun - aber das kann ich so natürlich nicht sagen.

Zu beachten wäre noch, dass auch bei abgeschaltetem display diese Fehlermeldungen ins Logfile des Servers geschrieben werden können, welches also unnötig voll wird (auch bei nur 10000 Zeilen Code kann da so einiges zusammenkommen). Es ist also auch dann alles andere als perfekt, solche Fehlermeldungen zu haben, wenn diese nicht auf den Seiten angezeigt werden.

Noch einmal also die Bitte, folgende Informationen zu liefern:

  • Angaben über die verwendeten PHP-Versionen
  • die genaue Fehlermeldung mit dazugehörigem Quelltext oder einem schnell gestrickten Beispiel, dass die Meldung auch produziert.
  • Was ist mit „Übergabe“ genau gemeint? Das ergibt sich wahrscheinlich aus dem Code-Beispiel und/oder der Fehlermeldung, aber ich frage sicherheitshalber mal explizit nach.

Wenn du Assembler kennst, solltest du wissen, wie wichtig Präzision und der Blick ins Detail ist. Also gib mir bitte ein paar Details, damit ich dir helfen kann.

Grüße,

frozen

Guten Abend!

Ich habs ausprobiert, auf meinem echten Webspace da ich kein XAMPP nutze.

Ich bekomme zum Beispiel:
„Notice: Use of undefined constant login - assumed ‚login‘ in /srv/www/htdocs/xxxx/html/seifert-online.de/bla.php on line 11“

Weil ich geschrieben habe „$_POST[login]“. Wenn ich stattdessen schreibe „$_POST[‚login‘]“ und somit den Array-Bezeichner (richtigerweise) als String angebe kommt die Notice nicht.

Es gibt Notice, Warning und Error. Selbst bei Warnings die ausgegeben werden läuft die Seite einwandfrei.

Aber jede Meldung hat Ihre Begründung. Daher: Sende ein Codebeispiel und die Meldung dazu, dann kann Dir wahrscheinlich geholfen werden.

Und meine Variablen habe ich in dem Script nicht über „var $zusammen“ angemeldet/definiert sondern einfach benutzt „$zusammen=$a+$b“. Das gab KEINE Ausgabe irgendeiner Art.

Viele Grüße,
Markus

Hi frozen,

das eigentliche Problem liegt darin, dass ich die Variablen oben im Script natürlich als Leerstring anmelden kann (keine Fehlermeldung), doch wenn ich dieses Script nochmal mit den genannten Variablen, die jetzt Werte enthalten aufrufe, werden diese Variablen bzw. die Werte nochmals mit den Leerstring überschrieben.
Das gilt nicht für Klassen, nur für kleine Script’s außerhalb von Klassen, die z.B. andere Klassen aufrufen, je nach Zustand, oder Anforderungen, des Programms. Schlimmstenfalls muß ich diese Script’s auch in Klassen packen.

MacFlie

Hallo macflie,

das ergibt aber dann keine Fehlermeldungen und hat nichts mit Deklaration zu tun. Aber damit kann ich wenigstens ein wenig anfangen, auch wenn weiterhin eine Menge unklar ist.

Ich NEHME AN, dass du das Script im Rahmen einer Webseite mehrfach aufrufst. Webseiten arbeiten mit dem HTTP-Protokoll. Dieses ist zustandslos. Es kann also keine Übergabe von Variablen von einem Seitenaufruf auf den nächsten geben.

Um auf Webseiten Zustände verwenden zu können, gibt es mehrere Varianten.
1.: Übergabe von Variablen per URL
2.: Übergabe von Variablen per (HTML-) Formular
3.: Sessions, z.B. mittels Cookies

Erläuterungen
zu 1.:
Die Variablen werden einfach an die URL des Scripts angehängt. Zum Beispiel:

http://www.deineseite.de/script.php?var1=wert1&var2=wert2

Dafür müssen sie natürlich als String konvertiert werden und die URL muss für das neue Laden der Seite verwendet werden, z.B. als Link der geklickt wird.
Innerhalb des Scripts werden sie dann per $_GET wieder abgerufen, in dem Beispiel als:

if(isset($\_GET['var1'] && strlen($\_GET['var1']) \> 0) 
{
 $var1 = $\_GET['var1'];
} else {
 $var1 = '';
}

Wichtig dabei ist: Diese Variablen können von jedermann gesehen und auch bearbeitet werden. Verlasse dich also niemals auf den Inhalt dieser Variablen, er kann von Angreifern beliebig manipuliert werden!

zu 2.:
Hierfür wird in die Seite ein HTML-Formular eingebettet, dass per POST die gewünschten Variablen versendet.
Funktioniert im wesentlich genau wie GET. Auch hier kann alles beliebig von Angreifern verändert werden.

zu 3.:
Hierfür wird ganz zu Beginn der Scriptausführung eine Session gestartet (vor ALLEM anderen, was ausgegeben wird!).
Die Variablen werden dann der Session hinzugefügt.
Auch hier kann alles manipuliert werden.
Sessions sind ein wesentlich komplexeres Thema, wenn man es richtig und sicher machen will, deshalb verweise ich hier erstmal auf Google.

Bei allen Varianten ist es elementar wichtig, dass du dich keinesfalls auf die Inhalte der Variablen verlässt. Lade beispielsweise auf gar keinen Fall ein Script, dass über eine Variable benannt ist.

/\* NIE machen! \*/
$scriptname = $\_GET['scriptname'];
readfile($scriptname);

Mit so einem Konstrukt ist es einem Angreifer möglich, so ziemlich alles zu tun, was er will.
Sinnvoller wäre es beispielsweise, ein Array zu definieren, dass Indizes einem Namen zuordnet. Dann könntest du so vorgehen:

if(array\_key\_exists(intval($\_GET['scriptname']), $scripts))
 $scriptname = $scripts[intval($\_GET['scriptname'])];

Auch damit kann noch Schindluder getrieben werden, aber es werden schonmal keine externen Scripts mehr geladen, sondern nur noch solche, die du explizit zugelassen hast.

Was mich etwas verwundert, ist, dass du sagst, bei Klassen gebe es keine Probleme. Ich halte es durchaus für möglich, dass du ein Problem mit dem Scope von Variablen hast. Beispiel:

$var1 = 1; //ausserhalb von allem, global
class test
{
 public $var1 = 2; // nur innerhalb der Klasse per $this-\>

 function foo()
 {
 $var1 = 3; // nur innerhalb foo()
 }

 function bar()
 {
 $var2 = $var1; // $var2 = 0 und Warnung oder Fehlermeldung
 }

 function bar2()
 {
 global $var1;
 $var3 = $var1; // verwendet die $var1 von ausserhalb der class
 }
}

Das sind drei Variablen, die nichts miteinander zu tun haben.
In der Methoda bar() wird eine Variable $var1 verwendet, die an dieser Stelle nicht existiert.
In der Methode bar2() wird schließlich über global die globale Variable $var1 in die Klasse geholt.

Ich hoffe, das hilft dir weiter.
Ansonsten bitte mehr Informationen, vor allem Fehlermeldungen und Beispielcode!

Schönen Sonntag!

frozen

Sicher sind die bei mir auf ON

vielleicht solltest Du die Notizen und Warnings etwas einschränken

z.B.
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~WARNINGS

… irgendwas ist doch immer

Es ist immer schwierig, eigenen „Mist“ als solchen zu erkennen … Von daher ist Dein Statement schwierig umzusetzen …

Zu den Variablen: IMHO ist die saubere Deklaration von Variablen in PHP schon immer eine schwierige Sache gewesen, weil PHP Variablen beim Werte setzen automatisch erzeugt. Und ihnen auch noch automatisch den (wahrscheinlich) richtigen Typ verpasst. Das ist meistens kein Problem, aber eben nicht immer. Ich kann mich noch gut an die Diskussionen bei Einführung des register_globals=off in PHP 4.2.0 erinnern (da ging es um unkontrollierbare Werteübergabe per GET in ein Skript). Danach wurde es ja so wichtig, die GET bzw POST-Arrays korrekt anzusprechen.

Besonders die Gültigkeitsbereiche waren (sind) problematisch. Deshalb wurden ja gerade mit Einführung der Objektorientierung in PHP 5 die Verwendung von globalen, superglobalen usw. Variablen so wichtig.
Soll heißen: Du kannst Variablen ausdrücklich definieren, musst es aber nicht. Also ich definiere sie dort, wo es explizit notwendig ist (um beispielsweise Gültigkeitsbereiche oder Typen klar zu definieren). Ich halte es aber auch nicht für falsch, Variablen einfach so zu verwenden, wenn diese Vorgehensweise die Funktionalität des Skripts nicht beeinträchtigt.

Klar wird immer empfohlen, die Variablen zu definieren. Aber …

Ich denke, zu diesem Thema hat jeder seine eigene Meinung. Ich würde es nicht so eng sehen. Arbeite stets so gut wie nötig, nicht so gut wie möglich … (definiert mal einer „nötig“)

Micha

Hi macflie,

Grundsätzlich werden in PHP Variablen durch setzen des Inhaltes Angemeldet. Eine Fehlermeldung kommt, bei error_reporting, sobald nicht definierten Variablen verwendet werden.

also z.B.:

$MeinText .= „Hinten dran !“;

also schreibe:

$MeinText = „“;


$MeinText .= „Hinten dran !“;

mir passiert es meist, dass ich Variable vergleiche die ich eigentlich in einer Include Datei verwende aber die Datei gar nicht eingebunden habe.

daher schreibe ich nach Möglichkeit

if (!isset($MeinText)) {$MeinText=""}

darüber hinaus schaue dir mal ‚global‘ und ‚static‘ an.

Ich hoffe ich konnte dir weiter helfen.

Cu Stefan

Hallo,

tun mir leid, dass ich mich erst heute melde, aber es sind so viele Dinge zum Erledigen gewesen.
Vermutlich hast du inzwischen eine gute Antwort auf deine Frage bekommen. Wenn nicht, dann melde dich nochmal bei mir, ich werde dann wirklich kurzfristig antworten.

Grüße
Tom

Hallo MacFile,

mit ASM kenne ich mich nicht aus.
Ist es denn nicht möglich, Fehler durch Ausnahmebehandlung herauszufiltern und zu protokollieren?

MfG, Frank