在 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 . '">
然后尝试。
我正在尝试创建一个 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 . '">
然后尝试。