在php中列出onclick事件问题

时间:2010-01-05 16:15:46

标签: php list onclick

我正在尝试通过单击动态列表来显示新的动态列表。为什么我称他们为动态列表?因为数据来自数据库。

我的想法正在生成公司列表,当我点击一家公司时,会显示公司中所有网站的列表;然后,当我单击一个公司的一个站点时,将显示该站点中所有员工的列表。

现在我遇到了一个问题。当我单击公司列表中的任何项目时,会显示公司列表最后一项中的站点列表。当我点击网站列表中的任何项目时,会显示网站中最后一项的员工列表。

你知道为什么吗?

以下是代码和结果图片:

<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>

结果图片:

alt text

6 个答案:

答案 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)

我会对你的代码做一些事情:

  1. 从其余部分拆分数据获取内容。首先,从所需的表中获取数据并将其保存在PHP变量中。然后,使用JS框架对它们做一些事情......根据您的要求

  2. 你的方法的问题是你永远不会告诉任何人应该发送哪个行的ID ...因此,它从默认选择的行发送id,这恰好是HTML解析的最后一行浏览器上的解析器。这意味着,最后一个......

答案 3 :(得分:1)

您的PHP代码与您的目标不符。 $ result2将始终是$ result1中找到的最后一个ID,依此类推。

如果您需要根据用户在result1中选择的内容生成result2,那么您需要为每个可能的选择创建行,然后使用javascript来显示或隐藏,或者使用Ajax调用(更好)。

答案 4 :(得分:0)

可能想看看JQuery而不是按照你现在的方式去做。但街头游行是正确的。

答案 5 :(得分:0)

我认为,你完成这项任务的方法有点不对劲。 你在第一个循环中做了什么?您设置$ result2变量,并希望在下一个循环中访问它。在下一个循环中,$ result2被设置为第一个循环的最后一个记录。 你听说过AJAX吗? jQuery可能是?