Próbuję stworzyć stronę internetową, która w zasadzie będzie miała wiele przycisków, które będą uruchamiać określony plik PHP po kliknięciu i wyświetlać wyniki w pustym polu na tym samym ekranie. Te pliki PHP znajdują się w katalogu test_scripts w tym samym katalogu co index.php.

Pomyślałem, że oczywistym krokiem będzie utworzenie pętli, która będzie iterować po tych plikach i dynamicznie tworzyć ich interfejs użytkownika. Więc napisałem następujący kod PHP w środku index.php

#Index.php
...
 <?php
    $dir_itr = new DirectoryIterator("test_scripts");
    foreach ($dir_itr as $file) {
        if ($file->isFile()) {

            $filename = $file->getFilename();
            $formattedFileName =
                '<button
                     class="box button is-large is-fullwidth is-primary is-light"
                     onclick="loadScriptFileData($filename)">
                               $filename
                 </button>';
            print $formattedFileName;
        }
    }
?>
...

loadScriptFileData() to funkcja JavaScript zapisana w tagu skryptu obecnym w nagłówku:

<!--index.php-->

<script>
    function loadScriptFileData(filename) {
        alert(filename);
    }
</script>

Pętla for each działa poprawnie, ale funkcja JavaScript i wygenerowany kod HTML nie działają poprawnie. Na stronie znajduje się oczekiwana liczba przycisków, ale każdy przycisk ma tylko nazwę jako słowo "$filename", a nie rzeczywistą oczekiwaną nazwę pliku. Gorzej sprawa wygląda z JavaScriptem, który od razu nie działa i podaje błąd w konsoli jako Uncaught ReferenceError: $filename is not defined at HTMLButtonElement.onclick ((index):71)

Dlaczego zmienna $ nie jest konwertowana na łańcuch? Próbowałem nawet funkcji toString (), ale nadal nic nie dało. Czy robię to źle?

1
ansh sachdeva 1 kwiecień 2020, 18:49

3 odpowiedzi

Najlepsza odpowiedź

Zmienne nie są analizowane / interpretowane w przypadku używania apostrofów.

Zastąpić

$formattedFileName= '<button 
  class="box button is-large is-fullwidth is-primary is-light" 
  onclick="loadScriptFileData($filename)">$filename</button>';

Z

$formattedFileName= "<button 
  class=\"box button is-large is-fullwidth is-primary is-light\" 
  onclick=\"loadScriptFileData('$filename')\">$filename</button>";

I wszystko powinno działać zgodnie z oczekiwaniami.

1
brombeer 1 kwiecień 2020, 16:27

To osobiste preferencje, ale polecam konkatenację lub nawiasy klamrowe:

Używanie nawiasów klamrowych (uwaga: należy zawijać w cudzysłów):

$formattedFileName =
    "<button
        class="box button is-large is-fullwidth is-primary is-light"
        onclick="loadScriptFileData({$filename})">
        {$filename}
    </button>";

Korzystanie z konkatenacji:

$formattedFileName =
    '<button
        class="box button is-large is-fullwidth is-primary is-light"
        onclick="loadScriptFileData(' . $filename . ')">
        ' . $filename . '
    </button>';

Tak, możesz używać zmiennych w łańcuchu znaków w PHP, jeśli używasz podwójnych cudzysłowów, a z pewnością wiele osób to lubi. Wydaje mi się, że użycie jednej z tych dwóch metod jest bardziej przejrzyste i mniej podatne na błędy.

Stosowanie cudzysłowów powoduje użycie apostrofów w atrybutach HTML lub wymusza ich zmianę.

Niestosowanie konkatenacji lub nawiasów klamrowych może powodować problemy, jeśli nie chcesz spacji po zmiennej:

$var = 'Pizza';
echo "$vars are awesome!" // Not the best example, but you get the idea

Podsumowując, to osobiste preferencje. Ale jak stwierdzono w drugiej odpowiedzi, nie można używać zmiennych w ciągu znaków, jeśli są ujęte w pojedyncze cudzysłowy.

0
Peter Mortensen 26 sierpień 2020, 15:26

Inną opcją (która jest moją osobistą preferencją) jest zakończenie bloku PHP podczas wyprowadzania HTML i po prostu wyświetlaj zmienne PHP w razie potrzeby:

if ($file->isFile()) {
    $filename = $file->getFilename();
    // Let's end the PHP block
    ?>

        <button class="box button is-large is-fullwidth is-primary is-light"
            onclick="loadScriptFileData('<?= $filename ?>')">
            <?= $filename ?>
        </button>

    <?php // Open the PHP block again
}

Zaletą tego jest to, że składnia IDE będzie poprawnie podświetlać kod (czego większość IDE nie robi dla HTML w cudzysłowach w PHP).

Nie musisz też uciekać przed cudzysłowami ani ręcznie drukować treści, ponieważ jest ona natychmiast wypisywana.

1
Peter Mortensen 26 sierpień 2020, 15:28