За последние 24 часа нас посетил 19721 программист и 1696 роботов. Сейчас ищут 1772 программиста ...

Оптимальный код???

Тема в разделе "PHP для новичков", создана пользователем Jeck111, 1 дек 2008.

  1. Jeck111

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

    С нами с:
    27 июл 2008
    Сообщения:
    24
    Симпатии:
    0
    Адрес:
    Украина
    Здравствуйте уважаемые, вот делаю нечто подобное сайту berloga.net, ниже приведен код одного блока. Написал, все работает так как я и хотел, но меня терзают смутные сомнения об оптимальности кода который выводит название и категории. Пожалуйста оцените, и дайте советы по оптимизации. Заранее спасибо.

    PHP:
    1. <?php
    2. $result = mysql_query ("SELECT * FROM data ORDER BY date DESC",$db);
    3.     while ($myrow = mysql_fetch_array($result))
    4.     {
    5.         $res = mysql_query ("SELECT cat.title, cat.cat_id FROM cat, relation WHERE relation.data_id='$myrow[data_id]' AND cat.cat_id=relation.cat_id ORDER BY parent_id",$db);
    6.         $row = mysql_fetch_array ($res);
    7.         echo "<table class='data_table' width='100%' border='0'>
    8.           <tr>
    9.             <td class='data_header'><span class='data_name'>". $myrow['name'] ."</span>&nbsp;|&nbsp;<a class='a_data' href = cat.php?cat_id=". $row['cat_id'] .">". $row['title'] ."</a>&nbsp;|&nbsp;";
    10.         $row = mysql_fetch_array ($res); echo "<a class='a_data' href = cat.php?cat_id=". $row['cat_id'] .">". $row['title'] ."</a>";
    11.         while ($row = mysql_fetch_array ($res)) {echo ",&nbsp;<a class='a_data' href = cat.php?cat_id=". $row['cat_id'] .">" . $row['title'] ."</a>";}
    12.         echo "  </span></td>
    13.           </tr>
    14.           <tr>
    15.             <td><div align='center' valign='center'><a href='detail.php?data_id=". $myrow['data_id'] ."'><img src='". $myrow['foto'] ."' alt'". $myrow['alt'] ."'/></a><div></td>
    16.           </tr>
    17.           <tr>
    18.             <td><div align='left'>". $myrow['description'] ."</div></td>
    19.           </tr>
    20.           <tr>
    21.             <td class='data_footer' valign='center'>
    22.             <table width='100%' border='0'>
    23.               <tr>
    24.                 <td><div align='left'><a href='detail.php?data_id=". $myrow['data_id'] ."'  class='a_data'>Читать дальше</a></div></td>
    25.                 <td><div align='right' class='comments'>| Просмотров: | Коментарии: | ". date("d.m.Y",strtotime($myrow['date'])) ."</div></td>
    26.               </tr>
    27.             </table>
    28.  
    29.             </td>
    30.           </tr>
    31.         </table>";
    32.     }
    33. ?>
     
  2. kostyl

    kostyl Guest

    cat.php можно переименовать в $_SERVER['PHP_SELF'], чтобы если понадобиться изменить название файла не менять код.
     
  3. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Что мешает сделать одним запросом ?
    Тогда не надо будет в селекте каждый раз mysql_query вызывать.
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Сколько запросов этот код делает?
     
  5. Jeck111

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

    С нами с:
    27 июл 2008
    Сообщения:
    24
    Симпатии:
    0
    Адрес:
    Украина
    Да запросов он делает много, если точнее то mysql_num_rows ($result) +1, а это будет очень много со временем,
    но я не знаю как объеденить запрос, что бы потом внутри одного цикла выводить другой цикл, который выводит все категории, количество которых непостоянное..
    нагородил вот так, но проблема осталась:

    PHP:
    1. <?php
    2.     $result = mysql_query ("SELECT * FROM data, cat, relation WHERE relation.data_id=data.data_id AND cat.cat_id=relation.cat_id ORDER BY date DESC",$db);
    3.         while ($myrow = mysql_fetch_array($result))
    4.     {
    5.        
    6.         echo "<table class='data_table' width='100%' border='0'>
    7.           <tr>
    8.             <td class='data_header'><span class='data_name'>". $myrow['name'] ."</span>&nbsp;|&nbsp;<a class='a_data' href = cat.php?cat_id=". $myrow['cat_id'] .">". $myrow['title'] ."</a>/*Вот здесь нужно как-то цикл организовать, а при таком запросе я не знаю как.. */&nbsp;|&nbsp;";
    9.  
    10.  
    11.         echo "  </span></td>
    12.           </tr>
    13.           <tr>
    14.             <td><div align='center' valign='center'><a href='detail.php?data_id=". $myrow['data_id'] ."'><img src='". $myrow['foto'] ."' alt'". $myrow['alt'] ."'/></a><div></td>
    15.           </tr>
    16.           <tr>
    17.             <td><div align='left'>". $myrow['description'] ."</div></td>
    18.           </tr>
    19.           <tr>
    20.             <td class='data_footer' valign='center'>
    21.             <table width='100%' border='0'>
    22.               <tr>
    23.                 <td><div align='left'><a href='detail.php?data_id=". $myrow['data_id'] ."'  class='a_data'>Читать дальше</a></div></td>
    24.                 <td><div align='right' class='comments'>| Просмотров: | Коментарии: | ". date("d.m.Y",strtotime($myrow['date'])) ."</div></td>
    25.               </tr>
    26.             </table>
    27.  
    28.             </td>
    29.           </tr>
    30.         </table>";
    31.     }
    32.     ?>
     
  6. kostyl

    kostyl Guest

    Короче тебе надо выбрать одним запросом, чтобы получилось чтото типа:
    data1 => cat_name1
    data1 => cat_name2
    data1 => cat_name3
    data2 => cat_name0
    data2 => cat_name1
    data2 => cat_name3
    data3 => cat_name7
    data4 => NULL
    data5 => cat_name0
    ?
    Так я понимаю?
     
  7. Jeck111

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

    С нами с:
    27 июл 2008
    Сообщения:
    24
    Симпатии:
    0
    Адрес:
    Украина
    Да так ты понимаешь, если это возможно.
     
  8. kostyl

    kostyl Guest

    чтото типа:
    [sql]
    SELECT t1.data_name, t2.cat_name FROM data AS t1, cat AS t2 WHERE cat_id=(
    SELECT cat_id FROM relation WHERE data_id=(
    SELECT data_id FROM data LIMIT 0, 10))
    [/sql]
    но я не уверен, может с UNION или JOIN надо както!?
     
  9. kostyl

    kostyl Guest

    нет, это маразм надо так:
    [sql]
    SELECT
    t1.data_name, t3.cat_name
    FROM
    data AS t1, relation AS t2, cat AS t3
    WHERE
    t2.data_id = t1.data_id AND t2.cat_id = t3.cat_id
    LIMIT 0, 10
    [/sql]
    вроде должно, можно попробывать с JOIN но не могу сообразить. Мож тут есть получше умы?
     
  10. kostyl

    kostyl Guest

    [sql]
    SELECT t1.data_name, t2.cat_name
    FROM
    DATA AS t1
    LEFT JOIN relation AS t3 ON t1.data_id = t3.data_id
    LEFT JOIN cat AS t2 ON t2.cat_id = t3.cat_id
    LIMIT 0 , 10
    [/sql]
     
  11. kostyl

    kostyl Guest

    так при этом
    [sql]
    SELECT
    SQL_CALC_FOUND_ROWS t1.data_name, t2.cat_name
    FROM
    data AS t1
    LEFT JOIN relation AS t3 ON t1.data_id = t3.data_id
    LEFT JOIN cat AS t2 ON t2.cat_id = t3.cat_id
    LIMIT 0 , 10;
    SELECT FOUND_ROWS( ) ;
    [/sql]
    выдаст 8, но всего та допустим записей в дата 5 штук. Как узнать действительное число? знает может кто?
     
  12. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    kostyl
    Автору тебе уже денег пора отсыпать.
     
  13. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    :lol:
     
  14. kostyl

    kostyl Guest

    Блин может COUNT ом как то?
     
  15. kostyl

    kostyl Guest

    Может кто расскажет а то мне очень стало интересно?