Разное изображение в зависимости от того, проголосовал ли уже пользователь - PullRequest
0 голосов
/ 03 июня 2009

Я занимаюсь разработкой сайта голосования по ссылкам, и у меня есть эта функция, чтобы проверить, проголосовал ли пользователь уже по ссылке:

function  has_voted($user) 
    {
       try
        {
            $db = parent::getConnection();
            $query = "select id from votes where username = '$user' and article_id  = $this->id";
            $results = parent::execSQL($query);
            if($results->num_rows == 1) {
                return true;                 
            }
            else 
            {
                return false;
            }            
            parent::closeConnection($db);

        }
        catch(Exception $e){
            throw $e;
        }       
    }

А на главной странице я показываю изображение для голосования по этой строке:

  <a href="/index.php?action=vote&amp;param=<?php echo $articles[$index]->getId(); ?>">
<img class="vote_button" src="assets/images/triangulo.png" />
</a>

То, что я хочу, чтобы он вставил «если», чтобы отобразить другое изображение, если пользователь уже проголосовал, я пробовал это, но он показывает ошибки:

    <a href="/index.php?action=vote&amp;param=<?php echo $articles[$index]->getId(); ?>">
<?php if($articles[$index]->has_voted($articles[$index]->getUsername()) == true) 
{ ?><img src="assets/images/triangulo.png"/></a><?php } 
else 
{ ?><img class="vote_button"  src="assets/images/triangulo2.png" /></a><?php } ?>

+++ Edit:

Schnalle,

Спасибо за анализ, вот что я сделал:

  • хорошо, я забрал parent :: closeConnection ($ db), спасибо

  • Я также пытаюсь сократить выражение catch, но у меня появляется эта ошибка: Parse error: syntax error, unexpected '}', expecting T_CATCH in /home/mexautos/public_html/kiubbo/data/article.php on line 155

  • Я получил имя пользователя здесь, я не знаю, достаточно ли это безопасно:

    function getUsername () { вернуть $ this-> username; }

    Я пробовал этот код для очистки:

    $ query = sprintf ("выберите идентификатор из голосов, где username = '$ user' и article_id = $ this-> id", mysql_real_escape_string ($ пользователю), mysql_real_escape_string ($ пароль));

    но я получаю эту ошибку для строк mysql_real_escape:

Предупреждение: mysql_real_escape_string () [function.mysql-real-escape-string]: доступ запрещен для пользователя 'mexautos' @ 'localhost' (с использованием пароля: НЕТ) в / home / mexautos / public_html / kiubbo / data / article .php на линии 145 Предупреждение: mysql_real_escape_string () [function.mysql-real-escape-string]: не удалось установить ссылку на сервер в /home/mexautos/public_html/kiubbo/data/article.php в строке 145 Предупреждение: mysql_real_escape_string () [function.mysql-real-escape-string]: доступ запрещен для пользователя 'mexautos' @ 'localhost' (с использованием пароля: НЕТ) в /home/mexautos/public_html/kiubbo/data/article.php on линия 146 Предупреждение: mysql_real_escape_string () [function.mysql-real-escape-string]: не удалось установить ссылку на сервер в /home/mexautos/public_html/kiubbo/data/article.php в строке 146

  • Я закрою тэг снаружи, как только исправлю, я не был уверен, работает ли он отдельно.

  • Вы правы, я получил неправильную переменную. Я изменил на $ _SESSION ['user'], и это сработало!

  • Я понимаю, что вы говорите: вместо того, чтобы писать ссылки с помощью цикла, просто выберите их и запишите, я проверю это, чтобы узнать, как это сделать.

  • Я использую идентификатор для этого, позвольте мне реализовать его.

Спасибо, CS

1 Ответ

9 голосов
/ 03 июня 2009

Что я хочу, чтобы он вставил «если», чтобы отобразить другое изображение, если пользователь уже проголосовал, я пробовал это, но он показывает ошибки

ошибки? ах-ха! может быть проблема ... с ошибками. Мой совет: удаляйте ошибки с метлой или громким шумом , тогда ваш код может работать.

