使用2个参数选择表中的记录

时间:2013-05-30 02:15:56

标签: php mysql zend-framework

我需要一些关于如何查询数据库表并查找某个人是否已经通过ip地址对项目进行投票的指导。 我有一个存储set_id,ip_address和vote的表。一旦该人投票,它就会显示一条消息,表明他们已经投了票。这将使用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。但是我采取了不同的方法。感谢你的帮助。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);

然后我在视图中添加了param

$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; ?>