перечислить проблему события onclick в php - PullRequest
0 голосов
/ 05 января 2010

Я пытаюсь отобразить новый динамический список, нажав динамический список. Почему я называю их динамическим списком? Потому что данные из базы данных.

Моя идея создает список компаний, когда я нажимаю одну компанию, отображается список всех сайтов в компании; И затем, когда я нажимаю на один сайт одной компании, отображается список всех сотрудников на сайте.

Теперь я столкнулся с проблемой. Когда я нажимаю на любой элемент в списке компаний, отображается список сайтов в последнем элементе списка компаний. И когда я щелкаю по любому элементу в списке сайтов, отображается список сотрудников последнего элемента на сайтах.

Ты знаешь почему?

Вот код и изображение результата:

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

4 голосов
/ 05 января 2010

Довольно просто: ваш PHP-код выполняется ОДИН РАЗ при входе на сайт.

Так, например, результат этого блока

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.

Edit:

Вы также можете сделать это без 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 голос
/ 05 января 2010

Ваш PHP-код не соответствует вашей цели. $ result2 всегда будет последним идентификатором, найденным в $ result1, и т. д.

Если вам нужно сгенерировать result2 на основе того, что пользователь выбрал в result1, то вам нужно либо создать строки для каждого возможного выбора, затем использовать javascript для отображения или скрытия, либо использовать вызовы Ajax (намного лучше).

1 голос
/ 05 января 2010

Я бы кое-что сделал с вашим кодом:

  1. Разделить данные, получая данные от остальных. Сначала получите данные из необходимых таблиц и сохраните их в переменных PHP. Затем сделайте что-нибудь с ними, используя среду JS ... что-то в соответствии с вашими требованиями

  2. Проблема вашего подхода в том, что вы НИКОГДА не говорите никому, какой идентификатор строки должен быть отправлен ... следовательно, он отправляет идентификатор из выбранной по умолчанию строки, которая оказывается последней, проанализированной HTML парсер в браузере. Это означает, что последний ...

1 голос
/ 05 января 2010

Ваш toggle() Требуется функция 3 Параметры Вы устанавливаете в некоторых местах только 2 параметра

echo "<li onclick=\"toggle('hidden2','hidden3')\">".$row2['name'].'< >';

Должен быть

echo "<li onclick=\"toggle('hidden1','hidden2','hidden3')\">".$row2['name'].'< >';
0 голосов
/ 05 января 2010

Ваш подход к этой задаче немного ошибочен, я думаю. Что вы делаете в первом цикле? Вы устанавливаете переменную $ result2 и хотите получить к ней доступ в следующем цикле. И в следующем цикле $ result2 устанавливается на последнюю запись первого цикла. Вы слышали об AJAX? JQuery может быть?

0 голосов
/ 05 января 2010

Возможно, вы захотите взглянуть на JQuery вместо того, чтобы делать то, что вы в данный момент. Но уличный парад прав.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...