在 PHP 的 while 循环中,ID 未按预期工作

IDs not working as expected in a while loop in PHP

我正在尝试创建一个 while 循环,为每个 $version 值回显一个按钮。 shell_exec() returns 来自 Python 文件的值,并且响应唯一的 $version 值。为此,基本目标是创建一个页面,其中按钮的数量取决于版本值。

然后,用户可以单击任何特定按钮并访问该特定按钮(版本)的数据。为此,我尝试将变量与 ID 混合使用,但似乎不起作用。我该怎么做才能解决这个问题? None 个按钮现在可以响应。

代码:

<?php
              
              
              while ($version != 0) {


                echo '
                <br>
                <br>
                <button id="toggle-' . $version . '">TOGGLE</button>
                <div style= "display:none;" id="content-' . $version . '">

                ';

                $command = escapeshellcmd("C:/Python38/python.exe C:/xampp/htdocs/Ensemble/login/test.py $email $version"); 
                $output = shell_exec("$command 2>&1");
                echo($output);

                echo '
                </div>


                <script>
                var toggle  = document.getElementById("toggle-' . $version . '");
                var content = document.getElementById("content-' . $version . '");

                toggle.addEventListener("click", function() {
                  content.style.display = (content.dataset.toggled ^= 1) ? "block" : "none";
                });
                </script>

                '
                ;

                $version--;
              }
            ?>

编辑

出现了一个新问题。只有一个按钮起作用。单击时两个按钮输出相同的内容而不是不同的版本。在 SQL 中,所有版本都不同,因此这很可能是 html/JS.

的错误

也许以下内容可能会有所帮助 - 尽管就 Python 调用而言尚未经过测试,但我认为如果我理解正确,其他代码应该可以正常工作。

每个 ID 在 DOM 中都必须是唯一的,我想这就是为什么您试图通过向每个 ID 添加 $version 编号来使它们如此。如果您将 querySelectorAll 与合适的表达式一起使用,则这并不是必需的。与香草 javascript 中存在的一个或多个 parent/sibling 选择器一起执行此操作可以相当容易 DOM 导航和操作。这也意味着您可以对所有按钮使用同一段代码...希望对您有所帮助。

<?php
    while( $version > 0 ) {
    
        $command = escapeshellcmd( "C:/Python38/python.exe C:/xampp/htdocs/Ensemble/login/test.py $email $version" ); 
        $output = shell_exec("$command 2>&1");



        printf('
            <br />
            <br />
            
            <button data-version="%d">Toggle</button>
            <div style="display:none">%s</div>', 
            $version,
            $output 
        );

        $version--;
    }
    
    echo "
    <script>
        Array.from( document.querySelectorAll('button') ).forEach( bttn=>{
            bttn.addEventListener('click', function(e){
                let version=this.dataset.version;
                let div=this.nextElementSibling;
                    div.style.display=div.style.display=='block' ? 'none' : 'block';
                
            });
        })
    </script>";
?>

替换

<div style= "display:none;" "id="content-' . $version . '">

<div style= "display:none;" id="content-' . $version . '">

然后尝试。