Пока цикл повторяется бесконечно - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть цикл while, который заполняет раскрывающийся список значениями из таблицы mysql.Есть только две совпадающие записи, и они повторяются снова и снова.Как отображать каждую запись только один раз?:

$query = "SELECT * FROM members, sportevents, dates, results, event, userlogin ". 
         "INNER JOIN members AS m ON userlogin.id = m.id " .
         "WHERE userlogin.username = '$un' " . 
         "AND sportevents.id = members.id " . 
         "AND sportevents.event_id = event.id " .
         "AND sportevents.date_id = dates.id " .
         "AND sportevents.result_id = results.id";

echo "<form method='POST' action='display.php'>";
echo "Please Select Your Event<br />";
echo "<select name='event'>";
echo "<option>Select Your Event</option>";
$results = mysql_query($query)
    or die(mysql_error());
    while ($row = mysql_fetch_array($results)) {

    echo "<option>";
    echo $row['eventname'];
    echo "</option>";
                                               }

echo "</select>";
echo "<input type='submit' value='Go'>";
echo "</form>";

Ответы [ 3 ]

6 голосов
/ 26 сентября 2011

Вы пытались выполнить этот запрос вручную на мониторе mysql? Ничто в вашем коде не приведет к бесконечному циклу, поэтому, скорее всего, ваш запрос не выполняет соединения, как вы ожидаете, и выполняет кросс-продуктовый тип и создает «дублирующие» записи.

В частности, ваш запрос выглядит очень подозрительно - вы используете ленивый подход «из нескольких таблиц» вместо явного указания типов соединений и дважды используете таблицу members (FROM members ... и INNER JOIN members) , Вы не указываете связь между исходной таблицей членов и объединенной / псевдонимной m, поэтому, скорее всего, вы делаете members * members выборку из нескольких продуктов.


если вы, кажется, извлекаете только имя события из выпадающего списка, вы можете попробовать удалить неиспользуемые таблицы - канаву dates и results. Это значительно упростит ситуацию, а затем (угадав) вы сможете сократить запрос до:

SELECT event.id, event.eventname
FROM event
INNER JOIN sportevents ON event.id = sportevents.event_id
INNER JOIN members ON sportevents.id = members.id
INNER JOIN userlogins ON members.id = userlogins.id
WHERE userlogins.username = '$un'

Я не знаю, нужно ли объединение членов / пользовательских журналов - похоже, что оно просто передает sportevents.id участникам, но, не зная схемы вашей БД, я пытался воссоздать исходный запрос как можно лучше.

0 голосов
/ 15 августа 2015

Оформить заказ Мой пример. Это поможет вам понять. Потому что этот код на 100% работает для меня. Изучите его и получите решение.

И вы должны использовать DISTINCT ключевое слово и GROUP BY ключевое слово. Это главное, чтобы предотвратить повторение значений.

    <?php
    $gtid = $_GET['idvc'];
    if(isset($_GET['idvc']))
    {   
    $sql = mysql_query("SELECT DISTINCT gallery_types.gt_id, gallery_types_category.gtc_id, gallery_types_category.gt_category, gallery_types_category.gtc_image FROM gallery_types, gallery_types_category WHERE $_GET[idvc]=gtid GROUP BY gt_category");
    mysql_select_db($database,$con);
        while($row = mysql_fetch_array($sql))
        {?>
            <table>
                <tr>

                    <td width="100px"><?php echo $row['gt_id'] ?></td>
                    <td width="100px"><?php echo $row['gtc_id'] ?></td>
                    <td width="300px"><?php echo $row['gt_category'] ?></td>
                    <td width="150px">
                        <a href='view_all_images.php?idvai=<?php echo $row[gtc_id] ?>' target='_blank'>
                            <img width='50' height='50' src='<?php echo $row[gtc_image] ?>' />
                        </a>
                    </td>
                </tr>
            </table>

        <?php 
        }   
    }
    ?>

Лучше понять, следовать следующему методу,

$sql = mysql_query("SELECT DISTINCT table1.t1id, table2.t2id, table2.t2name FROM table1, table2 WHERE t1id=t2id GROUP BY t2name");

0 голосов
/ 26 сентября 2011

Вы всегда можете попробовать изменить оператор SELECT на оператор SELECT DISTINCT. Это предотвратит дублирование выбранных полей.
Либо это, либо чтение всех результатов перед их отображением, а затем расшифровка их с помощью чего-то вроде array_unique().

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