php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 17.08.2007, 11:33  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard $_GET, $_POST direkt auslesen oder als Parameter

Hallo Leute

Muss euch schon wieder mit einer Frage ärgern. Und die lautet wie folgt :

Ist es a) performance-technisch besser, b) programmier-stylistisch schöner die übergebenen Parameter in den superglobalen Arrays in den Nebenklassen direkt auszulesen oder in der Hauptklasse für die Nebenklassen als Parameter mitzugeben?

PHP-Code:
class Hauptklasse {
    public function 
somewhat() {
        
$nebenk = new Nebenklasse;
        
$n_data $nebenk->get_data();
    }
}

class 
Nebenklasse {
    public function 
get_data() {
        
$param $_GET['param'];
        
$new_param "Data: ".$param;

        return 
$new_param;
    }

ODER

PHP-Code:
class Hauptklasse {
    public function 
somewhat() {
        
$get $_GET;
        
$nebenk = new Nebenklasse;
        
$n_data $nebenk->get_data($get['param']);
    }
}

class 
Nebenklasse {
    public function 
get_data($param) {
        
$new_param "Data: ".$param;

        return 
$new_param;
    }

Welche Vor-/Nachteile haben die verschiedenen Varianten?

Gruss Igäl
Igäl ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 17.08.2007, 13:38  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Beides ist nicht optimal. Ich würde an deiner Stelle ganz darauf verzichten, $_GET, $_POST etc. als Super-Globalen zu behandeln. Behandel sie lieber als einen ganz normalen Array, den du einer Klasse oder Methode per Parameter übergibst. Denn vielliecht möchtest du, bevor du verstreut irgendwelche Klassen und Methoden mit $_GET arbeiten läßt, ja noch eine Routine über die Werte laufen lassen? Oder schlimmer, vielleicht möchtest du für Klasse A Variante X von $_GET zur Verfügung stellen und für Klasse B Variante Y. Zwecks Transparenz brauchen beide Klassen davon aber nichts wissen.

Beispiel ist eine Funktion zum Darstellen einer Seitennavigation (Seite 1, 2 .. 10). Diese könnte direkt mit $_GET arbeiten, und dort einfach das Argument "seite" jeweils anpassen. Nun könnte es aber auch sein, dass auf dieser Seite mehr möglich ist, als nur zwischen Seiten umherzuschalten. Zum Beispiel Eintrag 5 zu löschen. $_GET['delete'] löst also DELETE FROM table LIMIT 4,1 aus. Nun, davon weiß dein Seitennavigations-Skript aber nichts, und bruzelt den $_GET-Parameter "delelete" einfach beim Erstellen der Seiten-Links überall mit hinein. Das ist schlecht, denn damit löscht du pro Seitenaufruf ein Element. Das ist natürlich nur ein Beispiel, aber solche Seiteneffekte kannst du ganz einfach verhindern, in dem du von _außen_ festlegst, mit welchen Daten eine Funktion hantieren darf.

PHP-Code:
<?php
// schlecht
function seitennav1() {
  
$get $_GET;
  
// ..
}

// schön
/** 
 * @param array $get arg list for href (f.e. $_GET)
 */
function seitennav2($get) {
  
// ..
}
seitennav($_GET); // völlig ok, gleiche wirkung wie oben, aber flexibel
seitennav(prepareForSeitennav($_GET)); // möglich
?>
Es ist immer gut, wenn man von außen sieht, welche Daten die Funktion benötigt.
Zergling-new ist offline  
Alt 17.08.2007, 14:04  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Wenn ich dich richtig verstanden habe, siehst du folgenden Nachteil:

Problem: Die Daten aus dem $_GET-Array werden unbehandelt übertragen und können am Ort wo sie eingesetzt werden Schaden verursachen.

Lösung: Das $_GET-Array in ein eigenes Array laden und die Werte überprüfen/modifizieren/etc. und erst dann den verschiedenen Klassen übergeben.

Ich habe eine Klasse namens Controll, welche für jeden Seitenaufruf die Parameter überprüft.
Beispiel: "index.php?mid=1&smid=1&edit=214
PHP-Code:
if($mid==1)    {
            if(
$smid == && $acc_arr['AccNewsWrite'] == 0)    {
                
$access false;
            }
            if(isset(
$_GET['edit']))    {
                
$author_id Mysql::db_fetch_data(Mysql::db_select_data("NwAuthor""news""NwID=".$_GET['edit']));
                if(
$_SESSION['UserNickname'] != $author_id['NwAuthor'])    { $access false; }
            }
            if(isset(
$_GET['cat']) && $_GET['cat'] == 6)    {
                if(
$acc_arr['AccNewsInternRead'] == 0)    { $access false; }
            }
        } 
Die Variable $access wird dann zurückgegeben und führt dazu, dass der User auf die Seite forbidden.html umgeleitet wird.
Ist das ungenügend? Was würdest du zusätzlich dazu an Sicherungen einbauen? Parameterwerte überprüfen, also zum Beispiel ob der Wert des Edit-Parameters wirklich ein Integer ist, etc.?

Edit: Hatte etwas lange an meinem Post, darum habe ich deinen Zusatz noch nicht gesehen. Der Entscheidende Vorteil ist also, dass man die Parameter sieht, die in einer Funktion wirken. Das leuchtet mir ein. Ich werde mal sehen, wie ich das am besten angehe.
Igäl ist offline  
Alt 17.08.2007, 14:20  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Genau, es geht eigentlich eher weniger um Sicherheitsaspekte, als darum, dass man einer Funktion oder Methode ansieht und darauf Einfluß nehmen kann, welche Parameter sie benötigt um arbeiten zu können.

Ich würde dir übrigens raten, statt isset($array['key']) ein array_key_exists('key', $array) zu verwenden. Denn wenn $array nicht existiert, weil du dich zum Beispiel vertippt hast, wird kein Fehler geworfen und die Funktion liefert immer FALSE. Nicht ganz einfach zu finden solche Fehler.

Deine Eingabeprüfung ist übrigens auch unsicher. Ungeprüft schiebst du einen $_GET Parameter in die MySQL-Klasse. Da du hier scheinbar schon die WHERE-Bedingung übergibst, glaube ich kaum, dass deine Klasse dies nocheinmal zerlegt und validiert. Es ist grundsätzlich inakzeptabel, wenn eine User-Eingabe einen Parse-Error erzeugen kann, sei es über PHP oder MySQL. Und wenn ich statt "edit" nun ein "0 OR 1" übergebe wird auch gleich alles selektiert. Da hilft dir dann nichtmal mysql_real_escape_string(). Wenn du Zahlen erwartest, wandel sie knallhart mit intval() in eine Zahl um, alles andere gehört an mysql_real_escape_string() übergeben und gegebenenfalls in ' eingeschlossen.

Und wenn wir schon dabei sind:
PHP-Code:
<?php
// umständlich
if($acc_arr['AccNewsInternRead'] == 0)    { $access false; } 
// kurz
$access = ($acc_arr['AccNewsInternRead'] != 0);
?>
Zergling-new ist offline  
Alt 17.08.2007, 14:30  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Genau von solchen Sicherheitsdingen hab ich noch zu wenig Ahnung. Versuch ich mir grad ein bisschen anzueignen.

Ja ich bin dabei die ganze Seite zu überarbeiten. Darum auch die ganzen konzeptionellen Fragen. Und auch diese Controll-Klasse hat eine Bearbeitung dringend nötig. Muss sie mal wieder auf meinen aktuellen Wissensstand bringen.

Herzlichen Dank für das umfangreiche Feedback. Hab jetzt erstmals wieder Optimierungs-Arbeit. Werde deine Tips beherzigen. Dankeschön

Edit: Den schrecklichen zweiten Satz aus Zerglings nachfolgendem Quote korrigiert -.-
Igäl ist offline  
Alt 17.08.2007, 14:36  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von Igäl
Ja ich bin dabei die ganze Seite zu überarbeiten. [..] Muss mal wieder auf meinen aktuellen Wissensstand zu bringen.
Find ich gut, da helf ich gern, kein Problem also
Zergling-new 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
Variablen in Datenbank speichern und auslesen freehawk PHP-Fortgeschrittene 4 16.03.2008 17:22
Parameter überschreiben Igäl PHP Tipps 2006 8 04.06.2006 19:55
Komplette URL inkl. Parameter etc. auslesen NetLook PHP Tipps 2006 2 03.02.2006 16:22
Direkt aus 2 Ordner auslesen PHP Tipps 2005-2 2 28.10.2005 10:22
Umleitung wenn Parameter direkt angesteuert wird PHP Tipps 2004 13 25.08.2004 16:20
Alle $_GET[] parameter auslesen PHP Tipps 2004 3 09.08.2004 14:14

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php post parameter auslesen, php get post parameter, php übergabeparameter auslesen, php parameter auslesen, http://www.php.de/php-tipps-2008/44604-_get-_post-direkt-auslesen-oder-als-parameter.html, post parameter auslesen, post parameter auslesen php, php access post parameter, php get post parameter auslesen, javascript post parameter auslesen, _post auslesen, php post parameter lesen, php post direkt auslesen, _get auslesen, php parameter auslesen post, php get parameter, post parameter php auslesen, php post get parameter, php alle post parameter auslesen, php seitenaufruf mit parameter

Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.