Avatar billede Morten Professor
20. oktober 2021 - 14:19 Der er 18 kommentarer

[$variable] men skal se sådan ud som en string ['toppe']

Hej

Jeg har et problem med at få en feks.

her virker det da der hardcodet feks 'tag'
$query_string = [
            'tag'  => ['tag'],
            'kn'    => ['koen'],
            'varer_kategori' => ['productType']
        ];

men skal se sådan ud når jeg prøver at hente variablerne ind.
$query_string = [
            'tag'  => [$tag],
            'kn'    => [$koen],
            'varer_kategori' => [$productType]
        ];

Håber det giver mening.
Jeg er simpelhen nød til at kunne få det til at se sådan ud ['tag'] selvom det er en variable.

Med venlig hilsen
Morten
Avatar billede arne_v Ekspert
20. oktober 2021 - 15:01 #1
Men virker det ikke som du skriver det?

<?php
$tag = 'some tag';
$koen = 'some koen';
$productType = 'spme product type';
$query_string = [
        'tag'  => [$tag],
        'kn'    => [$koen],
        'varer_kategori' => [$productType]
];
print_r($query_string);
?>
Avatar billede bvirk Guru
20. oktober 2021 - 15:03 #2
Array $query_string bliver oprettet med de værdier som variabler har - der bliver ikke gemt en reference til variablerne som kan 'hentes'
$tag="before";
$query_string = [
    'tag'  => [$tag]
];
var_dump($query_string['tag']);
$tag="after";
var_dump($query_string['tag']);
$query_string = [
    'tag'  => [$tag]
];
var_dump($query_string['tag']);

Men jeg forstår godt hvad du vil og det kan sikkert sagtens laves. Måske noget at $query_string hentes fra en function der har adgang til $tag mm.
Avatar billede bvirk Guru
20. oktober 2021 - 15:28 #3
f.eks i en funktion run()

class ... {
    private $tag;
    function queryString() {
        return ['tag' => [$this->tag]];
    }
    function run($args) {
          $this->tag="before";
        var_dump($this->queryString());
        $this->tag="after";
        var_dump($this->queryString());
    }
}
Avatar billede Morten Professor
20. oktober 2021 - 15:32 #4
Det skal prøves af fedt. Tak for i vil hjælpe mig
Avatar billede arne_v Ekspert
20. oktober 2021 - 15:36 #5
En funktion er nok den rigtige måde at gøre det på.

Hvis man vil fuske så:

<?php
$tag="before";
$query_string = [
        'tag'  => ['tag']
];
echo ${$query_string['tag'][0]} . "\r\n";
$tag="after";
echo ${$query_string['tag'][0]} . "\r\n";
?>
Avatar billede Morten Professor
20. oktober 2021 - 16:36 #6
Måske spørger jeg dumt men hvorfor bruger man var_dump i funktionen er ikke helt skarp så derfor spørger jeg :-)
Avatar billede arne_v Ekspert
20. oktober 2021 - 17:08 #7
print_r, var_dump og echo er bare for at teste at koden virker - din endelige kode skal næppe udskrive den info til slutbrugerne
Avatar billede bvirk Guru
20. oktober 2021 - 17:09 #8
Det er bare for at kigge - den fase i udviklingen hvor man undersøger hvad der sker. En streng kan ligeså godt bare udskrives med echo, men hvis man vil se mere sammensatte ting er echo ikke så god som f.eks var_dump.
Jeg bruger sjældent selv var_dump - 8 bogstaver har jeg erstattet med et i:
function p(...$ma) {
    foreach($ma as $m) {
        echo ($m === false ? "false\n" : ($m === true ? "true\n" : ($m === null ? "null\n" :
            ( is_array($m) ? var_export($m,true)."\n" : $m."\n"))));
    }
}

