我需要一些关于如何查询数据库表并查找某个人是否已经通过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。但是我采取了不同的方法。感谢你的帮助。
答案 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; ?>