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

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

  • herotic

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

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

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

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

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

    <?php 


    $result = mysql_query(&quot;SELECT * FROM people &quot;.$where.&quot; ORDER &quot;.$sortby.&quot;&quot;);
    $myrow = mysql_fetch_array($result);

    if (mysql_num_rows($result) > 0)

    {


    $realip = getenv(HTTP_X_FORWARDED_FOR);
    if ($realip == &#39;&#39;){$realip = $_SERVER[&#39;REMOTE_ADDR&#39;];}


    do
    {

    if ($myrow[&#39;avatar&#39;] == &#39;-&#39;)
    {
    if ($myrow[&#39;sex&#39;] == &#39;1&#39;) {$avatar = &#39;images/man.png&#39;;}
    if ($myrow[&#39;sex&#39;] == &#39;0&#39;) {$avatar = &#39;images/woman.png&#39;;}
    }
    if ($myrow[&#39;avatar&#39;] != &#39;-&#39;) {$avatar = &quot;timthumb.php?src=&quot;.$myrow[&#39;avatar&#39;].&quot;&amp;a=t&amp;w=195&amp;h=200&amp;q=100&quot;;}


    $resultfindip = mysql_query(&quot;SELECT * FROM votestat WHERE peopleid=&#39;$myrow[id]&#39; AND likedis=&#39;like&#39; AND ipadress=&#39;$realip&#39;&quot;,$db);
    if (mysql_num_rows($resultfindip) > 0) {$likehref = &quot;&quot;;}
    else {$likehref = &quot;<a class=&#39;like&#39; name=&#39;$myrow[id]&#39;>ХОРОШО! (<strong>$myrow[likes]</strong>)</a>&quot;;}


    $stroka=&#39;&#39;;
    if(($i+1)%4==0) $stroka=&#39;</tr><tr>&#39;;
    printf (&quot;
    <td align=&#39;center&#39; valign=&#39;middle&#39; width=&#39;200&#39;>
    <img src=&#39;$avatar&#39; />
    <br />
    <strong>%s</strong><br />
    %s<br />
    <a href=&#39;comments.php?id=%s&#39; class=&#39;comments fancybox.iframe&#39;><img title=&#39;Отзывы&#39; src=&#39;images/comments.png&#39;></a>
    <a href=&#39;add_comment.php?id=%s&#39; class=&#39;addcomment fancybox.iframe&#39;><img title=&#39;Добавить отзыв&#39; src=&#39;images/addcomments.png&#39;></a>
    <br>
    $likehref
    <a class=&#39;dislike&#39; name=&#39;%s&#39;>ПЛОХО! (<strong>%s</strong>)</a>
    </td>
    $stroka
    &quot;,$myrow[&quot;posada&quot;],$myrow[&quot;name&quot;],$myrow[&quot;id&quot;],$myrow[&quot;id&quot;],$myrow[&quot;id&quot;],$myrow[&quot;dislikes&quot;]);
    $i++;
    }
    while ($myrow= mysql_fetch_array($result));
    }
    else
    {
    echo &#39;<br /><p align=&quot;center&quot;><strong>У цій групі поки нікого немає!</strong></p>&#39;;
    }

    ?>
  • AlexanderC

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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