Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Уменьшение количества запросов

79K
28 января 2012 года
herotic
2 / / 28.01.2012
Всем привет!
У меня есть следующая вещь:
Из базы в цикле вытягиваются данные, человеки, за которых можно проголосовать за или против. Ограничение только по айпи. Так вот, я задумал сделать так, что если пользователь уже голосовал, то сама кнопка для голосования не будет ему показываться, но я никак не могу сообразить как организовать это все дело так, чтобы не использовать запросы каждый раз в самом цикле, как это организовано сейчас у меня.

Подскажите, пожалуйста, как сделать так, чтобы выбрать из базы сначала все айпи-адреса и уже только потом вложенным циклом проверять или он есть в списке? То есть как уменьшить количество запросов?

Свой код привожу ниже:

Код:
<?php


        $result = mysql_query("SELECT * FROM people ".$where." ORDER ".$sortby."");
        $myrow = mysql_fetch_array($result);
       
        if (mysql_num_rows($result) > 0)

{


        $realip = getenv(HTTP_X_FORWARDED_FOR);
        if ($realip == ''){$realip = $_SERVER['REMOTE_ADDR'];}
       

        do
        {  
       
        if ($myrow['avatar'] == '-')
        {
            if ($myrow['sex'] == '1') {$avatar = 'images/man.png';}
            if ($myrow['sex'] == '0') {$avatar = 'images/woman.png';}
        }
        if ($myrow['avatar'] != '-') {$avatar = "timthumb.php?src=".$myrow['avatar']."&a=t&w=195&h=200&q=100";}
       
       
        $resultfindip = mysql_query("SELECT * FROM votestat WHERE peopleid='$myrow[id]' AND likedis='like' AND ipadress='$realip'",$db);
        if (mysql_num_rows($resultfindip) > 0) {$likehref = "";}
        else {$likehref = "<a class='like' name='$myrow[id]'>ХОРОШО! (<strong>$myrow[likes]</strong>)</a>";}
   
       
        $stroka='';
        if(($i+1)%4==0) $stroka='</tr><tr>';
        printf ("
          <td align='center' valign='middle' width='200'>
          <img src='$avatar' />
          <br />
          <strong>%s</strong><br />
          %s<br />
          <a href='comments.php?id=%s' class='comments fancybox.iframe'><img title='Отзывы' src='images/comments.png'></a>
          <a href='add_comment.php?id=%s' class='addcomment fancybox.iframe'><img title='Добавить отзыв' src='images/addcomments.png'></a>
          <br>
          $likehref
          <a class='dislike' name='%s'>ПЛОХО! (<strong>%s</strong>)</a>
          </td>
        $stroka
        "
,$myrow["posada"],$myrow["name"],$myrow["id"],$myrow["id"],$myrow["id"],$myrow["dislikes"]);
        $i++;
        }
        while ($myrow= mysql_fetch_array($result));
}
else
{
    echo '<br /><p align="center"><strong>У цій групі поки нікого немає!</strong></p>';
}

?>
244
28 января 2012 года
UAS
2.0K / / 19.07.2006
Предлагаю выше означенный код стереть и забыть.
IP-адреса, кстати, надо хранить не в строках, а в числах. Ищите функции конвертации. Вроде как есть одна, называется ip2long.
Что за "likedis='like'"? Почему строковое значение? Константы числовые вводите.

По поводу самого запроса - делайте LEFT JOIN.
 
Код:
SELECT *
FROM people
LEFT JOIN votestat ON peopleid = ...
WHERE ...
     AND likedis='like' AND ipadress=...
ORDER BY ...

В случае, если запись в таблице votestat на найдена, то её поля в результате запроса будут равны NULL.

Мой совет - полностью перепроектировать базу данных с нуля. Дать нормальные имена и нормально определить форматы данных.
79K
28 января 2012 года
herotic
2 / / 28.01.2012
А как это все потом заюзать?
396
28 января 2012 года
SibBear
223 / / 27.07.2006
Начните со статьи MySQL немного о JOIN'ах - http://www.anton-pribora.ru/articles/mysql/mysql-join
очень полезно, доходчиво, и ваще...
12
28 января 2012 года
alekciy
3.0K / / 13.12.2005
Нужно не запросы уменьша, а начать хотя бы с реляционных основ. Нормальные формы, объединения, условия в выборках. Рекомендую проштудировать эту книгу: http://market.yandex.ru/search.xml?hid=90829&text=%D1%E0%EC%EE%F3%F7%E8%F2%E5%EB%FC%20MySQL%205%20%CA%F3%E7%ED%E5%F6%EE%E2%20%CC.%20%C2.%2C%20%D1%E8%EC%E4%FF%ED%EE%E2%20%C8.%20%C2. после чего спроектировать структуру базы с нуля.

Текущую реализацию выкинуть полностью.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог