php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.08.2007, 12:07  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard gpc_quotes funktion: verbesserungsvorschläge?

um mir in diversen formularen immer sicherheitsabfragen zu ersparen dachte ich mir ich schreibe mir eine funktion mit der ich alle eventualitäten beseitige:

Code:
function verify($text) {
  if(get_magic_quotes_gpc()) $text = stripslashes($text);
  $text = strip_tags(trim($text));
  return $text;
}
so müsste ich dann eben jedes gewünschte feld eines formulares prüfen (verify($_POST['kommentar'])). oder sollte ich gleich alle $_POST werte verifizieren? so ungefähr:
Code:
function verify($arr) {
  foreach($arr as $value) {
    if(get_magic_quotes_gpc()) $arr[$value] = stripslashes($arr[$value]);
    $arr[$value] = strip_tags(trim($arr[$value]));
  }
  return $arr;
}
oder sollte ich das ganze kombinieren und so modifizieren dass ich sowohl ein array als auch einen einzelnen text verifizieren kann:
Code:
function verify($target) {
  if(is_array($target)) {
    foreach($target as $value) {
      if(get_magic_quotes_gpc()) $target[$value] = stripslashes($target[$value]);
      $target[$value] = strip_tags(trim($target[$value]));
    }
  } else {
    if(get_magic_quotes_gpc()) $target = stripslashes($target);
    $target = strip_tags(trim($target));
  }
  return $target;
}
so könnte ich zum beispiel mit verify($_POST) das array oder mit verify($_POST['kommentar']) ein einzelnes feld von bösen dingen befreien.

was haltet ihr davon. wäre über jegliche vorschläge, anregungen und kommentare froh.

EDIT: leider habe ich gerade etwas festgestellt. wenn ich die 3. form anwende und $_POST verifizieren lasse, so wird sonderbarerweise NICHTS geändert, sprich $_POST wird gleich wieder zurückgegeben OHNE modifikationen. ABER wenn ich mir das array in der funktion ausgeben lasse, so ist alles korrekt entfernt worden?!

hier das beispiel:
Zitat:
ursprünglicher $_POST array welches an verify() übergeben wird:
Array
(
[rev_prename] => Max
[rev_lastname] => Mustermann
[rev_comment] => \"hallo\" fett
)


$_POST array nach der funktion (mittels print_r in der funktion ausgegeben):
Array
(
[rev_prename] => Max
[rev_lastname] => Mustermann
[rev_comment] => "hallo" fett
)


$_POST wie er auf der seite nach verify($_POST) als ergebnis der funktion ausgegeben wird:
Array
(
[rev_prename] => Max
[rev_lastname] => Mustermann
[rev_comment] => \"hallo\" fett
)
__________________
mfg Alexander Haim
Promaetheus ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 08.08.2007, 12:36  
Erfahrener Benutzer
 
Registriert seit: 23.12.2003
Beiträge: 243
mAy^daY
Standard

Also eine universelle Funktion wäre vielleicht das sinnvollste, aber ich gehe mal stark davon aus das nicht nur Textfelder korrigiert werden sollen?! Ich denke du solltest auch auf die Typen achten, bei dir wird alles zum String gemacht, was ich nicht besonders sinnvoll halte.
Ich prüfe meine Formularwerte immer nach Typ und danach auf Syntax, bzw. ich caste die Werte auf den entsprechenden Typ.

// Edit:
Zitat:
Zitat von Promaetheus
[...]
EDIT: leider habe ich gerade etwas festgestellt. wenn ich die 3. form anwende und $_POST verifizieren lasse, so wird sonderbarerweise NICHTS geändert, sprich $_POST wird gleich wieder zurückgegeben OHNE modifikationen. ABER wenn ich mir das array in der funktion ausgeben lasse, so ist alles korrekt entfernt worden?!
[...]
Also deine 3. Form (und deine 2.) ist auch nicht ganz korrekt, der foreach-Syntax ist hier falsch.

Außerdem ist noch zu beachten:
Zitat:
Zitat von PHP Manual
Anmerkung: Beachten Sie auch, dass foreach mit einer Kopie des angegebenen Arrays arbeitet, nicht mit dem Array selbst. Deshalb wird auch der Arrayzeiger nicht wie bei dem each()-Konstrukt verändert und Veränderungen an ausgegebenen Arrayelementen haben keine Auswirkung auf das originale Array. Trotzdem wird der interne Arrayzeiger des originalen Arrays bei der Verarbeitung bewegt. Angenommen, die foreach-Schleife ist komplett abgearbeitet, wird der interne Arrayzeiger (des originalen Arrays) auf das letzte Element zeigen.
zum nachlesen: foreach
mAy^daY ist offline  
Alt 08.08.2007, 13:27  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

