Как правильно отобразить все английское определение в одном цикле без разделения в php?

1

Отображение логической ошибки состоит в том, что английское слово, имеющее большее значение, отображается следующим образом:

English word: lie (1)
Definition: not honest

English word: lie (1)
Definition: deliberately say something untrue

English word: lie (2)
Definition: to stretch out on a surface that is slanted or horizontal

English word: lie (2)
Definition: to be positioned on and supported by a horizontal surface

Я хочу, чтобы вывод отображался следующим образом:

English word: lie (1)
Definition: 1. not honest
            2. deliberately say something untrue

Если у него есть одно и то же слово с разным значением, это должен быть выход:

English word: lie (1)
Definition: 1. not honest
            2. deliberately say something untrue

English word: lie (2)
Definition: 1. to stretch out on a surface that is slanted or horizontal
            2. to be positioned on and supported by a horizontal surface

Вот мой код:

    <?php                                   

    $search = $_POST['word'];

    $query = "SELECT *" .
             " FROM english, english_meaning, maranao, filipino, translate". 
             " WHERE english.eng_id = english_meaning.eng_id and english.eng_id = translate.eng_id and maranao.mar_id = translate.mar_id and filipino.fil_id = translate.fil_id and english.english_word like '$search%'";

            $result = mysql_query($query) or die(mysql_error()); 

            $num_rows = mysql_num_rows($result);

            if($num_rows==0)
            {
                echo "No Results Found. Please try again";
            }


                while($row=mysql_fetch_array($result))
                {
                ?>
                    <div style = " background-color: #daeaff; border-radius: 10px; padding: 15px;">
                    <font size='3' face='Times New Roman'>

                        English word: <b><?php echo $row['english_word']; ?></b><br>
                        Definition:<b><div style="width:600px; border:0px solid orange; margin-left: 79px; word-wrap:break-word; margin-top: -18px;"><?php echo $row['definition'] ?></b></div>

                    </font>
                    </div>
                    <?php echo "<br>"; ?>

                <?php
                }
            }
    mysql_close($con);
?>
  • 0
    Добавьте из вашего SQL заявление LIMIT 1
  • 0
    Будет отображено только одно определение.
Показать ещё 3 комментария
Теги:

1 ответ

1

Несколько примечаний к коду:

  • Он подвержен SQL-инъекции. Вы должны прекратить использовать функции mysql_*, они устарели и заменяют их msqli_*/PDO и параметризованными запросами.

  • HTML также нуждается в улучшении: у вас не должно быть кросс-тегов (например: <b><div>...</b></div>) и избегать устаревших тегов, которые больше не поддерживаются в HTML5 (например: <font>).

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

  1. Инициализируйте переменную previous_word на "".
  2. Пока еще есть строки (выборка):
    1. Если английское слово не совпадает с previous_word словом.
      1. Печать "Английское слово:" + слово.
    2. Определение печати.
    3. Обновить previous_word со значением текущего слова.

Изменив код из вашего вопроса, результат будет выглядеть так (только часть цикла):

// AM - variable that will hold the previous word
$previous_word = "";
$row = 0;

while($row = mysql_fetch_array($result)) 
{
    // AM - Show the word only if it a new one    
    if ($row["english_word"] != $previous_word) { 

        // AM - close the previous word definition
        if ($row > 0) { echo "</div><br>"; }

    ?>
    <div style = " background-color: #daeaff; border-radius: 10px; padding: 15px; font-family:'Times New Roman'; font-size:3;">
            English word: <b><?php echo $row['english_word']; ?></b><br>
            Filipino word: <b><?php echo $row['filipino_word']; ?></b><br>
            Maranao word: <b><i><?php echo $row['maranao_word']; ?></i></b><br>
            Definition:
<?php 
    } 
?>
        <div style="width:600px; border:0px solid orange; margin-left: 79px; word-wrap:break-word; margin-top: -18px;"><b><?php echo $row['definition'] ?></b></div>
<?php
    // AM - Update the previous word and the row count
    $previous_word = $row["english_word"];
    $row++;
}

// AM - close the last word definition
if ($row > 0) { echo "</div><br>"; }
  • 0
    @ user3808774 <br> должен идти после каждого слова, правильно? Я обновлю ответ с этим, и если это - другое, тогда оставьте мне комментарий, и я рассмотрю это. Идея заключалась бы в том, чтобы поставить его после закрытия </div>
  • 0
    нижний колонтитул также влияет
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню