0

データベース テーブルにクエリを実行し、ユーザーが既に IP アドレスでアイテムに投票したかどうかを確認する方法について、いくつかのガイダンスが必要です。set_id、ip_address、および投票を格納するテーブルがあります。その人が投票すると、すでに投票したことを示すメッセージが表示されます。これはIfステートメントで行われます。

コントローラーで試した2つの方法があります。

$setDao->getRatingByIp($ipAdress);

私はこれを要求しています:

$ipAddress = $this->_request->getClientIp();

SQL クエリでは、IP アドレスが返されますが、set_id を取得する方法がありません。

モデル内の関数は次のとおりです。

public function getRatingByIp($ipAddress)
{
    $sql = "SELECT ip_address FROM " . $this->_prefix . " media_set_rating WHERE set_id = " . $ipAddress);
    $result = mysql_query($sql);
    return mysql_num_rows($result);
}

私が試した2番目は配列でした:

$ip = array();
    $ip['set_id'] = $setId;
    $ip['ip_address'] = $ipAddress;     
    $setDao->getRatingByIp($ip);

これはうまくいくと思いますが、上記のクエリでそれを実装する方法がわかりません。いくつかの配置を試しましたが、SQL チェックを実行しても何も返されません。echo $sql; exit;

5 月 29 日午後 11 時 28 分更新

(ウィジェット) コントローラー全体を次に示します。

    protected function _prepareShow() 
{
    $setId  = $this->_request->getParam('set_id');
    $rating = $this->_request->getParam('rating');
    $grades = $this->_request->getParam('grades');
    $pageUrl      = $this->_request->getPathInfo();
    $ipAddress = $this->_request->getClientIp();
    $limit = 3;

    $conn = XXX_Db_Connection::factory()->getSlaveConnection();
    $setDao = XXX_Model_Dao_Factory::getInstance()->setModule('media')->getSetDao();
    $setDao->setDbConnection($conn);



    $ip = array();
    $ip['set_id'] = $setId;
    $ip['ip_address'] = $ipAddress;

    $setDao->getRatingByIp($ip);

    $grades = $setDao->gradeRound($setId);

    if ($this->_request->isPost('rating')) {



        $rating = new Media_Models_Set(array(
            'set_id'       => $this->_request->getPost('setId'),
            'ip_address'   => $this->_request->getClientIp(),
            'rating'       => $this->_request->getPost('rating'),
        ));

        $setDao->rate($rating);

        $ratings = new Media_Models_Set(array(
            'set_id'       => $this->_request->getPost('setId'),
            'rating'       => $this->_request->getPost('rating'),
            'grades'       => $this->_request->getPost('grades'),
        ));

        $setDao->averageRating($ratings);

        $flashMessenger = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger');
        $flashMessenger->addMessage($this->_view->translator()->widget('send_rating_success'));

        $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
        $redirector->gotoUrl($this->_view->APP_URL . $pageUrl . '#rateForm');
    }
    $this->_view->assign('ip', $ip);
    $this->_view->assign('set_id', $setId);
    $this->_view->assign('rating', $rating);
    $this->_view->assign('grades', $grades);
}

情報を渡す最後の試みとして、配列はそこに残されました。

2013 年 5 月 31 日更新

私は今、うまくいく解決策を持っています。私はこれに数日間コードを投げていましたが、最終的にいくつかのことに気づきました。1 つは、最初から set_id を持っていなかったことです。私はそれを要求していましたが、適切な方法で行われませんでした。もう 1 つは、ビューに setId を含めていたため、その必要がなかったことです。Orangpill が提案した以下のコードは、set_id を取得したので動作すると思われます。しかし、私は別のアプローチを取りました。ご助力いただきありがとうございます。

4

2 に答える 2

0

問題を誤解しているかもしれませんが、次のように簡単にできますか?

public function hasPersonVoted($ipAddress, $setId)
{
    $sql = "select * as qty from ".
           "from `".$this->_prefix."media_set_rating` ".
           "where set_id=".mysql_real_escape_string($setId)." and ".
                 "ip_address = ".mysql_real_escape_string($ipAddress);
    $res = mysql_query($sql);
    return mysql_fetch_assoc($res);
}

何も見つからない場合、何かが見つかった場合は false を返す必要があり、比較で真になる行を返す必要があります。

コメントによると、$this は拡張コントローラーであると想定しています。拡張テーブル オブジェクトの場合は、使用できますreturn $this->getAdapter()->fetchAll($sql);

于 2013-05-30T03:26:35.360 に答える
0

コントローラーの変更点は次のとおりです。

$setId  = $this->_request->getParam('set_id', 1); I added the 1. 

このメソッドを使用して、2 つのパラメーターをモデルに渡しました

        $params = new Media_Models_Set(array(
        'set_id'       => $setId,
        'ip_address'   => $this->_request->getClientIp(),
    ));

    $param = $setDao->getRatingByIp($params);

次に、ビューにパラメーターを追加しました

$this->_view->assign('param', $param);

モデルでは、クエリにこのメソッドを使用しました

     public function getRatingByIp($params) 
 {       
    $sql = sprintf("SELECT * FROM " . $this->_prefix . "media_set_rating
                    WHERE set_id = '%s' and ip_address = '%s'",
                    mysql_real_escape_string((int)$params->set_id),
                    mysql_real_escape_string($params->ip_address));
    $result = mysql_query($sql);
    return mysql_num_rows($result);
 }

次に、最後にビューで、カウントに反するifステートメントを追加しました。

 <?php if ($this->param > 0) : ?>
 <div class="grid_12"><div class="message"><?php echo $this->translator()->widget('already_voted'); ?></div></div>
 <?php else: ?>
 Rate form goes here!
 <?php endif; ?>
于 2013-06-01T01:42:57.043 に答える