danke für deinen hinweis. also kann ich das mit dem array schonmal vergessen. werde dann einfach die normale verify($text) anwenden für jedes feld das überprüft werden soll. es handelt sich bei meinen feldern nur um textfelder.

danke nochmal für deinen hinweis bezüglich der arraykopie in der foreach schleife. schade.
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 08.08.2007, 13:39  
Erfahrener Benutzer
 
Registriert seit: 23.12.2003
Beiträge: 243
mAy^daY
Standard

Zitat:
Zitat von Promaetheus
[...]
also kann ich das mit dem array schonmal vergessen.
[...]
Naja, so schnell musst du nicht aufgeben, es geht schon. Das Stichwort heißt "Call by reference".

PHP-Code:
// kleines Testscript
$Array = array('    Original    ''[b]Fett[/b]');
$String '    [b]Fett[/b]    ';

function 
verify(&$Input) {
  if (
is_array($Input)) {
    
reset($Input);
    while (list(
$Key$Value) = each($Input)) {
      
$Input[$Key] = trim(strip_tags($Value));
    }
  } else {
    
$Input trim(strip_tags($Input));
  }
}

verify($Array);
verify($String);

print_r($Array);
print_r($String); 
So sollte es funktionieren, ist jetzt nur ein kleiner Ansatz den du noch verbessern könntest. (z.B. mehrdimensionale Arrays oder Typenvergleich)

Hier noch zum nachlesen: Passing by reference
mAy^daY ist offline  
Alt 10.08.2007, 11:53  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

danke für deinen hinweis. von "call by reference" habe ich bisher noch nichts gehört. werde mal suchen und lesen.

grob heisst das ganze also dass er anstatt eine kopie anzulegen die tatsächliche variable verwendet oder? das betrifft aber nur arrays oder? denn wenn ich meiner kombinierten funktion ein array übergebe, so handelt er INNERHALB der funktion alles gut ab, aber auf der seite auf der die funktion aufgerufen wird, wird nicht das zurückgegebene und korrigierte $_POST verwendet sondern das "originale. das würde ja für das sprechen was du geschildert hast.
ABER: wenn ich ein explizites element von $_POST übergebe, beispielsweise $_POST['name'], so wird alles korrekt durchgeführt und auf der seite wo die funktion aufgerufen wird, nachher auch das korrigierte und von der funktion zurückgegebene $_POST['name'] verwendet.

CONCLUSIO: das problem lag also NUR an der foreach schleife, welche mit der arraykopie arbeitet. wenn ich while verwenden würde so müsste es funktionieren (siehe dein beispiel). wenn ich trotzdem mit foreach arbeiten möchte, so muss ich einfach beim funktionsaufruf ein & vor die variable anfügen, dann verwendet foreach keine kopie sondern die originale variable/array.
habe ich hier alles richtig verstanden und ist meine conclusio korrekt?
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 10.08.2007, 14:46  
Neuer Benutzer
 
Registriert seit: 10.08.2007
Beiträge: 12
qwertzu
Standard

An deiner Stelle würde ich aus Performancegründen array_walk() verwenden, wenn du eine bestimmte Prozedur auf alle Items in einem Array durchführen möchtest. Falls du deine verify() Funktion weiterhin verwenden möchtest, würde ich in Zeile 9 folgendes schreiben:
PHP-Code:
$Input[$Key] = verify($Input[$Key]); 
Es kann schließlich vorkommen, dass das/der (?) aktuelle Item gar kein String, sondern ein Array ist.

Gruß
Tim
__________________
Betriebssystem: Ubuntu 7.10, Kernel v2.6.24-8-generic
Webserver: LightTPD v1.4.13, PHP v5.2.4 + FastCGI + MySQLi v5.0.51a
qwertzu ist offline  
Alt 10.08.2007, 18:12  
Erfahrener Benutzer
 
Registriert seit: 23.12.2003
Beiträge: 243
mAy^daY
Standard

Zitat:
Zitat von qwertzu
[...]
Es kann schließlich vorkommen, dass das/der (?) aktuelle Item gar kein String, sondern ein Array ist.
[...]
Ich wollte keine komplette Lösung präsentieren, nur einen Ansatz...

Zitat:
Zitat von Promaetheus
[...]
grob heisst das ganze also dass er anstatt eine kopie anzulegen die tatsächliche variable verwendet oder?
[...]
Ja, das kann man so erklären, tatsächlich wird hier eben nicht eine Kopie der Variablen angelegt sondern eine Referenz zur Variablen übergeben wo man den Inhalt dieser findet (stell es dir vereinfacht wie ein Zeiger vor der dann auf den Originalwert zeigt).