если это не поможет, попробуйте их игнорировать. ошибки хотят вашего внимания. вот почему в PHP (и в большинстве других языков программирования) существует так много сообщений об ошибках и уведомлений . Уведомления - это маленькие детские ошибки, еще не опасные, но когда они вырастут, они могут уничтожать приложения намного больше, чем они есть.
Факт: если вы игнорируете их, они, как правило, уходят, потому что им скучно.

но если у вас есть очень постоянные ошибки, которые все равно не исчезнут, возможно, есть другая тактика:

размещать непристойные картинки ошибок в интернете, желательно на SO (ТАК программисты TMZ). ошибки горды и тщеславны, поэтому большинству из них так стыдно, что они прячутся под скалой и плачут, пока все не затуманивается. делайте это только если у вас нет сердца.

Обновление:

я не хотел быть здесь недружелюбным или невежливым, просто в вашем коде много чего не так, и я высмеял тот факт, что вы сказали нам там WERE сообщения об ошибках, но вы не сказали нам ЧТО они сказали . поэтому мы знаем, что «это не работает» и все еще можем только догадываться… и нет, это не помогает «стереть эти 3 строки кода», или, возможно, так и есть. какие 3 строки? 3 случайные строки? проблема: это не выглядит слишком неправильно, никаких явных синтаксических ошибок или чего-то еще. это может работать . но это бессмысленно.

  • во-первых, parent::closeConnection($db); является мертвым кодом, потому что функция либо возвращает true, либо false, и никогда не достигает кода (parent::closeConnection($db); ) ниже. это не принесет никакого вреда, потому что обычно соединения с базой данных закрываются автоматически в конце скрипта. это может быть даже лучше, если getConnection возвращает существующий дескриптор, иначе он будет открывать / закрывать соединения для каждого запроса. Да, это плохо. Либо откройте соединение один раз в начале вашего скрипта, либо, если вы используете его в первый раз.

  • ваше утверждение catch не имеет особого смысла. вы, очевидно, не обрабатываете ошибку, вы просто передаете исключение (я даже не уверен, допустимо ли это. Хотя вы могли бы добиться того же, игнорируя весь процесс обработки исключений). Вы справляетесь с этим где-то еще?

  • строка имени пользователя в вашем sql-запросе не экранирована, поэтому, возможно, злоумышленник может использовать ее для sql-инъекции. зависит от того, откуда вы получите свое имя пользователя. ты уверен что все продезинфицировал?

  • вы открываете a-тег вне оператора if, но закрываете его внутри. это не незаконно, потому что это работает. но это некрасиво более того, приятно, что у вас есть ссылка, хотя вы уже проголосовали. Итак, вы можете поднять статью более одного раза? я сомневаюсь. Я думаю, что вы должны быть в состоянии отозвать свой голос, но имхо было бы лучше иметь отдельное действие для этого. может быть upvote и unvote? удобочитаемость, удобство обслуживания, я не твоя мать, но, пожалуйста, держи свою базу кода в чистоте (и да, я лицемер).

давайте проанализируем ваше if-утверждение:

if($articles[$index]->has_voted($articles[$index]->getUsername()) == true) { ...

есть что-то вонючее: $articles[$index]->getUsername(). я предполагаю $article->getUsername() возвращает имя пользователя автора статьи. , поэтому вы проверяете, голосовал ли автор статьи за его собственную статью. Что вы, вероятно, хотите сделать, это отметить все сообщения VISITOR , не АВТОР , за который уже проголосовали. мы не можем вам в этом помочь, потому что мы не знаем код для получения данных о посетителях (что-то $ _SESSIONish).

  • итак, если вы хотите отметить статьи, за которые уже проголосовал пользователь. и kiubbo показывает 30 статей на своей первой странице. это означает, что вы запускаете sql-запросы в цикле, 30 запросов для каждого просмотра страницы, когда вам нужно ровно ноль для этого. почему ноль вместо одного? потому что вы должны оставить левый присоединиться к статьям на голосование, когда вы выбираете статьи. с другой стороны, я предполагаю, что вы получили много денег за некоторые дополнительные SQL-серверы и умение танцевать репликацию.

  • это не критично, но ... вы выбираете имя пользователя. нет ли идентификаторов? например, первичный ключ INT (11) authorID?

достаточно сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...