Zum Seiteninhalt springen

  • Ungelesene Beiträge
  • Unbeantwortete Themen
  • Themen der letzten 24 Stunden
  • Erweiterte Suche
Comasu
  • Forum
  • Projekte
  • Anmelden
  • Registrieren

  • Comasu
  • Laberecke
  • Technik

PHP: action-Anweisung

  • MoG

    Administrator

    Beiträge
    806

    PHP: action-Anweisung

    Donnerstag, 14. September 2006, 15:26
    Hiho, dieser Thread is ne kleine Hilfe für Ark ^^

    Es geht darum, eine PHP-Datei aufzurufen und mittels mitgelieferter Variablen, also action-anweisungen, verschiedene Aktionen durchzuführen. So kann man einer PHP-Datei mehrere Aufgaben zuteilen und spart Platz auf dem Server :D

    Wie das Ganze dann im phpBB aussieht kann ich dir leider nicht sagen, da wirst du wohl oder übel ein wenig experimentieren müssen.

    Zu Beginn jeder php sollte

    Quellcode

    1. <?
    <?
    stehen, darunter dürften im phpBB Verbindungen zu anderen Dateien und der Aufruf von Variablen folgen. Füge nun, nachdem dieser "Kopf" zu Ende ist, folgendes ein:

    PHP-Quelltext

    1. if (isset($_REQUEST['action'])) $action = $_REQUEST['action'];
    2. else $action = '';
    <?php if (isset($_REQUEST['action'])) $action = $_REQUEST['action']; else $action = ''; ?>


    Mit diesem Teil erklärst du deiner PHP, was sie machen soll, wenn an den Dateinamen noch eine Variable 'action' kommt. Was sie nun bei den verschiedenen Befehlen umsetzt, kannst du ihr so sagen:

    PHP-Quelltext

    1. if($action=="popup") {
    2. //Hier kämen deine Funktionen rein
    3. //Falls es in phpBB eine Template-Ausgabe gibt, muss die auch hier rein!!!
    4. //Bei wbb sieht das z.B. so aus:
    5. //eval("\$tpl->output("".$tpl->get("cg_form")."");");
    6. }
    <?php if($action=="popup") { //Hier kämen deine Funktionen rein //Falls es in phpBB eine Template-Ausgabe gibt, muss die auch hier rein!!! //Bei wbb sieht das z.B. so aus: //eval("\$tpl->output("".$tpl->get("cg_form")."");"); } ?>


    Diesen oberen Code kannst du mehrmals innerhalb deiner php verwenden, die action-Befehle sollten natürlich jedesmal einen anderen Namen haben.

    Wie spricht man diese action nun an? Ganz einfach über die Adresszeile. Sagen wir, deine PHP-Datei heißt music.php In ihr befindet sich ein Code, der z.B. dein Popup mit Inhalt füllt (!!Folgendes ist kein Code zum Erzeugen von Popups, sondern nur ein Code zur Seitenausgabe. Popup kommt später);

    Quellcode

    1. <a href="music.php?action=popup">Musikbox-Popup</a>
    <a href="music.php?action=popup">Musikbox-Popup</a>


    Mit diesem Link wird die music.php aufgerufen. Die Datei wird nach action=popup untersucht, der darin stehende Code wird ausgeführt und ausgegeben.

    Innerhalb des phpBB gibt es, soweit ich weiß, eine Funktion zum Erstellen von Popups, egal wie, du musst es mit einem Inhalt füllen, evtl über den src-tag. Füge einfach "music.php?action=popup" ein, du verstehst hoffentlich, was ich meine ^^°


    #################################

    Als Beispiel haste hier mal eine geraffte PHP-Fassung:


    PHP-Quelltext

    1. <?php
    2. $filename = 'cg_bank.php';  //WBB
    3. require "global.php"; //WBB
    4. require "cg_header.php"; //WBB
    5. if (isset($_REQUEST['action'])) $action = $_REQUEST['action'];
    6. else $action = '';
    7. // Gast
    8. if($wbbuserdata[userid] == "") {
    9.     header("Location: cg_start.php");
    10.     exit();
    11. }
    12. //#### Bank Index #### <--- Dieser Teil wird ausgeführt, wenn keine action angegeben wird
    13. if($action=="") {
    14. $cg_bereich = 'Bankhalle';
    15. eval("\$cg_content = "".$tpl->get("cg_bank")."";");
    16. eval("\$tpl->output("".$tpl->get("cg_form")."");");
    17. }
    18. //#### Ausleihen #### <----- <a href="cg_bank.php?action=ausleihen"> So siehts aus
    19. if($action=="ausleihen") {
    20. $cg_bereich = 'Bank | Gold ausleihen';
    21. //db-update
    22. if (isset($_POST['send'])) {
    23.     $db->query("INSERT INTO cg_bank (charname,auftrag,gold_ausgeliehen,gold_schulden,leihzinssatz) VALUES 
    24.     ('$cguserdata[charname]','".addslashes($_POST['$auftrag'])."','".addslashes($_POST['gold_ausgeliehen'])."','".$schulden."','".addslashes($_POST['leihzinssatz'])."')");
    25.         header("Location: cg_bank.php?action=fertig");
    26.         exit();
    27. }
    28. eval("\$cg_aktion = "".$tpl->get("cg_bank_ausleihen")."";");
    29. eval("\$cg_content = "".$tpl->get("cg_bank")."";");
    30. eval("\$tpl->output("".$tpl->get("cg_form")."");");
    31. }
    32. //##### Fertig ####
    33. if($action=="fertig") {
    34. $cg_bereich = 'Bank | Auftrag ausgeführt';
    35. //db-update
    36. $db->query("INSERT INTO cg_ablage (charname,gebäude,datum,text) VALUES 
    37. ('$cguserdata[charname]','".addslashes($_POST['$gebaeude'])."','".$datum."','".addslashes($_POST['text'])."')");
    38.         header("Location: cg_bank.php");
    39.         exit();
    40. }
    41. eval("\$cg_aktion = "".$tpl->get("cg_bank_fertig")."";");
    42. eval("\$cg_content = "".$tpl->get("cg_bank")."";");
    43. eval("\$tpl->output("".$tpl->get("cg_form")."");");
    44. }
    45. //#######
    46. ?>
    <?php $filename = 'cg_bank.php'; //WBB require "global.php"; //WBB require "cg_header.php"; //WBB if (isset($_REQUEST['action'])) $action = $_REQUEST['action']; else $action = ''; // Gast if($wbbuserdata[userid] == "") { header("Location: cg_start.php"); exit(); } //#### Bank Index #### <--- Dieser Teil wird ausgeführt, wenn keine action angegeben wird if($action=="") { $cg_bereich = 'Bankhalle'; eval("\$cg_content = "".$tpl->get("cg_bank")."";"); eval("\$tpl->output("".$tpl->get("cg_form")."");"); } //#### Ausleihen #### <----- <a href="cg_bank.php?action=ausleihen"> So siehts aus if($action=="ausleihen") { $cg_bereich = 'Bank | Gold ausleihen'; //db-update if (isset($_POST['send'])) { $db->query("INSERT INTO cg_bank (charname,auftrag,gold_ausgeliehen,gold_schulden,leihzinssatz) VALUES ('$cguserdata[charname]','".addslashes($_POST['$auftrag'])."','".addslashes($_POST['gold_ausgeliehen'])."','".$schulden."','".addslashes($_POST['leihzinssatz'])."')"); header("Location: cg_bank.php?action=fertig"); exit(); } eval("\$cg_aktion = "".$tpl->get("cg_bank_ausleihen")."";"); eval("\$cg_content = "".$tpl->get("cg_bank")."";"); eval("\$tpl->output("".$tpl->get("cg_form")."");"); } //##### Fertig #### if($action=="fertig") { $cg_bereich = 'Bank | Auftrag ausgeführt'; //db-update $db->query("INSERT INTO cg_ablage (charname,gebäude,datum,text) VALUES ('$cguserdata[charname]','".addslashes($_POST['$gebaeude'])."','".$datum."','".addslashes($_POST['text'])."')"); header("Location: cg_bank.php"); exit(); } eval("\$cg_aktion = "".$tpl->get("cg_bank_fertig")."";"); eval("\$cg_content = "".$tpl->get("cg_bank")."";"); eval("\$tpl->output("".$tpl->get("cg_form")."");"); } //####### ?>


    Anweisungen, die vor action=="" kommen, sind für alle action-Teile verfügbar, alle Anweisungen die innerhalb eines action-Teils stehen, sind nur für diese action verfügbar


    Ich hoffe, es hat ein wenig geholfen, hab nebenher telefoniert ^^°

    Achja: du musst das alles nicht "action" nennen, jeder andere begriff geht auch, action ist nur leichter nachvollziehbar



    MfG MoG
    Just Testing
  • Ark

    Schüler

    Beiträge
    143
    Freitag, 15. September 2006, 17:14
    hallo mog

    erstmal ein kleiner bug, den ich gefunden hab:
    in dem lila style zeigt es nur 2 smilies in der smilie_box an. der rest der table_cells sind leer

    nun zum code:

    bei phpbb sieht eine befehlabfrage ein bissel anders aus. da läßt man das "action" nämlich weg, aber das wird dir sicher bekannt sein [nur der vollständigkeitshalber - falls jemand mitliest]

    mal ein beispiel mit einer spring=quelle

    PHP-Quelltext

    1. $shrine = ( isset ($_GET['shrine']) ? $_GET['shrine'] : "" );
    2.   if ( $shrine != "" )
    3.   {
    4.       // Shrine found
    5.       switch ( $shrine )
    6.       {
    7.           case "warrior":
    8.               $sql_query = "SET character_hp = character_hp + " . ( 1 + $chara_data['character_hp_max'] - $chara_data['character_hp'] ) . ", character_hp_max = character_hp_max + 1, character_might = character_might + 1 " ;
    9.   
    10.               $shrine_text = sprintf($lang['shrine_text_warrior'], $chara_data['character_hp_max'] + 1, $chara_data['character_might'] + 1  );
    11.   
    12.               break;
    13.   
    14.           case "magic":
    15.               $sql_query = "SET character_mp = character_mp + " . ( 1 + $chara_data['character_mp_max'] - $chara_data['character_mp'] ) . ", character_mp_max = character_mp_max + 1, character_intelligence = character_intelligence + 1 " ;
    16.   
    17.               $shrine_text = sprintf($lang['shrine_text_magic'], $chara_data['character_mp_max'] + 1, $chara_data['character_intelligence'] + 1  );
    18.   
    19.               break;
    20.   
    21.           case "skills":
    22.               $skill_rand = array ( 'character_skill_mining', ' character_skill_stone', 'character_skill_forge', ' character_skill_enchantment', ' character_skill_trading', 'character_skill_thief' );
    23.               shuffle($skill_rand);
    24.               $sql_query = "SET " . $skill_rand[0] . " = " . $skill_rand[0] . " + 2 ";
    25.   
    26.               $shrine_text = sprintf($lang['shrine_text_skills'], $skill_rand[0], $chara_data[$skill_rand[0]] + 2 );
    27.   
    28.               break;
    29.   
    30.           default:
    31.               $sql_query = "";
    32.               break;
    33.       }
    34.       
    35.       if ( $sql_query != "" )
    36.       {
    37.           $sql = " UPDATE " . ADR_CHARACTERS_TABLE . " " . $sql_query . " WHERE character_id = " . $chara_data['character_id'];
    38.   
    39.             $result = $db->sql_query($sql);
    40.   
    41.           if(!$result)
    42.           {
    43.               message_die(GENERAL_ERROR, 'Could not update shrine data ', "", __LINE__, __FILE__, $sql);
    44.           }
    45.       }
    46.   
    47.       $template->assign_block_vars('shrine_exists', array(
    48.           'L_SHRINE_FOUND' => $lang['shrine_found'],
    49.           'L_SHRINE_TEXT' => $shrine_text,
    50.           'SHRINE_TYPE' => $shrine
    51.       ));
    52.   
    53.   }
    <?php $shrine = ( isset ($_GET['shrine']) ? $_GET['shrine'] : "" ); if ( $shrine != "" ) { // Shrine found switch ( $shrine ) { case "warrior": $sql_query = "SET character_hp = character_hp + " . ( 1 + $chara_data['character_hp_max'] - $chara_data['character_hp'] ) . ", character_hp_max = character_hp_max + 1, character_might = character_might + 1 " ; $shrine_text = sprintf($lang['shrine_text_warrior'], $chara_data['character_hp_max'] + 1, $chara_data['character_might'] + 1 ); break; case "magic": $sql_query = "SET character_mp = character_mp + " . ( 1 + $chara_data['character_mp_max'] - $chara_data['character_mp'] ) . ", character_mp_max = character_mp_max + 1, character_intelligence = character_intelligence + 1 " ; $shrine_text = sprintf($lang['shrine_text_magic'], $chara_data['character_mp_max'] + 1, $chara_data['character_intelligence'] + 1 ); break; case "skills": $skill_rand = array ( 'character_skill_mining', ' character_skill_stone', 'character_skill_forge', ' character_skill_enchantment', ' character_skill_trading', 'character_skill_thief' ); shuffle($skill_rand); $sql_query = "SET " . $skill_rand[0] . " = " . $skill_rand[0] . " + 2 "; $shrine_text = sprintf($lang['shrine_text_skills'], $skill_rand[0], $chara_data[$skill_rand[0]] + 2 ); break; default: $sql_query = ""; break; } if ( $sql_query != "" ) { $sql = " UPDATE " . ADR_CHARACTERS_TABLE . " " . $sql_query . " WHERE character_id = " . $chara_data['character_id']; $result = $db->sql_query($sql); if(!$result) { message_die(GENERAL_ERROR, 'Could not update shrine data ', "", __LINE__, __FILE__, $sql); } } $template->assign_block_vars('shrine_exists', array( 'L_SHRINE_FOUND' => $lang['shrine_found'], 'L_SHRINE_TEXT' => $shrine_text, 'SHRINE_TYPE' => $shrine )); } ?>


    kannst du mir den if_befehl für eine musicbox mal erklären, wo die box keine extra php benötigt, sondern in der "haupt_php" eingebettet ist?

    achja - was bedeutet der eval ausdruck? hab ich noch nie gehört.

    20 kb für ein signaturbild ist zu wenig 8|

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Ark« (16. September 2006, 15:01)

  • MoG

    Administrator

    Beiträge
    806
    Freitag, 15. September 2006, 18:11
    Danke, das Smilie-Problem sollte nun behoben sein ^^

    eval ist eine Funktion aus php, mit der du du einen string so behandelst, als wäre es eine Zeichenkette, Beispiel:

    PHP-Quelltext

    1. <?php
    2. $string = 'RPG';
    3. $name = 'Board';
    4. $str = 'Das ist mein $string, auf dem das $name läuft.';
    5. eval ("\$str = "$str";");
    6. echo $str;
    7. ?>
    <?php $string = 'RPG'; $name = 'Board'; $str = 'Das ist mein $string, auf dem das $name läuft.'; eval ("\$str = "$str";"); echo $str; ?>


    Die Ausgabe wäre:

    Quellcode

    1. Das ist mein $string, auf dem das $name läuft.
    2. Das ist mein Board, auf dem das RPG läuft.
    Das ist mein $string, auf dem das $name läuft. Das ist mein Board, auf dem das RPG läuft.


    Mit eval werden z.B. Variablen nicht ersetzt, sondern die Zeichenkette wird wie in php ausgegeben ^^ Vorteilhaft beim wbb, da datenbankabfragen der templates so einfacher funktionieren


    @Problem:
    Ich habe es oben eigentlich ausführlich erklärt, du hast es scheinbar nicht genau gelesen... wie dem auch sei, ich verstehe das template-system vom phpbb nicht, hab da bisher noch nie reingeschaut...

    Zudem hast du mir einen seltsamen code-schnipsel geschickt, der bringt wenig ^^
    ok, spring nimmt hier die stelle von action ein, allerdings interessiert dass die von dir gequotete date überhaupt nicht, sie bekommt nämlich eine weitere variable shrine
    Just Testing
  • Ark

    Schüler

    Beiträge
    143
    Samstag, 16. September 2006, 15:00
    stimmt shrine und spring sind hier durcheinander - naja habs editiert und wollt damit nur zeigen, wie eine variabel_abfrage in phpBB2 aussieh
    auf dem prinzip schrein und quelle [shrine-spring], also mit dem switch und case basieren ne menge andere elemente meines spiels -> pilze, hieroglyphen und bald auch beerensträucher^^

    nochmal zur musicbox zurück. kannst du mir den code irgendwie zukommen lassen. kannst mir auch ne mail reiben, wenn du den code hier lieber nich reinstellen willst.

    20 kb für ein signaturbild ist zu wenig 8|
  • Hilfe
  • Impressum
  • Nutzungsbestimmungen
  • Mitglieder
  • Galerie
  • Donnerstag, 16. April 2026, 10:03
Forensoftware: Burning Board® 3.1.8, entwickelt von WoltLab® GmbH