php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 01-01-2008, 18:10
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard Übergabe Problem

Hallo zusammen..

Ich habe mal bisschen OOP gelern und meiner 1. kleiner Parser geschrieben. Beim Testen hab ich jedoch ein Fehler Festgestellt.

Wie ihr hier sehen könnt:
http://andys-tools.ch/cms/admin/index.php?page=12
-> Der Error wird nach dem Header und vor dem body ausgegeben, wie ihr dem Quellcode entnehmen könnt.

Ich habe sehr lange gesucht woran das es liegt, biss ich jetzt eignedlich weiss was genau passiert aber nicht wiso, darum konnte ich den fehler aucxh noch nicht beheben.

PHP-Code:
class Parser
{
// ...
// Platzhalter zufügen
function add($ph$es)
{
// Platzhalten zufügen
$this->arr[$ph] = $es;
}
// ...
// Content Parsen
    
function tpl($tpl)
    {
        
// tpl holen
        
$tpl file_get_contents($tpl);
        
        
// prüfen ob normales add oder add_array
        
if(count($this->arr) > 0) {
        
// add -> arr
        
            // Platzhalter ersetzen
            
foreach ($this->arr as $ph => $es)
            {
                
// Platzhalter ersetzen
                
$tpl str_replace('{'.$ph.'}'$es$tpl);
                
            }
        
        } elseif(
count($this->while) > 0) {
        
// add_array -> while
            
            // inhalt zwischen {while} und {/while} suchen
            
$dat split('{while}'$tpl); 
            
$dat split('{/while}'$dat[1]); 
            
$dat[0] = $tpl;
            
            
            
// Platzhalter ersetzen
            
foreach ($this->while as $ph => $es)
            {
                
// Platzhalter ersetzen
                
$tpl str_replace('{'.$ph.'}'$es$tpl);
                
            }
        } else {
            
// Platzhalter ersetzen
            
foreach ($this->arr as $ph => $es)
            {
                
// Platzhalter ersetzen
                
$tpl str_replace('{'.$ph.'}'$es$tpl);
                
            }
        }
//..
// Content Template
    
function getContent()
    {
        return 
$this->content;
    }

Das sind eigendlich die drei funktionen die ich verwende.

Auf der Index.php parse ich nun das Hauptdesign.
da wird ist ein include, der die jeweilige seite includiert, je nach $_GET übergabe.
Jede dieser Seite ist ca. folgend aufgebaut:
PHP-Code:
// ...
$Pars->add('platzhalter1'$ph1);
$Pars->add('platzhalter2'$ph2);
$Pars->tpl('template.tpl')
//.. 
Der Fehler entsteht nun in der index.php
PHP-Code:
//prüfen ob $_get[page] übergeben wurde
    
if(isset($_GET['page'])) {
        include(
'page.php');
        
$Pars->add('content'$Pars->getContent());
        
$Pars->setTitel('Admin Panel :: Startseite');
    } else {
        
// content Startseite
        
$Pars->add('content''Admin Panel Startseite');
        
$Pars->setTitel('Admin Panel :: Startseite');
    }
    
$Pars->tpl('../templates/admin/index_body.tpl'); 
Jetzt wird der Content das erste mal direkt beim include der page.php ausgegeben, das 2. mal am richtigen ort: $Pars->add('content', $Pars->getContent());


Frage:
Wiso wird der Content schon beim include ausgegeben, wenn ich gar nirgens (ob klasse oder code) ein echo oder ein print hab?
Mit Zitat antworten
  #2 (permalink)  
Alt 01-01-2008, 18:38
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard Re: Übergabe Problem

So macht es irgendwie mehr Sinn, meinst du nicht?
PHP-Code:
// Auszug aus Parser::tpl()
foreach ($this->arr as $ph => $es) {
    if (
is_array($es)) {
        foreach (
$es as $ph => $value) {
            
$tpl str_replace('{'.$ph.'}'$value$tpl);
        }
    } else {
        
$tpl str_replace('{'.$ph.'}'$es$tpl);
    }

Allerdings würde ich in Parser::add_array() dafür sorgen, dass Parser::arr flach ist, d.h. ich würde es z.B. so implementieren:
PHP-Code:
function add_array($arr) {
    
$this->arr array_merge($this->arr$arr);

Parser::tpl() sähe dann so aus:
PHP-Code:
foreach ($this->arr as $ph => $es) {
    
$tpl str_replace('{'.$ph.'}'$es$tpl);

Der Ansatz für while-Schleifen sieht leider so aus, als könne man nur eine einzige pro Template haben. Ist das korrekt? Ist das gewollt?


BTW: Kennst du Smarty?

Geändert von onemorenerd (01-01-2008 um 18:42 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 01-01-2008, 18:55
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Erstmal danke für deine Antwort.

Allerdings fehler mir irgendwie die kenntnisse um bei deinem Versuch draus zu kommen, und wenn ich das richtig verstanden habe, wurde meine frage nicht beantwortet.

Ich Programmiere halt noch wie ein Anfänger, da ich es so einfach verstehe.

Nein, Smarty kenn ich ned. Ich glaube aber es ist ne Opensource Klasse für nen Parser. Allerdings möchte ich selber einen schreiben, ist einfahc nicht das gleiche.
Mit Zitat antworten
  #4 (permalink)  
Alt 01-01-2008, 20:17
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Du solltest zunächst deine Klasse ein wenig aufräumen.
PHP-Code:
class Parser {
    function 
getContent() {
        return 
$this->content;
    }

    function 
tpl($tpl) {
        
$this->content str_replace(
            
array_keys($this->arr), $this->arrfile_get_contents($tpl));
    }

    function 
add_array($arr) {
        
$this->arr array_merge($this->arr$arr);
    }

    function 
add($ph$es) {
        
$this->arr[$ph] = $es;
    }

Den While-Kram habe ich weggelassen, weil der total kaputt ist.
Fehlebehandlung mußt du selbst einbauen. Dieses minimale Beispiel, soll nur zeigen, wie einfach Parser::tpl() aussehen kann, wenn man Parser::arr eindimensional hält.

Deine Frage kann man übrigens kaum beantworten, ohne deine .tpl-Dateien zu kennen. Ich vermute einfach mal: Parser::getContent() wird mehrmals aufgerufen.
Mit Zitat antworten
  #5 (permalink)  
Alt 02-01-2008, 10:45
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke.

Ich hab jetzt deine Version mal gemacht, abe rnoch etwas ausgebaut. Jedohc kommt bei mir ein Fehler und zwar hier:
PHP-Code:
$this->content str_replace(array_keys($this->arr), $this->arrfile_get_contents($tpl)); 
Da kommt immer der Fehler:
Code:
Notice: Array to string conversion in ...
Ich habs dan mal folgendermassen versucht:
PHP-Code:
$this->content str_replace(array_keys($this->arr), array_values($this->arr), file_get_contents($tpl)); 
Sollte man denn da nicht noch ein foreach schleife machen? Die funktion array_keys erziehlt doch lange nicht dasselbe?
Mit Zitat antworten
  #6 (permalink)  
Alt 02-01-2008, 10:54
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Foreach brauchst du nicht. array_keys($this->arr) liefert alle Schlüssel (ph's) als Array. Wenn deine PHP-Version mindestens 4.0.5 ist, kann str_replace() damit umgehen. Prüfe das mal!

Geändert von onemorenerd (02-01-2008 um 10:57 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 02-01-2008, 11:08
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Also die PHP Version auf meinem Host ist 5.2.0.
ich hab mal ein kleines Test-Skript gemacht:
PHP-Code:
<?php
$arr 
= array();
$arr['x'] = 'xyz';
$arr['a'] = 'abc';

echo 
str_replace('{'.array_keys($arr).'}'$arr'skdafjkasfjkl-->{x}<--aslfasdhasihdasi-->{a}<--asfhdll');
?>
Aber auch da kommt folgender fehler:
Code:
Notice: PHPDocument2 line 6 - Array to string conversion
Mit Zitat antworten
  #8 (permalink)  
Alt 02-01-2008, 13:01
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Na ist doch klar: array_keys() gibt ein Array zurück, das PHP in einen String umwandeln muß, weil du es wie einen String behandelst, nämlich konkatenierst.

PHP-Code:
// Notice: Array to string conversion ...
str_replace('{'.array_keys(...).'}', ...);

// so funktioniert es
str_replace(array_keys(...), ...); 
Mit Zitat antworten
  #9 (permalink)  
Alt 02-01-2008, 14:21
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard Ausgabe verhindern

Ok..
Ich hab die Klasse nochmals bisschen umgeschrieben


Alles was ich jetzt bräuchte die Funktion die folgendes macht:
Wenn ich eine datei includen will in der ein echo steht, aber ich will nicht das dieses echo ausgeführt wird! Ein kolleg meinte, dass es eine solche Funktion gäbe.
Ich hoffe jemand kennt diese Funktion
Mit Zitat antworten
  #10 (permalink)  
Alt 02-01-2008, 14:26
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Du meinst Ausgabesteuerung?
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #11 (permalink)  
Alt 02-01-2008, 14:27
Sandmann1
 Newbie
Links : Onlinestatus : Sandmann1 ist offline
Registriert seit: Nov 2007
Beiträge: 32
Sandmann1 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Ich Programmiere halt noch wie ein Anfänger
So schreibst du auch. -)
Mit Zitat antworten
  #12 (permalink)  
Alt 02-01-2008, 19:10
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@tontechnicker: Danke, die meinte ich wohl

@Sandman: Ja, ich weiss das in diesem Forum die Anfänger "Herzlich willkommen sind" -.-

Leider bringen mir die Output funktionen auch nichts, da der Falsch geparste Content wirklich durch das getTpl() durchgeht..
Mit Zitat antworten
  #13 (permalink)  
Alt 02-01-2008, 19:42
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von andygyr
Leider bringen mir die Output funktionen auch nichts, da der Falsch geparste Content wirklich durch das getTpl() durchgeht..
Äh, wie meinen der Herr?
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:41 Uhr.