Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

[php 4] Nochmal von neu parsen.

Diskussion: [php 4] Nochmal von neu parsen. im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Abend, Skripter. Ich habe ein kleines Problem mit den serverseitigen Header-Umleitungen. Meine Skripte haben ein bisschen zu viel davon. ...

Antwort
Alt 16.03.07, 17:00   #1 (permalink)
 
Registriert seit: 08.12.06
jesus Leistung: Facit NTK
Likes: 0
Standard [php 4] Nochmal von neu parsen.

Anzeige

Abend, Skripter.

Ich habe ein kleines Problem mit den serverseitigen Header-Umleitungen.
Meine Skripte haben ein bisschen zu viel davon.

Ich bräuchte eine Funktion oder Methode, das Skript
wieder vom Anfang parsen zu lassen.

Wie zum Beispiel hier im Beispiel

bsp.php

PHP-Code:
// Datei auslesen...
if (($wert file_get_contents('lol.txt')) == false)
{
    
// Datei erstmal anlegen mit ihrem Inhalt.
    
$write fopen('lol.txt'w);
    
fputs ($write'hallo, ich bin der weihnachtsmann');
    
fclose ($write);

    
// Seite nochmal aufrufen, diesmal existiert die Datei.
    
header ('Location: bsp.php');
    exit ();
}
    else
{
    
// ... Und den Inhalt ausgeben.
    
echo $wert;

In diesem Beispiel benutze ich eine serverseitige header-Unmleitung,
um das Skript nochmal erneut parsen zu lassen.
Dabei ruft der Browser das Skript unter den neuen Einstellungen noch
einmal auf.

Ich will aber, dass das Skript nach der neuen Einstellung noch einmal
vom Anfang parst.
Statt header()+exit() eine php-Funktion vom Anfang
parsen. Wenn möglich ohne Sprungmarken, vorallem da
ich nur php 4 zu meinem Host habe.

Bitte gebt mir nicht einen Tipp wie den hier

PHP-Code:
// Datei auslesen...
if (($wert file_get_contents('lol.txt')) == false)
{
    
// Datei erstmal anlegen mit ihrem Inhalt.
    
$write fopen('lol.txt'w);
    
fputs ($write'hallo, ich bin der weihnachtsmann');
    
fclose ($write);

    
// ... aber JETZT lesen! ...
    
$wert file_get_contents('lol.txt')
}

// ... Und den Inhalt ausgeben.
echo $wert
Das ist nur ein schlechtes Beispiel für mein
eigentliches Skript, ich brauche echt was
zum nochmal von neu parsen.

Wäre super, wenn jemand schnell was parat hätte.

mfg - jesus
jesus ist offline   Mit Zitat antworten
Alt 16.03.07, 17:27   #2 (permalink)
Member of Honour
 
Registriert seit: 20.10.01
boppy Leistung: Facit NTK
boppy eine Nachricht über ICQ schicken
Likes: 0
Standard

wie wäre es mir einem While-Konstrukt á la:

while($datei == '')

so könntest du etwas ausführen, solange eben nichts in $datei steht...
boppy ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 16.03.07, 20:24   #3 (permalink)
Themenstarter
 
Registriert seit: 08.12.06
jesus Leistung: Facit NTK
Likes: 0
Standard RE: [php 4] Nochmal von neu parsen.

Zitat:
Das ist nur ein schlechtes Beispiel für mein
eigentliches Skript, ich brauche echt was
zum nochmal von neu parsen.
jesus ist offline   Mit Zitat antworten
Alt 16.03.07, 21:29   #4 (permalink)
 
Registriert seit: 20.11.05
CraHack Leistung: Facit NTK
Likes: 0
Standard

Und wenn du die Datei einfach nocheinmal mit Include() einbindest? Musst aufpassen das es zu keiner Endlosschleife kommt, allerdings hätte es wohl den selben effekt wie der Location Header, nur eben Serverseitig.

Edit: Auf dein Beispiel übertragen:

PHP-Code:
<?php // Datei auslesen...
if (($wert file_get_contents('lol.txt')) == false)
{
    
// Datei erstmal anlegen mit ihrem Inhalt.
    
$write fopen('lol.txt'w);
    
fputs ($write'hallo, ich bin der weihnachtsmann');
    
fclose ($write);

    
// Seite nochmal aufrufen, diesmal existiert die Datei.
    
include('bsp.php');
}
    else
{
    
// ... Und den Inhalt ausgeben.
    
echo $wert;
?>

Edit2: Hier ist jedoch, meiner meinung nach, ein Die() hinter dem Include() recht hilfreich um Ungewolltest doppelt parsen zu verhindern.
CraHack ist offline   Mit Zitat antworten
Alt 16.03.07, 22:21   #5 (permalink)
 
Registriert seit: 09.01.07
quux Leistung: Facit NTK
Likes: 0
Standard

Die Variable $_SERVER['PHP_SELF'] enthält den aktuellen Dateinamen relativ zum Wurzelverzeichnis.
Du könntest also mittels echo $_SERVER['PHP_SELF']; die aktuelle Seite neu ausgeben lassen. Vielleicht hilft dir das weiter. Aber u.U. musst du dann deinen restlichen Code anpassen.
quux ist offline   Mit Zitat antworten
Alt 17.03.07, 10:01   #6 (permalink)
Member of Honour
 
Registriert seit: 02.10.01
Indi Leistung: Z3
Likes: 0
Standard

Darf ich fragen, warum du das überhaupt neu parsen möchtest? Du schreibst, du hast in deinen Skripten zu viele header-umleitungen. Vlt. sind die aber gar nicht notwendig, wenn man die ganze Struktur nochmal überdenkt. ?(
Indi ist offline   Mit Zitat antworten
Alt 17.03.07, 11:58   #7 (permalink)
Themenstarter
 
Registriert seit: 08.12.06
jesus Leistung: Facit NTK
Likes: 0
Standard

OK LEUTE IHR WOLLT JA DAS EINGENTLICHE SKRIPT SEHEN!

Ein "Das ist jur ein schlechtes Beispiel und ich brauche wirklich was zum
von neu parsen" hilft ned weiter...

index.php
Code:
include ('../connect.inc');
include ('../ident_session.inc');
include ('../../libs/get_level.lib');
include ('../../libs/statcalc.lib');
include ('../../libs/entlaut.lib');

// Womit will ein non-member schon gegen ein wildes Pokemon kämpfen?
if ($loged != 'member')
{
	include ('na_NotLogedIn.brc');
	exit ();
}

// Man darf nicht in einem Trainerkampf sein.
$res = mysql_query("SELECT otid FROM user_trainerkaempfe WHERE otid=".$ser['user_id'].";");
if (mysql_num_rows($res) != 0)
{
	include ('na_Trainerkampf.brc');
	exit ();
}

// Man darf nicht am Tauschen sein.
$res = mysql_query("SELECT otid FROM user_livetausch WHERE otid=".$ser['user_id'].";");
if (mysql_num_rows($res) != 0)
{
	include ('na_Tausch.brc');
	exit ();
}

// Kampf erstellen, wenn keiner beim Skriptaufruf läuft.
$res = mysql_query("SELECT * FROM user_wildkaempfe WHERE otid=".$ser['user_id'].";");
if (mysql_num_rows($res) != 1)
{
	include ('index_start.inc');
}
	else
{
	// Daten und Modifikationen vom Kampf auspacken.
	$battle = mysql_fetch_assoc($res);

	// Ist der eperhalt nicht 0, soll LevelUp erstmal durchlaufen werden, bis man dieses Skript mit 0 durchläuft!
	if ($battle['self_eperhalt'] != 0)
	{
		include ('index_LevelUp.brc');
	}
		else
	{
		// ...
		$goto = isset($_GET['show'])?$_GET['show']:'battle';
		switch ($goto)
		{
			case 'pokemon': include ('../team.inc'); break; // Stattdessen in die Teampokemon-Auswahl gehen.
			case 'item': include ('choose_item.inc'); break; // Stattdessen in die Item-Auswahl gehen.
			default: include ('index_Kampf.brc'); break;
		}
	}
}
index_start.php
Code:
// Erstes nicht-kampfunfähige Pokemon im Team als eingesetzt speichern.
$firstfreeslot = 0;
for ($p = 1; $p <= 6; $p++)
{
	$res = mysql_query("SELECT COUNT(*) As Funde FROM user_pokemon_team WHERE sw_ukp!=0 AND slot='".$p."' AND otid='".$ser['user_id']."';");
	if (mysql_result($res, 0) == 1) {$firstfreeslot = $p; break;}
}

// Kein nicht-kampfunfähiges Pokemon im Team gefunden, wenn $firstfreeslot immernoch 0.
if ($firstfreeslot == 0)
{
	// Alles abbrechen und zurück zur Welt
	header ('Location: ../rechts.php?sid='.$sid);
	exit ();
}

// Existiert kein pkfield nach Parameter 'field' keine Auftauchmöglichkeiten oder sind leer,
// wird $maybes unten Leerarray sein und man kommt eh nicht weiter.
$res = mysql_query("SELECT bbcode FROM welt_maps WHERE maptitle='".$ser['welt_map']."';");
preg_match ('#<pkfield "'.$_GET['field'].'" "(.*)" ".*">(.*)</pkfield>#Usi', mysql_result($res, 0), $pkfield);
$theme = $pkfield[1];
$pokes = $pkfield[2];

// Ist Parameter $angel mitgegeben, geht's nur weiter, wenn man das jeweilige Basis-Item besitzt.
if (isset($angel))
{
	$res = mysql_query("SELECT bezeichnung FROM User_Items WHERE bezeichnung='".$angel."' AND otid='".$ser['user_id']."';");
	if (mysql_num_rows($res) == 0)
	{
		header ('Location: ../rechts.php?sid='.$sid);
		exit ();
	}
}

// Auftauchmöglichkeiten des pkfields auspacken.
// Ist $angel gesetzt, nur die maybes der jeweiligen Angel aus dem pkfield nehmen.
preg_match_all ('#<"(.*)" "(.*)" ([\d]{1,5}) ([\d]{1,5})'.(isset($angel)?' "'.$angel.'"':'').'>#i', $pokes, $maybes, PREG_SET_ORDER);
if (count($maybes) == 0)
{
	// 0 Auftauch-Möglichkeiten. Skript abbrechen und zurück zur Welt.
	header ('Location: ../rechts.php?sid='.$sid);
	exit ();
}


// Generiert nun das aufzutauchende PkMn mit seinen Zuffals-EP.
shuffle ($maybes);
$gpkmn_artname = $maybes[0][2];
$gpkmn_ep = mt_rand((int)$maybes[0][3], (int)$maybes[0][4]);

// Hier wird per Zufall das Wesen des wilden PkMn generiert!
$zufall = array('Ernst', 'Forsch', 'Frech', 'Hart', 'Hastig', 'Hitzig', 'Kauzig', 'Kühn', 'Lasch', 'Locker', 'Mäßig', 'Mild', 'Mutig', 'Naiv', 'Pfiffig', 'Robust', 'Ruhig', 'Sacht', 'Sanft', 'Scheu', 'Solo', 'Still', 'Zaghaft', 'Zart');
shuffle ($zufall);
$gpkmn_wesen = $zufall[0];

// Wird es ein Shiny?
if (mt_rand(1, 8000) == 1)
{
	$gpkmn_shiny = 'shiny';
}
	else
{
	$gpkmn_shiny = 'normal';
}

// constante Global-Daten des auftauchenden Poke auspacken für Generierungen unten.
$res = mysql_query("SELECT ability1, ability2, ep_klasse, stat_mkp FROM const_pokemon WHERE nameD='".$gpkmn_artname."';");
if (mysql_num_rows($res) != 1)
{
	// Das wilde Pokemon existiert nicht in der Datenbank!
	header ('Location: ../rechts.php?sid='.$sid);
	exit ();
}
$const = mysql_fetch_assoc($res);

// Level des wilden Pokemon berechnen.
$gpkmn_epkalk = get_level($gpkmn_artname, $gpkmn_ep);

// Fweiser des wilden PkMn generieren.
if ($const['ability2'] == '')
{
	$gpkmn_fweiser = 1;
}
	else
{
	$gpkmn_fweiser = ($const['ability1'] == '')?1:mt_rand(1, 2);
}

// Geschlecht des wilden PkMn generieren.
$gpkmn_geschlecht = 0;
if ($const['gsverteilung'] == -1)
{
	$gpkmn_geschlecht = 0;
}
	else
{
	if (mt_rand(1, 100) <= $const['gsverteilung'])
	{
		$gpkmn_geschlecht = 1;
	}
		else
	{
		$gpkmn_geschlecht = 2;
	}
}

// dv des mkp-werts schon hier generieren, mkp berechnen!
$gpkmn_dv_mkp = mt_rand(0, 31);
$gpkmn_mkp = 10 + $const['stat_mkp'] * $gpkmn_epkalk['level'];
$gpkmn_mkp += $gpkmn_dv_mkp / 100 * $gpkmn_epkalk['level'];
$gpkmn_mkp = floor($gpkmn_mkp);

// Wildpokemon-Zeile erstellen!
mysql_query ("INSERT INTO user_wildkaempfe (
	otid, theme, self_pkset, phase,
	wild_artname, wild_shiny, wild_geschlecht, wild_fweiser, wild_tragitem, wild_ep, wild_happiness, wild_woher, wild_wesen,
	wild_sw_ukp, wild_dv_mkp, wild_dv_atk, wild_dv_def, wild_dv_spa, wild_dv_spv, wild_dv_mov
) VALUES (
	'".$ser['user_id']."', '".$theme."', ".$firstfreeslot.", 'standby',
	'".$gpkmn_artname."', '".$gpkmn_shiny."', ".$gpkmn_geschlecht.", ".$gpkmn_fweiser.", '', ".$gpkmn_ep.", 70, '".$gpkmn_woher."', '".$gpkmn_wesen."',
	".$gpkmn_mkp.", ".$gpkmn_dv_mkp.", ".mt_rand(1, 31).", ".mt_rand(1, 31).", ".mt_rand(1, 31).", ".mt_rand(1, 31).", ".mt_rand(1, 31)."
);") or die ('Konnte kein wildes Pokemon generieren...');

// Dem wilden Pokemon Attacken "beibringen"
include ('index_start_setMoves.inc');

// Kampfstart-Benachrichtigung chatten.
if (isset($angel))
{
	$text = '<span class="text_datum">['.date('h:i').']</span> <b>~</b> '.$ser['username'].' wirft die '.$angel.' aus -> Ein wildes '.$gpkmn_artname.'!<br>';
}
	else
{
	$text = '<span class="text_datum">['.date('h:i').']</span> <b>~</b> '.$ser['username'].' -> Ein wildes '.$gpkmn_artname.'!<br>';
}
mysql_query ("INSERT INTO ychat_newlines (time, map, text) VALUES (".date('U').", '".$ser['welt_map']."', '".$text."');");

// index.php nun erneut aufrufen.
// Die in index_start.inc erzeugten Einstellungen parsen index.php diesmal mit index_Kampf.brc
header ('Location: index.php?sid='.$sid);
phase_standby.inc
Code:
$titel = 'Standby!';
$bericht = '';

// Feldveränderungen anzeigen und runterzählen bzw. wegen Nachlass einternen.
if ($battle['field_status'] == 'Hagelsturm')
{
	if (--$battle['field_count'] == 0)
	{
		$battle['field_status'] = '';
		sendq ("user_wildkaempfe SET field_status='' WHERE otid=".$ser['user_id'].";");
		$bericht = 'Der Hagelsturm<br>lässt nach!';
	}
		else
	{
		$bericht = 'Ein Hagelsturm tobt!';
	}
	sendq ("user_wildkaempfe SET field_count=".$battle['field_count']." WHERE otid=".$ser['user_id'].";");
}
	elseif ($battle['field_status'] == 'Sandsturm')
{
	if (--$battle['field_count'] == 0)
	{
		$battle['field_status'] = '';
		sendq ("user_wildkaempfe SET field_status='' WHERE otid=".$ser['user_id'].";");
		$bericht = 'Der Sandsturm<br>lässt nach!';
	}
		else
	{
		$bericht = 'Ein Sandsturm tobt!';
	}
	sendq ("user_wildkaempfe SET field_count=".$battle['field_count']." WHERE otid=".$ser['user_id'].";");
}
	elseif ($battle['field_status'] == 'Greissendes Licht')
{
	if (--$battle['field_count'] == 0)
	{
		$battle['field_status'] = '';
		sendq ("user_wildkaempfe SET field_status='' WHERE otid=".$ser['user_id'].";");
		$bericht = 'Das Sonnenlicht<br>lässt nach!';
	}
		else
	{
		$bericht = 'Greissendes Licht!';
	}
	sendq ("user_wildkaempfe SET field_count=".$battle['field_count']." WHERE otid=".$ser['user_id'].";");
}
	elseif ($battle['field_status'] == 'Platzregen')
{
	if (--$battle['field_count'] == 0)
	{
		$battle['field_status'] = '';
		sendq ("user_wildkaempfe SET field_status='' WHERE otid=".$ser['user_id'].";");
		$bericht = 'Der Regen<br>lässt nach!';
	}
		else
	{
		$bericht = 'Ein Platzregen!';
	}
	sendq ("user_wildkaempfe SET field_count=".$battle['field_count']." WHERE otid=".$ser['user_id'].";");
}

// Schilder anzeigen und runterzählen bzw. wegen Nachlass einternen.
if ($battle['self_lichtschild'] != 0)
{
	if (--$battle['self_lichschild'] == 0)
	{
		$bericht .= '<p>'.$epkmn_spitzname.'s Lichtschild<br>lässt nach!';
	}
	sendq ("user_wildkaempfe SET self_dr_lichtschild=".$battle['self_lichtschild']." WHERE otid=".$ser['user_id'].";");
}
if ($battle['self_reflektor'] != 0)
{
	if (--$battle['self_reflektor'] == 0)
	{
		$bericht .= '<p>'.$epkmn_spitzname.'s Reflektor<br>lässt nach!';
		sendq ("user_wildkaempfe SET self_dr_reflektor=".$battle['self_reflektor']." WHERE otid=".$ser['user_id'].";");
	}
}
if ($battle['self_bodyguard'] != 0)
{
	if (--$battle['self_bodyguard'] == 0)
	{
		$bericht .= '<p>'.$epkmn_spitzname.'s Bodyguard<br>lässt nach!';
	}
	sendq ("user_wildkaempfe SET self_dr_bodyguard='".$battle['self_bodyguard']."' WHERE otid='".$ser['user_id']."';");
}
if ($battle['wild_dr_lichtschild'] != 0)
{
	if (--$battle['wild_dr_lichschild'] == 0)
	{
		$bericht .= '<p>'.$battle['wild_artname'].'s Lichtschild<br>lässt nach!';
	}
	sendq ("user_wildkaempfe SET dr_bodyguard=".$battle['wild_dr_lichtschild']." WHERE otid=".$ser['user_id'].";");
}
if ($battle['wild_dr_reflektor'] != 0)
{
	if (--$battle['wild_dr_reflektor'] == 0)
	{
		$bericht .= '<p>'.$battle['wild_name'].'s Reflektor<br>lässt nach!</p>';
	}
	sendq ("user_wildkaempfe SET self_dr_bodyguard=".$battle['wild_dr_reflektor']." WHERE otid=".$ser['user_id'].";");
}
if ($battle['wild_dr_bodyguard'] != 0)
{
	if (--$battle['wild_dr_bodyguard'] == 0)
	{
		$bericht .= '<p>'.$battle['wild_artname'].'s Bodyguard<br>lässt nach!</p>';
	}
	sendq ("user_wildkaempfe SET dr_bodyguard=".$battle['wild_dr_bodyguard']." WHERE otid=".$ser['user_id'].";");
}

// Befehle und Actfolge der vorigen Runde zurücksetzen.
sendq ("user_wildkaempfe SET phase='befehl', self_turn=0, self_cmd1='', self_cmd2='', self_cmd3='', self_cmd4='' WHERE otid=".$ser['user_id'].";");

// Wenn's nix zu berichten gibt kein Seitenaufbau, direkt Seitenaufruf mit nächster Phase...
if ($bericht == '')
{
	header ('Location: index.php?sid='.$sid);
	exit ();
}
jesus ist offline   Mit Zitat antworten
Alt 17.03.07, 17:41   #8 (permalink)
 
Registriert seit: 20.11.05
CraHack Leistung: Facit NTK
Likes: 0
Standard

Und wo ist jetzt das Problem?
Speichere die Variablen die du beim wiederaufrufen haben willst in einem Extra Array. Bei jedem Start überprüfst du jetzt ob die Variablen die Per "GET" kommen auch schon in diesem Array vorhanden sind.

Um sicher zu gehen das Funktionen nicht 2 mal Definiert werden reicht eine Einfache IF Anweisung aus:
PHP-Code:
If($Blub==False)
{
function 
Blubber()
{
echo 
"Mächtig Wichtig!";
}
$Blub=True;

Schon wird die Funktion nur einmal Definiert egal wie oft du die Datei einbindest.

Dann einfach nochmal z.b. Deine Index datei neu einbinden, bzw die datei auf die der Aufruf eigentlich ziehlte und hinter dem Include ein Exit().

Das ganze in eine einigermaßen schöne Funktion und schon hast du dein Sktipt-Neu-Parsen Methode.
CraHack ist offline   Mit Zitat antworten
Alt 17.03.07, 18:51   #9 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
LX Leistung: Z3
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Likes: 21
Lightbulb

Wuaa, das wird ja immer dreckiger...

Wie Indi schon etwas durch die Blume sagte: wenn ein Skript davon abhängt, dass es mehrfach durchläuft, dann ist es einfach schlecht programmiert. Wenn Code mehrfach ausgeführt werden soll, dann gehört der in eine Schleife, und zwar ohne includes auf die gleiche Datei oder einen Redirect auf sich selbst.

Ich hab keine Lust, mich da durch die 3 geposteten Skripte zu wühlen, dem Anschein nach handelt es sich aber um ein Onlinespiel. Falls es darum geht, dass eigene Aktionen davon abhängen, was andere gemacht haben, und dass hier ein regelmäßiger Check auf neue Aktionen von anderen erfolgen sollte, dann gehört das aber auf die Clientseite. Alle x Sekunden den Browser eine Seite neu laden lassen ist da definitiv eher geeignet als Endlosschleifen zu programmieren oder eine Rekursion ohne Wiederkehr. Das bringt nämlich selbst den stärksten Server schnell in die Knie.
__________________
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

JS BB LX UP
LX ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » [php 4] Nochmal von neu parsen.
Themen-Optionen
Ansicht

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

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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
std::string parsen -> wie? bad_alloc Code Kitchen 5 27.03.08 21:39
template parsen - Friedrich Code Kitchen 8 06.12.07 23:23
mp3 "parsen" Friedrich Code Kitchen 5 06.12.07 16:22
website parsen c++ gelöscht Code Kitchen 3 05.01.06 18:21


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61