phpbuddy.eu
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Bewertung: Bewertung: 2 Stimmen, 5,00 durchschnittlich.
Alt 09.03.2005, 09:09   #1
TP-Member
 
Registriert seit: Jan 2005
Ort: Basel
BuboBubo macht alles soweit korrekt

Variablen auf Superglobals umstellen


Hallo Leute,

ich habe ein Gästebuchscript, dass globale Variablen benutzt und daher mit register_globals = on nicht funktioniert.

Nun will ich das umstellen; leider scheiter ich schon am Anfang

Da gibt es z.B. den Link "zurück zum Gästebuch", der am Anfang des Scripts definiert wird:

$PHP_SELF = $_SERVER['PHP_SELF'];
$title3 = _gb3;
$back = "<a class='link' title='zur&uuml;ck zu den Eintr&auml;gen' href='$PHP_SELF'>$title3</a>";

schön

Später im Script wird die function form() aufgerufen, in der bisher die Variable $back mit
global $back;
definiert wurde.

Für die Umstellung auf superglobale Variablen habe ich bisher völlig erfolglos folgende Varianten probiert:

$GLOBALS['back'];
oder
$back = $_GET['back'];
oder
$back = $_POST['back'];
oder
$back = $_REQUEST['back'];
oder
$back = $_COOKIE['back'];

Der LInk wird bei keiner Variante angezeigt, nur beim alten global $back

Hat jemand eine Idee, warum das nicht funktioniert?

Vielen Dank und Gruss
Alex
BuboBubo ist offline   Mit Zitat antworten


Alt 09.03.2005, 09:18   #2
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
seit wann hat die Variabel $GLOBALS was mit der Einstellung register_globals zu tun ?
Lediglich wenn letzteres eingeschaltet ist, sind alle Variabeln "global".

Die Bezeichnung $GLOBALS['back'] steht nur für $back. Du musst halt schauen, in welcher Function sie auftaucht, und da muss dann die Anweisung global $back; rein.

Aber das Umschreiben dürfte recht mühsam sein, auch lässt diese Art der Programmierung auf älteren Datums schlissen.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 09.03.2005, 10:00   #3
TP-Member
 
Registriert seit: Jan 2005
Ort: Basel
BuboBubo macht alles soweit korrekt
Das Script funzt nicht, wenn register_globals = On sind, aber es ist okay bei der Einstellung off.

Und warum hat $GLOBALS nichts damit zu tun?
Lt. http://de3.php.net/manual/de/languag...predefined.php
ist das doch genau der Punkt!

Gruss
Alex (nun völlig verwirrt)
BuboBubo ist offline   Mit Zitat antworten
Alt 09.03.2005, 10:04   #4
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
wieso verwirrt ? Da stehts doch im Klartext, welche Variabeln von der register_globals betroffen sind:
Zitat:
Die Anweisung register_globals off beeinflusst den Satz von vordefinierten Variablen, die im globalen Bereich verfügbar sind. Um zum Beispiel DOCUMENT_ROOT zu bekommen, müssen Sie $_SERVER['DOCUMENT_ROOT'] statt $DOCUMENT_ROOT verwenden oder um $id von der URL http://www.example.com/test.php?id=3 zu bekommen $_GET['id'] statt $id oder $_ENV['HOME'] statt $HOME.
Eselsbrücke: Alle Vars die mit $_ anfangen
Da steht nix von $GLOBALS

Das Script funzt in der Einstellung deshalb nicht, weil wahrscheinlich Namen mehrfach verwendet wurden wie z.B. $dies und $_GET['dies']. Bei register_globals=on nimmt $dies automatisch den Wert von $_GET['dies'] an.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer

Geändert von steffenk (09.03.2005 um 10:11 Uhr).
steffenk ist offline   Mit Zitat antworten
Alt 09.03.2005, 11:53   #5
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE
Das Skript nicht mehr funktioneren, wenn man die register_globals AUS sind, hab ich oft gehört und ist auch logisch. Aber dass es nicht mehr geht, wenn man sie AN macht, hör ich zum ersten Mal (?!?).

Zeig uns doch mal bitte den ganzen Code von Dir, klingt interessant
__________________
My software never has bugs. It just develops random features ...

» DevShack - die Website des freien Webentwicklers Boris
Boris ist offline   Mit Zitat antworten
Alt 09.03.2005, 12:02   #6
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Zitat:
Zitat von BuboBubo
Der LInk wird bei keiner Variante angezeigt, nur beim alten global $back

Hat jemand eine Idee, warum das nicht funktioniert?
Dein Problem hat überhaupt nichts mit register_globals zu tun.

Die Funktion form() hat ihren eigenen Namensraum.
Damit sie die Variable $back aus dem Hauptscript nimmt, musst Du sie der Funktion mit global $back bekannt machen.

Ich denke, das ist Dein Verständnisproblem.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 09.03.2005, 14:17   #7
TP-Member
 
Registriert seit: Jan 2005
Ort: Basel
BuboBubo macht alles soweit korrekt
Also, momentan stehen die Register_globals auf Off und der Code funzt nicht.
Es scheitert schon am Link "ins Gästebuch schreiben" (erstes echo nach <p class="numbergb">) beim PHP_SELF und dem Füllen der Variable $show. Die bleibt leer und es passiert nix (es sollte sich das template für den Eintrag öffnen.

Nachdem ich die rg auf On gesetzt habe, funzt es.
Ich hätte halt gern ein Gästebuch, das auch noch funktioniert, falls mein Provider die rg auf off setzt

Hier der Code (gekürzt, z.B. den $anzahl code habe ich weggelassen, ist eh schon lang genug).

PHP-Code:
.....code....
// Link zur Hauptuebersicht
$title3 = _gb3;
$back = "<a class='link' title='zur&uuml;ck zu den Eintr&auml;gen' href='$PHP_SELF'>$title3</a>";

// Globale Variablen definieren
$gbfile = "xxxx.txt";
$datum = date("d.m.Y");
$zeit = date("H:i");
global $show;
global $pages;
global $start;
global $ende;
global $anzahl;
global $pass;


$title2 = _gb2;

$datum = date("d.m.Y");
$zeit = date("H:i");

// Gaestebuch anzeigen
if($show == "" or $show == "cut")
{
$file = file("$gbfile");
$anzahl = count($file);

echo "<h1>$title1</h1>";
echo "<p>$gbintro.</p>";
echo "<br>";
?>
<p class="numbergb">
<?php
echo "<a class='link' title='Ins G&auml;stebuch schreiben' href='$PHP_SELF?show=write'>$title2</a>";
?>
</p>

// Daten auslesen
<?php
for($a=$start;$a<$ende;$a++)
{
$split explode("|",$file[$a]);

echo 
"<br>"; echo "<table border='0' cellspacing='1' cellpadding='5' width='100%'>";
echo 
"<tr><th align='left' colspan='2'>$Eintrag $vom $split[6] $um $split[7]";
echo 
"</th></tr>";
echo 
"<tr><td valign='top' width='30%'>";

if(!empty (
$split[2])) {
echo 
"$von $split[1] $aus $split[2]";
}
else{
echo 
"$von $split[1]";
}
echo 
"<p>";
if(!empty (
$split[4])) {
echo 
"<a target='_blank' title='Besuche $split[1]´s Homepage' href='http://$split[4]'><img src='images/home.gif' width='16' height='16' border='0' alt='$Besuche $split[1]´s Homepage'></a>&nbsp;&nbsp;";
}
if(!empty (
$split[5])) {
echo 
"<a href='mailto:$split[5]'><img src='images/mail.gif' width='16' height='16' border='0' alt='$EMail $an $split[1]'></a>";
}
echo 
"</p></td>";
echo 
"<td class='td' valign='top'>$split[3]</td>";
echo 
"</tr>";
echo 
"</table>";
}

// Formular anzeigen
if($show == "write") {

// Variablen leeren
$name "";
$ort  "";
$text "";
$home "";
$mail "";

form();
}


// Daten verarbeiten
if($show == "data") {

// Fehler definieren
if(!(strlen(trim($name)))){
echo 
"<h1><dfn>$noname</dfn></h1>";
form();
}
else
if(!
eregi(".+@.+\..+"$mail)&& !empty($mail)){
echo 
"<h1><dfn>$erroremail</dfn></h1>";
form();
}
else
if(!(
strlen(trim($text)))){
echo 
"<h1><dfn>$notext</dfn></h1>";
form();
}
else
{



// Wenn alles okay - Daten zum Speichern vorbereiten

$name trim($name);
$ort  trim($ort);
$mail trim($mail);
$text trim($text);
$home trim($home);
$text strip_tags($text);
$text str_replace("\n","<br>",$text);

$file=file("$gbfile");
$fp=fopen("$gbfile","r");
$inhalt=fgets($fp,1000);
$zeile=explode("|",$inhalt);
$next=$zeile[0]+1;
$br=chr(13).chr(10);

// schreiben
$fp=fopen("$gbfile","w");
fputs($fp,"$next|$name|$ort|$text|$home|$mail|$datum|$zeit|$br");
fclose($fp);
$fp=fopen("$gbfile","a+");
$gesamt=count($file);
for(
$i=0;$i<$gesamt;$i++)
{
fputs($fp,"$file[$i]");
}
fclose($fp);


// Funktion Eintragsformular
function form () {
global 
$PHP_SELF;
global 
$name;
global 
$ort;
global 
$text;
global 
$home;
global 
$mail;
global 
$back;
global 
$title2;

echo 
"<h1>$title2</h1>"?>
<p class="numbergb">
<?php
echo $back;
?>
</p>
<?
echo "<form action='$PHP_SELF?show=data' method='post'>";
$message _gb7;
$gbname _new1;
$wohnort _gb10;
$EMail _new2;
$frei _gb11;
$eintragen _new5;
$vorschau _gb12;

echo 
"<br>";
echo 
"$gbname:<br><input size='53' value='$name' name='name' type='text'><br>";
echo 
"$wohnort: *<br><input size='53' value='$ort' name='ort' type='text'><br>";
echo 
"$EMail: *<br><input size='53' value='$mail' name='mail' type='text'>";
$text=str_replace("<br>","\n","$text");
echo 
"<br>";
echo 
"<br>";
echo 
"$message:<br><textarea name='text' rows='7' cols='40'>$text</textarea>";
echo 
"<br>";
echo 
"<br>";
echo 
"<p>Homepage: * http:// <input size='35' value='$home' name='home' type='text'></p>";
echo 
"<br>";
echo 
"<input value='$eintragen' class='btn' type='submit'> <input name='show' value='$vorschau' class='btn' type='submit'>";
echo 
"<br>";
echo 
"<br>";
echo 
"<p>* $frei</p>";
echo 
"</form>";
}
?>
Merci,
Alex
BuboBubo ist offline   Mit Zitat antworten
Alt 09.03.2005, 14:26   #8
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
Du solltest Dich mal über Namensräume und Gültigkeitsbereiche von Variabeln informieren.

Die global-Anweisung im Quelltext ist völlig überflüssig.
In Funktionen, die einen eigenen Namensraum haben, musst Du Variabeln durch global bekannt machen.
Dazu genügt die Anweisung
global $var1, $var2,... ;
Es müssen alle Variabeln, die Bezug auf übergeordnete Variabeln haben, per global bekannt gemacht werden. Da fehlen bei Dir eine ganze Menge ...
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer

Geändert von steffenk (09.03.2005 um 14:28 Uhr).
steffenk ist offline   Mit Zitat antworten
Alt 09.03.2005, 16:12   #9
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Und was soll das sein?
Code:
$title3 = _gb3;
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 10.03.2005, 00:38   #10
TP-Senior
 
Registriert seit: Aug 2003
Ort: Kaiserslautern
khromium macht alles soweit korrekt
Erster Fall - register_globals = on verursacht Schwierigkeiten.

Zitat:
Das Skript nicht mehr funktioneren, wenn man die register_globals AUS sind, hab ich oft gehört und ist auch logisch. Aber dass es nicht mehr geht, wenn man sie AN macht, hör ich zum ersten Mal (?!?).
Das ist mir letztens erst passiert. Wenn du fest danach programmierst, also davon ausgehst, dass register_globals = OFF sind kann es schonmal vorkommen, dass eine Varialbe durch beislpielsweise einen $_GET-Parameter überschrieben wird, obwohl es nicht beabsichtigt war (sollte zwar nicht vorkommen, aber et geht halt mal wat schief ^^). Mir hat zumindest in diesem Fall dieses Script geholfen.

PHP-Code:
 if (ini_get('register_globals')) { // If register globals are enabled
 
            // Unset $_GET keys
            
foreach ($_GET as $get_key => $get_value)
         {
                eval(
"unset(\${$get_key});");
            }
 
            
// Unset $_POST keys
            
foreach ($_POST as $post_key => $post_value)
         {
                eval(
"unset(\${$post_key});");
            }
 
            
// Unset $_REQUEST keys
            
foreach ($_REQUEST as $request_key => $request_value)
         {
                eval(
"unset(\${$request_key});");
            }
            
            foreach (
$_SESSION as $session_key => $session_value)
            {
                eval(
"unset(\${$session_key});");
            }
            
        } 
Dieses Scirpt am Anfang der PHP verhindert die Überschreibung

Zweiter Fall - register_globals = off verursacht Probleme.

Im Prinzip kann man das nach dem gleichen Schema lösen.

PHP-Code:
        if(!ini_get('register_globals'))
        {
            foreach(
$_GET as $get_key => $get_value)
            {
             $
$get_key $get_value;
         }
 
            
// etc.
    

Damit sollten die Variablen wieder verfügbar sein, als wäre register_globals = on.
Würde ich allerdings nur benutzen, wenn man keine Lust/Zeit hat es anständig zu machen.

Gäbe natürlich noch die Möglichkeit register_globals per ini_set direkt zu setzen, obwohl das noch keiner meiner Provider zugelassen hat.

So ich hoffe ich konnte helfen, weiß auch nicht ob das überhaupt zur Frage passt, is schon bisschen spät ^^.
khromium ist offline   Mit Zitat antworten
Alt 10.03.2005, 01:02   #11
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE
Also sorry, wenn man korrekt und sauber programmiert und die Superglobals benutzt, ist es völlig egal, ob die register_globals an oder aus sind.

Just my 2 cents
__________________
My software never has bugs. It just develops random features ...

» DevShack - die Website des freien Webentwicklers Boris
Boris ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
Variablen auf Superglobals umstellen Variablen auf Superglobals umstellen
« MySQL & Login | Eintrag doppelt »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |