 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
09.03.2005, 09:09
|
#1
|
|
TP-Member
Registriert seit: Jan 2005
Ort: Basel
|
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ück zu den Einträ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
|
|
|
09.03.2005, 09:18
|
#2
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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.
|
|
|
09.03.2005, 10:00
|
#3
|
|
TP-Member
Registriert seit: Jan 2005
Ort: Basel
|
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)
|
|
|
09.03.2005, 10:04
|
#4
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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.
Geändert von steffenk (09.03.2005 um 10:11 Uhr).
|
|
|
09.03.2005, 11:53
|
#5
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
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
|
|
|
09.03.2005, 12:02
|
#6
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Oyten
|
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.
|
|
|
09.03.2005, 14:17
|
#7
|
|
TP-Member
Registriert seit: Jan 2005
Ort: Basel
|
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ück zu den Einträ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ä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> ";
}
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
|
|
|
09.03.2005, 14:26
|
#8
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
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 ...
Geändert von steffenk (09.03.2005 um 14:28 Uhr).
|
|
|
09.03.2005, 16:12
|
#9
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Oyten
|
|
|
|
10.03.2005, 00:38
|
#10
|
|
TP-Senior
Registriert seit: Aug 2003
Ort: Kaiserslautern
|
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 ^^.
|
|
|
10.03.2005, 01:02
|
#11
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
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
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| 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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 Uhr.
|
 |