php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.06.2008, 16:47  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard [Erledigt] Warum ISSET($var) nutzen?

Soweit ich das verstanden habe, werden Variablen in PHP dann erzeugt, wenn der Interpreter
zum allerersten mal drüber stolpert. Schreibe ich also irgendwo mal
$var = "hallo";
dann existiert diese Variable ab sofort.

In vielen Codeschnipseln sehe ich, dass der Programmierer solch ein Konstrukt gewählt hat:
PHP-Code:
if (isset($var)) {
    if(
$var == "4711"tuwas();

Ist das nicht vom Ergebnis her identisch mit:
PHP-Code:
    if($var == "4711"tuwas(); 
weil ja, sollte $var bisher noch niemals angesprochen worden sein, die Variable durch die
if-Anweisung schon erzeugt wird.

Ähnliches lese ich oft bei GET oder POST :

PHP-Code:

if (isset($_POST['Submit']) AND $_POST['Submit']) {
    echo 
"Formular abgesandt!";

An welchen Stellen würdet ihr empfehlen, vor der Wertprüfung erst eine Existenzprüfung zu machen und wo ist das unnütz?
Wolla ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.06.2008, 16:54  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Hallo,

PHP erledigt Deklaration und Initialisierung in einem Schritt.
Wenn du

$x = 5;

schreibst, hast du $x deklariert und initialisiert. Wenn du $x aber benutzt, bevor du dies getan hast, benutzt du eine nicht existierende Variable und das hat eine Notice zur Folge.
Mit isset() prüfst du, ob eine Variable existiert. Hierbei kannst du eine Variable übergeben und prüfen, ob diese zuvor definiert wurde. Obwohl du hier ja auch eine nicht deklarierte Variable benutzt, geht das aus zwei Gründen ohne Notice über die Bühne:
  • isset() ist keine Funktion, sondern ein Sprachkonstrukt
  • der Parameter für isset() ist ein Call-by-Reference-Parameter und bei einem solchen wird die Variable zunächst deklariert, wenn sie nicht existiert, da man nicht auf eine nicht existierende Variable verweisen kann
Zu Punkt zwei: die Prüfung funktioniert trotz der vorigen Erzeugung der Variablen, da die Variable notfalls mit null initialisiert wird und null gilt als "nichts" (nicht zu verwechseln mit 0). Das kannst du auch selbst überprüfen:
PHP-Code:
$x null;
print isset(
$x) ? 'existiert' 'existiert nicht'
Manko10 ist offline  
Alt 09.06.2008, 16:55  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Du mußt hier Zuweisungen und Bedingungen unterscheiden. Zuweisungen sind eine Art Variablendeklaration, Bedingungsprüfungen stolpern schon über nicht existente Variablen. Mit error_reporting (E_ALL) wirst Du auch schöne saftige notices für jede unbekannte Variable erhalten.

PHP-Code:
if (isset($_POST['Submit']) AND $_POST['Submit']) 
sollte übrigens mit
PHP-Code:
if (empty ($_POST['Submit'])) 
gleichbedeutend sein.
Für Formulare macht die isset Prüfung Sinn, um bspw. leere (nicht ausgefüllte) Felder von nicht übertragenen Elementen zu unterscheiden. Letztere könnte bei Textfeldern ein Indiz dafür sein, dass Daten nicht über das Formular versandt wurden.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (09.06.2008 um 17:04 Uhr).
nikosch ist offline  
Alt 09.06.2008, 17:01  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Ich bevorzuge zur Prüfung (v.a bei GET/POST-Variablen) nach Möglichkeit empty(), dass einerseits testet, ob die Variable gesetzt, bzw nicht gesetzt, ist, aber auch ob sie keinen Wert enthält (kein WERT == '' == '0' == 0 == null == false)
__________________
Gruss
L
lazydog ist offline  
Alt 09.06.2008, 17:21  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Ich vermeide es eh, Variablen als Schalter zu nutzen,
wenn ich unsicher bin, welchen Wert sie beinhalten und
würde vielleicht so etwas schreiben:
PHP-Code:
$zustand "";
if(
bedingung1$zustand="a";
if(
bedingung2$zustand="b";
if(
bedingung3$zustand="c";

if(
$zustandtuwas($zustand); 
Zitat:
Für Formulare macht die isset Prüfung Sinn, um bspw. leere (nicht ausgefüllte) Felder von nicht übertragenen Elementen zu unterscheiden.
Dieses Unterscheidungsmerkmal habe ich natürlich nicht bedacht.
Wenn jemand sein eigenes Formular auf mein Script loslässt und
dabei ein Feld vergisst, dann kann ich reagieren.
Wolla ist offline  
Alt 09.06.2008, 17:29  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Zitat von Wolla Beitrag anzeigen
Ich vermeide es eh, Variablen als Schalter zu nutzen,
wenn ich unsicher bin, welchen Wert sie beinhalten und
würde vielleicht so etwas schreiben:
PHP-Code:
$zustand "";
if(
bedingung1$zustand="a";
if(
bedingung2$zustand="b";
if(
bedingung3$zustand="c";

if(
$zustandtuwas($zustand); 
Je nach erzielter Logik mußt Du dabei aber aufpassen, nicht diesen Fehler zu machen (erstes Posting): http://www.php.de/php-einsteiger/160...mpfaenger.html . Eine weitere Falle ist hier eine fehlende Initialisierung in Verbindung mit register globals. Ich würde hier i.A. ein switch/case verwenden.
Zitat:
Zitat von Wolla Beitrag anzeigen
Dieses Unterscheidungsmerkmal habe ich natürlich nicht bedacht.
Wenn jemand sein eigenes Formular auf mein Script loslässt und
dabei ein Feld vergisst, dann kann ich reagieren.
Alternativ könnte man auch einen Proxy wie Webscarab benutzen, um beliebige POST/GET Parameter zu übertragen/manipulieren
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (09.06.2008 um 17:32 Uhr).
nikosch ist offline  
Alt 10.06.2008, 07:06  
Benutzer
 
Registriert seit: 05.06.2008
Beiträge: 78
Normalo befindet sich auf einem aufstrebenden Ast
Normalo eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von Wolla Beitrag anzeigen
Ich vermeide es eh, Variablen als Schalter zu nutzen
Wie geht denn das? Nimmst du nur Konstanten?
Zitat:
Zitat von Wolla Beitrag anzeigen
wenn ich unsicher bin, welchen Wert sie beinhalten und
würde vielleicht so etwas schreiben:
PHP-Code:
$zustand "";
if(
bedingung1$zustand="a";
if(
bedingung2$zustand="b";
if(
bedingung3$zustand="c";
if(
$zustandtuwas($zustand); 
Wie verarbeitest du denn Benutzereingaben mit dieser Methode?

Bedingungen machen ja nur Sinn, wenn du keine konstanten Werte hast, also muss man da zwangsläufig Variablen verwenden. Vielleicht hab ich dich missverstanden?
Normalo ist offline  
Alt 10.06.2008, 11:39  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Jo, das hast du missverstanden. Der Satz ging ja weiter.

Man sollte eh immer genau wissen, welche Variable zur Laufzeit an welcher Programmstelle welche Werte annehmen kann.
Wolla ist offline  
Alt 10.06.2008, 12:02  
Benutzer
 
Registriert seit: 05.06.2008
Beiträge: 78
Normalo befindet sich auf einem aufstrebenden Ast
Normalo eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von Wolla Beitrag anzeigen
Jo, das hast du missverstanden. Der Satz ging ja weiter.
Entschuldigung.
Zitat:
Zitat von Wolla Beitrag anzeigen
Man sollte eh immer genau wissen, welche Variable zur Laufzeit an welcher Programmstelle welche Werte annehmen kann.
Bei PHP kann jede Variable an jeder Stelle jeden Wert annehmen Wird Zeit, dass man eine allgemeine Typensicherheit (auch für Skalare) einführt.
Normalo ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] PHP mit MS SQL Server Tofte83 Datenbanken 4 28.12.2010 14:29
[Erledigt] Cookies nutzen Supeede PHP Tipps 2008 61 24.07.2008 15:53
[Erledigt] Klassen und Funktionen wetteronkel PHP Tipps 2008 11 11.06.2008 13:32
[erledigt] Benutzernamen bzw. Benutzerlogin ändern vollkommenegal Server, Hosting und Workstations 0 09.06.2008 10:06
[Erledigt] Multi Loginfeld cyn PHP-Fortgeschrittene 10 22.05.2008 22:07
Framework aus Haupt und Unterverzeichnis nutzen? Anotherone PHP-Fortgeschrittene 8 24.07.2007 15:05
[Erledigt] preg_match_all und wiederholte Gruppierungen PHP Tipps 2006 4 19.03.2006 15:59
[erledigt] Mail per PHP versenden über fremden SMTP SolcoDerman PHP Tipps 2005-2 2 11.07.2005 12:08
[Erledigt] document.getElementById bringt keine Änderung Chr!s HTML, Usability und Barrierefreiheit 10 18.05.2005 21:28
[Erledigt] Design Pattern - MySQL Sitzung in allen Objekten nutzen PHP-Fortgeschrittene 21 28.04.2005 22:18
user von forum auch für restliche community nutzen Unbekanntes_Pferd Datenbanken 4 28.04.2005 10:19
Variabel aus while schleife ausserhalb der schleife nutzen PHP Tipps 2005 8 12.02.2005 18:04
{ und } in Smarty normal nutzen? Schaelle PHP Tipps 2004 13 21.10.2004 13:36
Externe Referenzen in Klassen nutzen PHP Tipps 2004 3 16.08.2004 21:10


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:06 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum