Avatar billede JacoDK Nybegynder
13. februar 2014 - 09:18 Der er 20 kommentarer og
1 løsning

Hen include i function, ob_start

Hej Eksperter,

Jeg sidder med en kode, hvor der er nogle shortcodes, som gennemløbes i en tekst. Problemet ligger i at den skal inkludere en fil ved [file=FIL-NAVN]. Mit script kan dog ikke se at filen eksistere, og dermed ikke returner denne i teksten :(

Jeg håber i kan hjælpe.

Koden er som følge:
        /*
            *
            * ShortCode Tags and Functions
            *
        */
        private function shortCodeInclude($FILE)
            {
                $FILE = dirname( __FILE__ ).'/'.$FILE;
                   
                    if ( file_exists( $FILE ) )
                    {
                        ob_start();
                        include($FILE);
                        return ob_get_clean();
                    }
                    else
                    {
                        return 'Filen ('.$FILE.') findes ikke!';
                    }
                }
        public function do_shortcode_tag($value /* PERMALINK */)
            {
                global $frontend, $option;
                /* Shortcode functions */
                /*
                    * Shortcode
                */
                $shortCode = array(
                                                        '/\[file=(.+?)\]/',
                                                        '/{%sitename%}/',
                                                        '/{%title%}/'
                                                    );
                /*
                    * Replacement
                */
                $replaCode = array(
                                                        $this->shortCodeInclude( '\1' ),
                                                        $option['Front$Sitename'],
                                                        $frontend['title']
                                                    );
                $output = preg_replace($shortCode, $replaCode, $value);
                return $output;
            }
Avatar billede JacoDK Nybegynder
13. februar 2014 - 09:24 #1
Fejlkoden er, hvis jeg siger !file_exist
Warning: include(/home/www/XXXX.dk/c0ntact_el.php): failed to open stream: No such file or directory in /home/www/XXXX.dk/coree.php on line 209 Warning: include(): Failed opening '/home/XXXX/sortel.dk/c0ntact_el.php' for inclusion (include_path='.:/php/includes:/usr/share/php') in /home/www/XXXX.dk/coree.php on line 209
Avatar billede jakobdo Ekspert
13. februar 2014 - 09:40 #2
Kunne det ikke netop tyde på, at filen ikke findes ?
At filen ikke findes i det korrekte bibliotek ?
Eller at der er nogle rettigheder der ikke stemmer overens ?
Avatar billede JacoDK Nybegynder
13. februar 2014 - 09:43 #3
Hej Jakobdo,

Filen eksistere, og jeg kan tilgå den via HTTP og få outputtet fra den.

FIlen indholder pt.
<?php /* START */

    echo "<h2>Kontakt</h2>";
    echo $_SERVER['DOCUMENT_ROOT'].'c0ntact_el.php<br>';
    var_dump( file_exists( $_SERVER['DOCUMENT_ROOT'].'c0ntact_el.php') );
/* END */ ?>


og den outputter

Kontakt

/home/www/XXXX.dk/c0ntact_el.php
bool(true)
Avatar billede jakobdo Ekspert
13. februar 2014 - 09:47 #4
Nu har jeg lidt svært ved at gennemskue hele dit setup.
Men du forsøger at lave noget "shortcode" ala:

[file=FILENAME] og så skal den tage indholdet af den fil, er det korrekt forstået?

Hvis ja, så må det jo evt. være dine "path's" som fejler.
Prøv at debug lidt på dine stier og se om ikke din shortcode arbejder i forkert bibliotek.
Avatar billede JacoDK Nybegynder
13. februar 2014 - 10:02 #5
Ja, den skal snuppe indholdet i filen.

Min side er hosted hos Gigahost, og stierne er ens for både filen og for "shortcode" :( - kan sgu ikke finde fejlen :(
Avatar billede jakobdo Ekspert
13. februar 2014 - 10:27 #6
prøv i denne kode:

$FILE = dirname( __FILE__ ).'/'.$FILE;

At print $FILE
Prøv at print dirname(__FILE__);
Er det korrekte stier ?
Avatar billede JacoDK Nybegynder
13. februar 2014 - 10:37 #7
Tak for din tålmodighed. Det fungere stadigvæk ikke :( og stierne er de samme.

Filen (/home/www/XXX.dk/c0ntact_el.php) findes ikke! -> Dirname = /home/www/XXX.dk


Så filen er her: /home/www/XXX.dk/c0ntact_el.php
og dirname er: /home/www/XXX.dk
Avatar billede JacoDK Nybegynder
13. februar 2014 - 19:41 #8
Jeg har fundet fejlen, men ved ikke rigtig hvordan jeg løser den :(

Hvis jeg skriver include i php filen sådan her $FILE = $_SERVER['DOCUMENT_ROOT'].'c0ntact_el.php'; så henter den automatisk filen. Men hvis den får filnavnet fra MYSQL databasen, hvor den matcher [file=c0ntact_el.php] kan den ikke finde filen.

Hvad kan fejlen være?
Avatar billede jakobdo Ekspert
13. februar 2014 - 19:47 #9
Det kan ikke passe...
Om filnavnet kommer fra mysql, textfil, php eller noget fjerde, så bør include stadig virke.
Så længe path, filnavn osv stemmer overens.
Avatar billede JacoDK Nybegynder
13. februar 2014 - 19:57 #10
Kan heller ikke se logikken i det, men ikke desto mindre.

Hvis include skrives direkte i den ønskede fil, så bliver en inkluderet.

Kommer include fra MYSQL databasen via en preg_replace regex, så kan den ikke finde filen.

Både teksten direkte i filen og MYSQL er fuldstændig ens, men har dog til forskel at den ene virker, og den anden gør ikke.

Er simpelhen helt blank på det her.
Avatar billede JacoDK Nybegynder
13. februar 2014 - 20:08 #11
Er kommet videre igen, hvis jeg laver en:

print_r( pathinfo($FILE) )

får jeg følgende output

Array ( [dirname] => /home/www/XXX.dk [basename] => \1 [filename] => \1 )


men får jeg den ud som en echo $FILE

får jeg

/home/www/XXX.dk/kontakt.php
Avatar billede jakobdo Ekspert
13. februar 2014 - 20:21 #12
Hvis din: print_r( pathinfo($FILE) )
Giver: Array ( [dirname] => /home/www/XXX.dk [basename] => \1 [filename] => \1 )
Er der jo tydeligvis noget galt...
Det lugter af din preg_replace ikke er lavet, når du laver din "include"
Avatar billede JacoDK Nybegynder
13. februar 2014 - 20:25 #13
Ja, det tyder det desværre på :(

Har du en ide til hvordan dette kan fikses?

Du må gerne smide et svar, så du kan få point :)
Avatar billede jakobdo Ekspert
13. februar 2014 - 20:45 #14
Jeg er stadig lidt lost på hvad du forsøger at opnå.

Men hvis vi er ude i noget:

Bruger taster data:

Hej jeg er en fil: [file=noget.php]

Dette gemmes i en mysql.
Herefter skal dette data så vises et sted.

Hvor der sker følgende:

Data hentes ud af mysql.
[file=noget.php] oversættes til:

include('noget.php');
osv. ?
Avatar billede JacoDK Nybegynder
14. februar 2014 - 07:35 #15
Undskyld jeg ikke har fået det forklaret godt nok,

Formålet er som du skriver, at når en bruger skriver [file=noget.php], så bliver det gemt i databasen, hvorefter det det kan tilgå via en side. Denne side henter derefter den gemte tekst i databasen, og kigger efter [file=noget.php], og henter indholdet fra filen ved hjælp af include('noget.php');


Dette skal bruges i et CMS system, hvor f.eks. kontakt siden indeholder en tekst på en formular. Derfor vil databasen indeholde teksten "Kontakt .... blabla bla [file=kontaktform.php]"

Dette vil så blive vist ved http://www.noget.dk/kontakt, hvor indeholdet vil være Kontakt .... blabla bla + kontaktformen, som er i kontaktform.php.

Jeg håber dette giver et bedre overblik over hvad tanken er bag dette script.
Avatar billede jakobdo Ekspert
14. februar 2014 - 09:50 #16
Jeg har leget lidt:

<?php

$text = "Hej, jeg er noget og nu kommer der en fil: [file=file.php] og nu er jeg væk igen";

$pattern = '/\[file=(.+?)\]/';

$output = preg_replace_callback(
        $pattern,
        function ($matches) {
          return require_once($matches[1]);
        },
        $text
    );

echo $output;

?>

<?php
echo "Jeg er FILE";
?>

Smid disse filer i samme dir.

Dog printer den "indholdet" af "file" ude af "context".
Så der driller den med at få teksten indsat i stedet for [file=file.php] men den includer dog filen...
Avatar billede JacoDK Nybegynder
20. februar 2014 - 18:16 #17
Hej jakobdo,

Nu har jeg fundet en løsning :D

        private function shortCodeInclude( $FILE )
            {
                    if ( file_exists($FILE = dirname(__FILE__).'/'.$FILE) )
                    {
                            ob_start();
                            include( $FILE );
                            return ob_get_clean();
                    }
                    else
                    {
                            return 'Filen ('.$FILE.') findes ikke!';
                    }
                }
        public function do_shortcode_tag($value /* PERMALINK */)
            {
                global $frontend, $option;
                /*
                    * Shortcode
                */
                $shortCode = array(
                                                        "/{file=(.*?)}/ime",
                                                        "/{%sitename%}/",
                                                        "/{%title%}/"
                                                    );
                /*
                    * Replacement
                */
                $replaCode = array(
                                                        "\$this->shortCodeInclude('\\1')",
                                                        $option['Front$Sitename'],
                                                        $frontend['title']
                                                    );
                $value = preg_replace($shortCode, $replaCode, $value);
                return $value;
            }

Forklaringen har jeg ikke, men løsningen kom ud fra denne side http://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html
Avatar billede jakobdo Ekspert
20. februar 2014 - 20:30 #18
ob_FUNKTIONER gjorde også tricket hos mig:

<?php

$text = "Hej, jeg er noget og nu kommer der en fil: [file=file.php] og nu er jeg væk igen";

$pattern = '/\[file=(.+?)\]/';

$output = preg_replace_callback(
        $pattern,
        function ($matches) {
          ob_start();
          require_once($matches[1]);
          return ob_get_clean();
        },
        $text
    );

echo $output;

?>

Så virkede det også efter hensigten. :o)
Avatar billede JacoDK Nybegynder
20. februar 2014 - 21:26 #19
Du skal have tusind tak for hjælpen :)

- Kan jeg få dig til at smide et svar, så vi kan lukke dette indlæg :)
Avatar billede jakobdo Ekspert
20. februar 2014 - 22:32 #20
Svar!
Avatar billede jakobdo Ekspert
21. februar 2014 - 08:34 #21
Takker for point
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester