ФорумРазработкаБазы данных → Уменьшение количества запросов

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

  • herotic

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 28 января 2012 г. 15:43

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

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

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

    <?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>';
    }

    ?>
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 28 января 2012 г. 19:19, спустя 3 часа 35 минут 39 секунд

    herotic- у меня после твоего херо-кода нервный тик…
    Спустя 92 сек.
    JOIN
  • herotic

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 28 января 2012 г. 19:45, спустя 26 минут 24 секунды

    А как это все заюзать?
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 29 января 2012 г. 1:13, спустя 5 часов 28 минут 1 секунду

    ну типо SELECT * FROM votestat LEFT JOIN people ON votestat.peapleid = peaple.id WHERE likedis='like' AND ipadress='$realip' ORDER BY …..
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 29 января 2012 г. 19:15, спустя 18 часов 1 минуту 38 секунд

    herotic, в мусикель-запросе проверяй нет ли в базе уже такого АйПи, с которого запрошена страница и если есть, то возвращай какую-то метку типа "фолс" или 0.
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 30 января 2012 г. 10:18, спустя 15 часов 3 минуты 22 секунды

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

    я тебя умоляю, не надо выбирать все адреса. есть адрес текущего пользователя, вот этот адрес используй в запросе. если такой уже был (возвращено не 0 строк), то НЕ выводить форму голосования, а сразу результат.

    и, кстати, отсеивать по IP глупо, т.к. у тысячи юзеров может быть один внешний IP. задача анонимного голосования в принципе не имеет решения, а только имитацию решения.
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!