Zitat:
Zitat von Promaetheus
[...]
das betrifft aber nur arrays oder? denn wenn ich meiner kombinierten funktion ein array übergebe, so handelt er INNERHALB der funktion alles gut ab, aber auf der seite auf der die funktion aufgerufen wird, wird nicht das zurückgegebene und korrigierte $_POST verwendet sondern das "originale.
[...]
Es wird generell unterschieden zwischen "Call by value" und "Call by reference". PHP nutzt standardmäßig die "Call by value" Methode um Funktionsparameter zu übergeben. Soll heißen, alles was du einer Funktion übergibst, wird als Wert übergeben. Somit kannst du damit in der Funktion selbst alles mögliche mit anstellen, die Variable außerhalb der Funktion bleibt jedoch unverändert. (Ausnahmen sind hier Objekte, diese werden per Referenz übergeben)

Zitat:
Zitat von Promaetheus
[...]
CONCLUSIO: das problem lag also NUR an der foreach schleife, welche mit der arraykopie arbeitet. wenn ich while verwenden würde so müsste es funktionieren (siehe dein beispiel). wenn ich trotzdem mit foreach arbeiten möchte, so muss ich einfach beim funktionsaufruf ein & vor die variable anfügen, dann verwendet foreach keine kopie sondern die originale variable/array.
[...]
Ob du nun als Kontrollstruktur while oder foreach verwendest ist hier egal, denn es kommt darauf an was du der Funktion übergibst. Referenz oder Wert.

// Edit
PHP-Code:
function verify(&$Input) {
 
// ...
}

# Funktionsaufruf
verify($Var); 
oder
PHP-Code:
function verify($Input) {
 
// ...
}

# Funktionsaufruf
verify(&$Var); 
führt beides übrigens zum gleichen Ergebnis.
mAy^daY ist offline  
Alt 10.08.2007, 20:59  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Zitat:
Zitat von mAy^daY
Ob du nun als Kontrollstruktur while oder foreach verwendest ist hier egal, denn es kommt darauf an was du der Funktion übergibst. Referenz oder Wert.
Das stimmt nicht - ihr redet aneinenader vorbei.

Er hat kein Problem mit call by value/reference sondern er hat einfach foreach nicht verstanden.

Warum du hier zwanghaft ein call by reference einsetzen willst ist mir schleierhaft - ist doch mit Rückgabewerten viel schöner...
__________________
Today you...Tomorrow me.
agrajag ist offline  
Alt 10.08.2007, 22:17  
Erfahrener Benutzer
 
Registriert seit: 23.12.2003
Beiträge: 243
mAy^daY
Standard

Ja du hast recht, ich habe nicht richtig gelesen, seine Funktion hatte den Rückgabewert. Das habe ich nicht beachtet, mein Ansatz hatte immer als Ziel die Originaldaten zu ändern.
(Ich bin einfach zu vorbelastet mit Zeigern, da versuche ich wohl die unbewusst überall unter zu bringen )

Gut... möglich ist beides, kommt halt letztendlich darauf an wie er es anwenden will.
mAy^daY ist offline  
Alt 12.08.2007, 14:53  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ich würde Referenzen nur in seltenen Fällen verwenden, dann wenn der Array wirklich sehr groß ist (paarhundert Datensätze). Aber wann hat man das schonmal.
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
JS: Einführung - Javascript im Schichtenmodell nikosch Tutorials 4 11.04.2009 17:06
Rekursive Funktion bricht ab... duras666 PHP Tipps 2008 9 28.04.2008 11:36
Funktion, die Default-Wert für NULL setzt Zergling-new Datenbanken 3 13.11.2006 22:54
Komplexe Funktion: +Übersichtlichkeit, -Performance Jacks Rache PHP Tipps 2006 3 07.06.2006 14:22
Array in rekursiver Funktion auslesen Gumfuzi PHP Tipps 2007 17 15.11.2005 12:01
PHP-GTK Tutorial Beitragsarchiv 9 02.11.2005 21:07
Rückgabewert einer rekrusiven Funktion PHP-Fortgeschrittene 7 06.10.2005 18:44
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
In einer Funktion auf eine Funktion der Klasse zugreifen phpbeginner PHP Tipps 2005-2 2 28.07.2005 00:30
Funktion in einer Funktion aufrufen? PHP Tipps 2005-2 11 14.06.2005 15:14
[Erledigt] Array-Übergabe in Funktion PHP Tipps 2005 1 08.05.2005 21:05
[Erledigt] Wie kann ich beliebig viele Werte an eine Funktion übergeben PHP Tipps 2005 11 25.01.2005 10:44
Funktion() anwendung -bitte um Hilfe PHP Tipps 2004-2 17 08.12.2004 11:58
[Erledigt] sql syntax error in funktion, kann aber nix finden :( PHP Tipps 2004 10 20.07.2004 19:19
Referenz auf Funktion übergeben PHP-Fortgeschrittene 7 20.07.2004 09:51

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php input felder array zeiger bleibt auf letztem element, array_walk strip_tags

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