0

我需要一些关于如何查询数据库表并查找一个人是否已经通过 IP 地址对某个项目进行投票的指导。我有一个存储 set_id、ip_address 和投票的表。一旦该人投票,它会显示一条消息,表明他们已经投票。这将通过一个If声明来完成。

我在控制器中尝试了两种方法:

$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);
}

我尝试的第二个是一个数组:

$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 日更新

我现在有一个可行的解决方案。这几天我一直在扔代码,最后我意识到了一些事情。一个是我一开始就没有 set_id。我要求它,但它没有以适当的方式完成。另一个是我在视图中包含 setId 并且不需要这样做。Orangpill 建议的以下代码我相信现在我有了 set_id 就可以工作了。但是我采取了不同的方法。感谢你的帮助。

4

2 回答 2

0

These are the changes in the controller:

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

I used this method to pass the 2 parameters to the model

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

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

Then i added param to the view

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

In the model i used this method for query

     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);
 }

Then finally in the view i added an if statement to go against the count.

 <?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 回答
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);
}

如果没有找到任何东西,它应该返回一个假,如果找到Something,它应该返回在比较中是真实的行。

根据评论,我假设 $this 是一个扩展控制器。如果它是一个扩展表对象,您可以使用return $this->getAdapter()->fetchAll($sql);

于 2013-05-30T03:26:35.360 回答