我正在尝试通过单击动态列表来显示新的动态列表。为什么我称他们为动态列表?因为数据来自数据库。
我的想法正在生成公司列表,当我点击一家公司时,会显示公司中所有网站的列表;然后,当我单击一个公司的一个站点时,将显示该站点中所有员工的列表。
现在我遇到了一个问题。当我单击公司列表中的任何项目时,会显示公司列表最后一项中的站点列表。当我点击网站列表中的任何项目时,会显示网站中最后一项的员工列表。
你知道为什么吗?以下是代码和结果图片:
<script language="JavaScript">
function toggle(id,id2,id3) {
var state = document.getElementById(id).style.display;
if (state == 'block') {
document.getElementById(id).style.display = 'none';
if (id2 != undefined)document.getElementById(id2).style.display = 'none';
if (id3 != undefined)document.getElementById(id3).style.display = 'none';
} else {
document.getElementById(id).style.display = 'block';
}
}
</script>
<style type="text/css">
#main{
position:relative;
top:20px;
left:20px;
width:200px;
background: lightblue;
}
#hidden {
position:relative;
top:5px;
left:280px;
width:200px;
background: lightgrey;
display: none;
}
#hidden2 {
position:relative;
top:-12px;
left:580px;
width:200px;
background: lightgreen;
display: none;
}
#hidden3 {
position:relative;
top:100px;
left:20px;
width:200px;
background: lightpink;
display: none;
}
</style>
<?php
error_reporting(E_ALL ^ E_NOTICE);
include("./conn/connect.php");
$query = "SELECT * FROM entreprise ORDER BY id";
$result = mysql_query($query) or die("result failed: ".mysql_error());
?>
<div id="main" >
<?php
echo "<ul>";
while($row = mysql_fetch_assoc($result)){
echo "<li onclick=\"toggle('hidden','hidden2','hidden3');\">".$row['name'].'<li>';
$query2 = "SELECT * FROM site WHERE eid = '".$row['id']."'";
//$query2 = "SELECT * FROM site WHERE eid = ".$row['id'];
//$result2 = mysql_query($query2) or die("query2 result error".mysql_error());
$result2 = mysql_query($query2) or die("query2 result error".mysql_error());
}
echo "</ul>";
?>
</div>
<div id="hidden" >
<?php
echo "<ul>";
while($row2 = mysql_fetch_assoc($result2)){
echo "<li onclick=\"toggle('hidden2','hidden3')\">".$row2['name'].'< >';
$query3 = "SELECT * FROM salarie WHERE siteid =".$row2['id'];
//echo $query3;
$result3 = mysql_query($query3) or die("query3 result error".mysql_error());
}
echo "</ul>";
?>
</div>
<div id="hidden2" >
<?php
echo "<ul>";
while($row3 = mysql_fetch_assoc($result3)){
echo "<li onclick=\"toggle('hidden3')\">".$row3['prenom'].'< >';
$query4 = "SELECT * FROM salarie WHERE id =".$row3['id'];
$result4 = mysql_query($query4) or die("query4 result error".mysql_error());
}
echo "</ul>";
?>
</div>
<div id="hidden3">
<?php
echo "<table>";
while($row4 = mysql_fetch_assoc($result4)){
echo "<tr><td>".$row4['prenom'].'</td>';
echo "<td>".$row4['nom'].'</td></tr>';
}
echo "</table>";
?>
</div>
结果图片:
答案 0 :(得分:4)
非常简单:访问网站时,您的PHP代码会执行 ONCE 。
所以例如这个块的结果
while($row = mysql_fetch_assoc($result)){
echo "<li onclick=\"toggle('hidden','hidden2','hidden3');\">".$row['name'].'<li>';
$query2 = "SELECT * FROM site WHERE eid = '".$row['id']."'";
//$query2 = "SELECT * FROM site WHERE eid = ".$row['id'];
//$result2 = mysql_query($query2) or die("query2 result error".mysql_error());
$result2 = mysql_query($query2) or die("query2 result error".mysql_error());
}
是$result2
包含您列表中最后一家公司的所有网站。然后在下一个循环中使用它来生成相应的站点列表。查看生成的HTML文件的来源。
PHP是一种服务器端语言,代码在服务器上执行,并且不会被Javascript函数重新执行(即不在浏览器中执行)。
您所使用的是使用AJAX从服务器动态加载数据并传入生成的HTML。
修改强>
你也可以在没有Ajax的情况下做到这一点:像这样重写你的PHP:
$sitequeries = array()
while($row = mysql_fetch_assoc($result)){
echo "<li onclick=\"showSites('sites_$row['id']');\">".$row['name'].'<li>';
$query = "SELECT * FROM site WHERE eid = '".$row['id']."'";
$sitequeries[$row['id']] = mysql_query($query2 or die("query2 result error".mysql_error());
}
和
<?php
foreach($sitequeries as $id => $query) {
echo "<ul class='sites' id='sites_$id'>";
while($row2 = mysql_fetch_assoc($query)){
//...
}
echo "</ul>";
}
?>
这不是一个有效的例子,但应该给你正确的想法。您必须相应地调整您的JS以仅显示相应的列表,例如:
function showSites(id) {
// Hide all lists with class 'site' here and only display the list with id 'id' e.g. 'sites_5'
}
但请注意,如果您有很多公司,网站,雇员等,这不是一个好的解决方案,因为HTML的生成可能需要一段时间。然后Ajax是一个更好的选择。
答案 1 :(得分:1)
您的toggle()
功能需要 3 参数
你在一些地方设置了2个参数
echo "<li onclick=\"toggle('hidden2','hidden3')\">".$row2['name'].'< >';
Shoud be
echo "<li onclick=\"toggle('hidden1','hidden2','hidden3')\">".$row2['name'].'< >';
答案 2 :(得分:1)
我会对你的代码做一些事情:
从其余部分拆分数据获取内容。首先,从所需的表中获取数据并将其保存在PHP变量中。然后,使用JS框架对它们做一些事情......根据您的要求
你的方法的问题是你永远不会告诉任何人应该发送哪个行的ID ...因此,它从默认选择的行发送id,这恰好是HTML解析的最后一行浏览器上的解析器。这意味着,最后一个......
答案 3 :(得分:1)
您的PHP代码与您的目标不符。 $ result2将始终是$ result1中找到的最后一个ID,依此类推。
如果您需要根据用户在result1中选择的内容生成result2,那么您需要为每个可能的选择创建行,然后使用javascript来显示或隐藏,或者使用Ajax调用(更好)。
答案 4 :(得分:0)
可能想看看JQuery而不是按照你现在的方式去做。但街头游行是正确的。
答案 5 :(得分:0)
我认为,你完成这项任务的方法有点不对劲。 你在第一个循环中做了什么?您设置$ result2变量,并希望在下一个循环中访问它。在下一个循环中,$ result2被设置为第一个循环的最后一个记录。 你听说过AJAX吗? jQuery可能是?