За последние 24 часа нас посетили 24335 программистов и 1645 роботов. Сейчас ищут 1294 программиста ...

А не говнокод ли это?

Тема в разделе "PHP для новичков", создана пользователем Devzirom, 10 фев 2010.

  1. Devzirom

    Devzirom Активный пользователь

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Есть вот такой кусочек скрипта:
    PHP:
    1.     <?php
    2. ...
    3. $result = sql_query("select `news`.`id` from `news`");
    4.     $total_rows = @mysql_num_rows($result);
    5.     mysql_free_result($result);
    6.    
    7.     echo('
    8. <div class="parts">Страницы: ');
    9.  
    10.     for($i=1; $i<=ceil($total_rows/NEWS_IN_PAGE); $i++) {
    11.         if($part == $i) {
    12.        
    13.             echo('
    14. <span class="part">'.$part.'</span>');
    15.  
    16.         } else {
    17.        
    18.             echo('
    19. <span class="part">'.
    20. '<a href="?mod=news&amp;id=0&amp;part='.($i).'" title="Перейти на страницу '.($i).'">'.($i).'</a>'.
    21. '</span>');
    22.  
    23.         }
    24.     }
    25.    
    26.     echo('
    27. </div>');
    28. ...
    29. ?>
    30.  
    А это результат жизнедеятельности данного кусочка скрипта:
    HTML:
    1.  
    2. <div class="parts">Страницы:
    3. <span class="part">1</span>
    4. <span class="part"><a href="?mod=news&amp;id=0&amp;part=2" title="Перейти на страницу 2">2</a></span>
    5. <span class="part"><a href="?mod=news&amp;id=0&amp;part=3" title="Перейти на страницу 3">3</a></span>
    6. <span class="part"><a href="?mod=news&amp;id=0&amp;part=4" title="Перейти на страницу 4">4</a></span>
    7. </div>
    8.  
    Что скажете: Говнокод или нет?
     
  2. Это абстрактный кусок кода в вакууме.
    Не очень хороший.
     
  3. Devzirom

    Devzirom Активный пользователь

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Хм, спасибо! Буду напрягать мозг, а не прямую кишку =)
     
  4. Подойди к вопросу с другой стороны: если ты хочешь научится писать хороший код, я расскажу как.

    Сначала сформулируй, что должен выполнять написанный тобой код, так, что бы в двух-трех предложениях выразить его основное предназначение, и напиши сюда. Я тебе скажу, что делать дальше )
     
  5. Devzirom

    Devzirom Активный пользователь

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Собственно этот кусок кода вынут из скрипта, который выводит N-ое количество новостей из БД. Представленный, выше, кусок кода всего лишь выводит ссылки для перехода от свежих новостей к более ранним. Количество, выводимых на страницу, новостей зависит от константы NEWS_IN_PAGE, переменная $part, полученная из запроса методом $_GET, определяет текущую страницу.
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Тогда вот это
    Не самый лучший вариант подсчета общего количества новостей.

    Если у тебя перед этим была выборка новостей с LIMIT
    то в ней можно было использовать директиву SQL_CALC_FOUND_ROWS
    а число новостей соответственно узнать запросом [sql]SELECT FOUND_ROWS()[/sql]

    Или второй вариант [sql]SELECT COUNT(news.id) FROM news[/sql]но тащить все id из базы, только для того чтобы узнать сколько их - неразумно.
     
  7. Simpliest, у мускула есть оптимизация для
    [sql]select count(*) from table[/sql]
    в таком случае число строк берется из метаданных
     
  8. Devzirom

    Devzirom Активный пользователь

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    Спасибо вам флоппик, Simpliest!
    Благодаря вашим практическим советам получен более приличный код:
    PHP:
    1. <?php
    2. ...
    3.     $result = sql_query("select count(*) from `news`");
    4.     $parts_num = ceil(mysql_result($result, 0)/NEWS_IN_PAGE);
    5.     mysql_free_result($result);
    6.    
    7.     echo "\n<div class=\"parts\">Страницы: ";
    8.     for($i=1; $i<=$parts_num; $i++) {
    9.         if($part == $i)
    10.             echo "\n<span class=\"part\">$part</span>";
    11.         else {
    12.             echo "\n<span class=\"part\">".
    13.             "<a href=\"?mod=news&amp;id=0&amp;part=$i\" title=\"Перейти на страницу $i\">$i</a>".
    14.             "</span>";
    15.         }
    16.     }
    17.     echo "\n</div>";
    18. ...
    19. ?>
    Возможно ещё сделать лучше?
     
  9. Да.
    Шаг 1. Для того, что бы ты мог легко переносить его с собой из проекта в проект нужно выделить основные параметры и сформировать функции которые тебе позволят за один вызов строить все нужные данные.
    Шаг 2. Нужно будет выделить текстовое отображение отдельно, что бы можно было его легко менять, а для вставки нужных значений использовать подстановку переменных.