... men det kan jeg jo ikke være underforstået i et foras var - det kan man med var_dump idet:
https://www.php.net/manual/en/function.var-dump.php
Avatar billede Morten Professor
20. oktober 2021 - 18:48 #9
Det er super skulle lige være sikker på jeg om jeg skulle brug det for det ville komme til at virke.
Bruger også rigtig meget print_r og var_dump til at se om der er noget array og så hvordan opbygning er af informationer. Og hvad jeg skal skrive for at trække den rigtig information ud.

Glæder til at gå igang skal jeg her til aften :-)
Avatar billede Morten Professor
21. oktober 2021 - 00:20 #10
Hej

Så har jeg været igang.
Nu kan den hente fra class hvis det står statisk private variables
class url_function {
        private $tag;
        private $koen;
        private $productType;

Jeg kan hente sådan nu
te $tag = 'teen';
        private $koen = 'm';
        private $productType = 't-shirts';





        function queryString() {
            return ['tag' => [$this->tag],
                'kn'    => [$this->koen],
                'varer_kategori' => [$this->productType],
                ];
        }
        function run($args) {
            /** Danmark */
            $umame_url = $_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];
            $arr = explode('/', $umame_url);
            $tag = implode('', array_slice($arr, 3, 1));
            $koen = implode('', array_slice($arr, 4, 1));
            $productType = implode('', array_slice($arr, 5, 1));

        }
    }

    if ( 'render' === $action && empty( $query_string ) ) {

            $urLfunction = new url_function;

            $query_string =
                $urLfunction->queryString();


    }

    return $query_string;

Det jeg har problemer med er at få de variabler til at virke det er som om den ikke vil acceptere variablerne med expressions.

Kan det være min variable med implode den ikke kan finde ud af...

De ligger bare der så i kan se det.
Har prøvet med __construct og så lave det sådan:

public function __construct {
$umame_url = $_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];
            $arr = explode('/', $umame_url);
            $this->tag = implode('', array_slice($arr, 3, 1));
            $this->koen = implode('', array_slice($arr, 4, 1));
            $this->productType = implode('', array_slice($arr, 5, 1));
}
Men det virkede heller ikke som det skulle så kan den ikke finde ud af det.

Håber det giver mening

Med venlig hilsen
Morten
Avatar billede arne_v Ekspert
21. oktober 2021 - 03:54 #11
Kan du beskrive hvad den kode skal gøre?
Avatar billede Morten Professor
21. oktober 2021 - 06:20 #12
Jeps undskyld jeg ikke har fået skrevet det :-)

Det er til et filtersystem i wordpress som har nogle functioner så man har mulighed for at lave ændringer, i at hvad den skal prevælge.

Jeg bruger $umame_url = $_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];
            $arr = explode('/', $umame_url);
            $this->tag = implode('', array_slice($arr, 3, 1));
            $this->koen = implode('', array_slice($arr, 4, 1));
            $this->productType = implode('', array_slice($arr, 5, 1));
Til at splitte url op så jeg har mulighed for at lave permalink, og bruge det permalink til at filtere på forhånd når brugeren trykker på det link.
Så deler den kan dele alle / op så den kan hente i permalinket som feks. site.dk/shop/teen/f/toppe
Den del virker. men filteret har brug for at vide hvad den søger i koden så der bliver prevalgt og det kunne den med:

        private $tag = 'teen';
        private $koen = 'm';
        private $productType = 't-shirts';

        function queryString() {
            return ['tag' => [$this->tag],
                      'kn'    => [$this->koen],
                      'varer_kategori' => [$this->productType],
                ];
        }
if ( 'render' === $action && empty( $query_string ) ) {

            $urLfunction = new url_function;

            $query_string =
                $urLfunction->queryString();
    }

    return $query_string;

Den statiske måde virker men det er dur ikke når vi har så mange kategorier, filteret har mulighed for at filtere på det plan, men det på nuværende tidspunkt kan jeg ikke at lave det mere dynamisk. og det er det jeg forsøger på.
Måske er der en bedre måde at gøre det på i for virker bedre.

i forhold til at hente filter tekst ned.
Avatar billede bvirk Guru
21. oktober 2021 - 13:49 #13
Hej Morten

Jeg kan ikke helt følge konsepterne - kender heller ikke til wordpress

Når jeg ser ikke gyldig php kode slår tanken mig: Kan du se errors, warning og notices.

Det kan du sikkert - du har jo postet flere omfattende php spørgsmål.

Men alligevel:
ved fjernelse af udkommentering i følgende php 7.3 skal de udløses.

<?php
header("Content-Type: text/plain;charset=UTF-8");
    // warning
    //include ("notExistingFile");
   
    // notice
    //echo $dontexistingvar;
   
    // parse error
    // echo echo
   
    // Fatal error
    //funktion();
   
   
    $retLines=[];
    $retval=0;

    echo "Content of file: ".php_ini_loaded_file()."\n\n";
    exec("cat ".php_ini_loaded_file(),$retLines,$retval);
    foreach ($retLines as $retLine)
        echo $retLine . "\n";
    echo $retval . "\n";
?>
Avatar billede Morten Professor
21. oktober 2021 - 15:27 #14
Ja har en del spørgsmål men nyder virkelig også at problem løse. Og kode i php :-) Men når jeg kommer til kort spørger jeg her.

Jeg ser ikke nogen fejl men kan altid slå debug til ser bare ikke noget. Jeg vil i hvert fald prøve det du har skrevet. Se om det kan komme nogle errors som jeg kan bruge til noget.

Det jeg koder er i et filter plugin hvor man har mulighed for at redigere lidt fra sin function fil i sin tema. Og det jeg finder på den side jeg har pluginet fra giver nogle udviklings muligheder.
Det er gridbuilder plugin. Følger de eksempler de giver. Og så tager jeg den derfra og bygger videre.
Dog forstår jeg ikke hvorfor en variable ikke kan bruges i den forbindelse med filteret.
Er det noget  mit kald i url eller er det implode eller array_slice den ikke acceptere. For når jeg skriver det direkte virker det men desværre er det for omfattende at lave if og elseif på alle filter.
Håber det giver mere mening og vil lige se om jeg kan finde nogle fejl frem.

Tak for du hænger ved med hjælpen
Avatar billede bvirk Guru
21. oktober 2021 - 17:37 #15
Er det på lokal server eller hostet det kører?
Avatar billede Morten Professor
22. oktober 2021 - 06:11 #16
Undskyld sent svar det er på en online server som jeg selv køre hjemme. du må meget gerne få en adgang. jeg sender lige info i privatbesked. kan du ssh console en ubuntu server?
For kan bare kopiere stien direkte til filen.
Ellers laver jeg bare adgang til dig på ftp.
Avatar billede bvirk Guru
22. oktober 2021 - 18:29 #17
Grunden til jeg spurgte var at jeg har en tilføjelse til #13 som afhænger af om man har adgang til php.ini

Jeg har følgende indstillinger i php.ini vedr. fejl meddelelser

display_errors = On
display_startup_errors = On
error_reporting = E_ALL
html_errors = On
log_errors = On

I Ubuntu /etc/php/<php version>/apache2/php.ini


Har man ikke mulighed for at ændre i php.ini antyder følgende at det kan gøres i php scriptet

https://www.php.net/manual/en/function.ini-set.php

Jeg vil afstår fra at redigere den Morten, da det jo er en lille ting du selv kan, og fordi jeg ikke vil gå ind i andre ting. 'sudo systemctl restart apache2' derefter.
Mvh Benny
Avatar billede Morten Professor
22. oktober 2021 - 19:31 #18
Hej Benny

Fedt det vil jeg gøre takker :-)
Det kan være den kan vise mig noget mere.

Med venlig hilsen
Morten
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

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