[PHP] fopen met query string

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Via de search kwam ik alleen een oud topic van mezelf tegen, zonder antwoord, dus hier mijn vraag.

Ik wil graag via php een bestand inlezen, met eraan vast een query-string om die vervolgens in het aangevraagd bestand te verwerken. Dit alles om een XSL-stylesheet, serverside te kunnen gebruiken.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    function xmlTransform($buffer)
    {
        $xml = new DomDocument('1.0','utf-8');
        $xml->loadXML($buffer);
        
        $xsl = new DomDocument('1.0','utf-8');
        $xsl->load('/xsl/default.php?sNodeId='.$_GET['sNodeId']));
        
        $proc = new XSLTProcessor();

        $proc->importStyleSheet($xsl);
        
        return $proc->transformToXML($xml);
    }

Bovenstaand is eigenlijk de bedoeling. Maar aangezien DomDocument::load() de querystring niet wil accepteren (file not found geeft ie dan), moet ik eerst maar het XSL bestand in zien te lezen met query string. Daarvoor heb ik deze functie "gemaakt":
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    function fReadFile($sUrl)
    {
        $hUrl   = fopen($sUrl, 'r');
        $sReturn = "";

        $sReturn .= fread($hUrl, 8192);
        do 
        {   $sReadData = fread($hUrl, 8192);

            $sReturn .= $sReadData;
        } while(strlen($sReadData) > 0);
        
        fclose ($hUrl);
        
        return $sReturn;
    }

Werkt prima, zolang ik het maar aanroep met een absoluut adres incl domein. Dat wil ik niet, ik wil het domeinonafhankelijk houden dus ipv nu fReadFile('http://www.mijndomein.nl/xsl/default.xsl?sNodeId=test'); zou ik graag fReadFile('/xsl/default.xsl?sNodeId=test'); gebruiken.. of helemaal mooi.. DomDocument::load('/xsl/default.xsl?sNodeId=test');

Volgens mij, weet ik niet zeker, is ook het nadeel dat het script nu de file om in te lezen als een extern bestand ziet en die in gaat lezen van het externe adres http://www.mijndomein.nl/ . Dat kost dus alleen maar onnodig tijd en resource..

Heeft iemand een mooiere oplossing voor dit probleem? Lijkt me dat ik niet de enige ben die hier tegenaan loop.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wanneer je relatieve paden gebruikt, dan vraag je de pagina op via het filesystem, en vraag je dus je code op in plaats van de content van de daadwerkelijke pagina. Wanneer je via je domein gaat, open je je pagina dus via het HTTP protocol, en daarom kun je daarbij wel een querystring gebruiken. De enige oplossing hiervoor is volgens mij iets als dit:
PHP:
1
2
3
4
ob_start();
include('bestand.php?q=blaat&bla=enz');
$ret = ob_get_contents();
ob_end_clear();

Maar ik weet niet helemaal zeker of dat wel werkt. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Nee, lijkt inderdaad helaas niet te werken.

Leuke sig trouwens

edit:
php.net
PHP:
1
2
3
/* Won't work; looks for a file named 'file.php?varone=1&vartwo=2'
 * on the local filesystem. */
include ("file.php?varone=1&vartwo=2");
:'(

mmm, maar in de include kan ik natuurlijk gewoon gebruik maken van global variabelen van het bestand wat het aanvraagd.. misschien dat ik zo wat kan puzzelen..

edit 2:
de methode met de include en output buffering werkt nu wel, door gebruik te maken van de GLOBAL/SESSION vars uit het parentbestand. Nu nog even kijken of het sneller is.

[ Voor 116% gewijzigd door r0bert op 24-10-2005 15:09 ]


Acties:
  • 0 Henk 'm!

  • dajappie
  • Registratie: Januari 2005
  • Laatst online: 13:10
Nogal lastig om PHP via het filesystem te dwingen de variabelen mee te nemen. Via exec() lokaal een php laten draaien en daaraan de variabelen meegeven? Niet echt netjes en vast niet sneller dan via een URL, zit je dus toch vast aan een echt adres, om het afhankelijk te maken misschien gebruik maken van $SERVER_NAME?

@dajappie: te laat, output buffering werkt dus via include...

[ Voor 10% gewijzigd door dajappie op 24-10-2005 15:11 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Ja, moet even kijken of via dat externe adres sneller of langzamer is dan via output buffering.

Heb trouwens ook nog even een ander probleem. Dat doe ik er maar meteen achteraan.

Hier hoort het volgende deel XSL bij:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<xsl:template match="om:data[@nodeid='bedralfabet']">    
    <div>
        <div>
            <h1>
                <xsl:attribute name="onclick">
                        fGotoTarget(event, 'bedralfabet', '');
                </xsl:attribute>
                
                <span>//</span>alfabetische bedrijvenindex              
            </h1>
            <div class="stlReactie">
                selecteer een beginletter
            </div>
            
            <div style="width: 100%; text-align: center; padding-top: 10px; padding-bottom: 10px;">
                <xsl:apply-templates select="om:bedrijvenindex/om:navindex/om:let" />
            </div>
            
            <xsl:apply-templates select="om:bedrijvenindex/om:bedrijven/om:bedrijf" />
        </div>
    </div>
</xsl:template>

In mijn XSL bestand, voer ik dit uit:
PHP:
1
2
3
4
5
6
    if (file_exists('./xsl/'.$_GET['sNodeId'].'.xsl'))
    {
        echo '';
        include('./xsl/'.$_GET['sNodeId'].'.xsl');
        echo '';
    }

Nu krijg ik een foutmelding
code:
1
XML-ontleedfout: geen element gevonden Lokatie: http://www.mijndomein.nl/bedralfabet/ Regelnummer 2, kolom 1:

Terwijl dit wel werkt:
PHP:
1
2
3
4
5
6
    if (file_exists('./xsl/'.$_GET['sNodeId'].'.xsl'))
    {
        echo '<xsl:template match="om:data[@nodeid=\'bedralfabet\']">';
        include('./xsl/'.$_GET['sNodeId'].'.xsl');
        echo '</xsl:template>';
    }

Wanneer ik geechode regels uit mijn xsl-file haal.

Waar kan dat nou weer aan liggen? :S

[ Voor 16% gewijzigd door r0bert op 24-10-2005 15:26 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
blabla over include :P

edit: mmz had het net weggehaald

[ Voor 171% gewijzigd door r0bert op 24-10-2005 15:45 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Niet als je voor die include niets echot, en die output buffering consequent gebruikt. :)
Ow, je hebt het over de include van je tweede vraag. :P

[ Voor 27% gewijzigd door NMe op 24-10-2005 15:44 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Ja, maar ik denk dat de fout hem toch ergens in de xml/xsl zal zitten, aangezien als ik de include verander in een file_get_contents ik dezelfde error krijg. En ik kan de XSL wel normaal laden, zonder transformatie.

Maar even de bron bestanden:
voorbeeld xml: http://www.onlinemeppel.nl/xml.xml
voorbeeld xsl: http://www.onlinemeppel.nl/xsl.xsl (staat normaal als /xsl/default.php)

huidig resultaat:
http://www.onlinemeppel.nl/bedralfabet/ (ff?)

[ Voor 95% gewijzigd door r0bert op 24-10-2005 16:16 ]


Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Zet de XSL in een string, parse daarin de variabelen, en load de stylesheet niet met load() maar met loadxml(). Dan zijn je parameters geparst, en kan je de stylesheet gewoon als string gebruiken.

Kan dat echt niet, dan zal je het uit moeten voeren op de shell, de output daarvan afvangen, die in een string proppen en uiteindelijk die voeren aan loadXML();

Een andere manier is er echt niet behalve een betere xsl te bedenken.

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Probleem is dat de XSL te groot wordt, dus ik zal wel dingen op moeten splitsen. Zo'n gigantisch stylesheet in een String zetten, spreekt me ook totaal niet aan, dus puzzel ik nog even verder. Het kan in ieder geval dmv output buffering icm met een php-include en dan de waarde van een global var in een xsl:include

En een betere XSL zou ik niet weten eigenlijk. Tips daarover zijn heeeel erg welkom. Ik zat met het probleem dat ik de xsl:include niet dynamisch kon maken. Er is 1 hoofdstylesheet van de XSL en daarbij moeten templates uit afzonderlijke XSL bestanden worden ingevoegd.

//edit:

de temp. oplossing die ik gebruik. Liever natuurlijk netter maar het is niet anders.
php:
PHP:
1
2
3
4
5
            ob_start(); 
            include('./xsl/default.php'); 
            $ret = ob_get_contents(); 
            ob_end_clean(); 
            return $ret;

php in xsl:
XML:
1
2
3
4
<?php
    if (file_exists('./xsl/'.$_GET['sNodeId'].'.xsl'))
        echo '<xsl:include href="./xsl/'.$_GET['sNodeId'].'.xsl" />';
?>

wel even als directe child van transform/stylesheet implenteren.. en in de XSL bestand ook gewoon een <?xml en een <xsl:stylesheet element.. werkt wel, mja of het netjes is 8)7

//e: lijkt zelfs nog aardig vlot te gaan ook

[ Voor 75% gewijzigd door r0bert op 24-10-2005 16:54 ]

Pagina: 1