- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经尝试发布一些关于这个问题的帖子,但我决定在最后一个帖子中收集所有内容,希望能以某种方式解决它。
我正在构建一个网站,用户可以在该网站上对数据库中的问题进行投票。没有登录,因此,为了确保每个人只能为每个问题投票一次,我将他们的 IP 与问题的 ID 一起使用。
首先,我获取 ID 和 IP 地址并存储两者,确保它们是整数:
if(isset($_GET['id']))
{
//Get IP address
//Test if it is a shared client
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
//Is it a proxy address
}elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip=$_SERVER['REMOTE_ADDR'];
}
//Save id and IP address as variables
$id = $_GET['id'];
$ip_long = ip2long($ip);
然后我使用这两个变量检查用户是否已经投票。这是我预计会出现问题的地方。我得到一个:
Notice: Trying to get property of non-object
第 116 行是:$row_cnt = $result->num_rows
。
此外 var_dump ($result)
返回 bool(false)
并且 var_dump ($row_cnt)
返回 Null
.在查询中的两个变量周围添加引号,$ip_long 和 $id 修复了本地主机上的问题,但不是在我的服务器上。
在变量周围加上引号的本地 var_dump($result)
返回以下内容:
object(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(1) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) }
我想为特定问题的 QuestionVotes 添加 1,然后删除为特定 IP 地址对同一问题投票的选项。
//Save id and IP address as variables
$id = $_GET['id'];
$ip_long = ip2long($ip);
///Check to see if user already voted
$stmt = $conn->prepare("SELECT * FROM User_Votes where UserID = ? and QuestionID = ?");
mysqli_stmt_bind_param($stmt, 'ss', $ip_long, $id);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows){
//The user has already voted
echo "Already voted";
}else{
//Add IP Address and ID to the User_Votes table
$stmt = $conn->prepare("INSERT INTO User_Votes (UserID, QuestionID) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, 'ss', $ip_long, $id);
$stmt->execute();
$stmt = $conn->prepare("UPDATE Question SET QuestionVotes = QuestionVotes + 1 where QuestionID = ?");
mysqli_stmt_bind_param($stmt, 's', $id);
$stmt->execute();
}
}
最后,这是我用来构建包含数据库问题信息的 html 框的代码,添加一个显示当前投票的投票按钮,并将用作 QuestionID 的内容附加到 url:
// Build 4 question boxes from database Question table, including voting button
$stmt = $conn->prepare("SELECT * FROM question ORDER BY QuestionVotes DESC LIMIT 4");
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
//$row["QuestionID"] to add id to url
echo "<div class=\"col-md-3\"><h2>". $row["QuestionHeader"]. "</h2><p>". $row["QuestionText"]. "</p><p><a href=\"index.php?id=". $row["QuestionID"]. "\" class=\"btn btn-success\"> " . $row["QuestionVotes"] . "</a></p></div>";
}
}
else
{
echo "0 results";
}
我的表格如下:
问题:QuestionID(int11)(pk)、QuestionHeader(varchar(20))、QuestionText(text)、QuestionVotes(int(5))
User_Votes: UserID(unsigned, int(39)), QuestionID(int(11))
最佳答案
有几件事我想指出。 首先,您的错误:
I get a 'Notice: Trying to get property of non-object' from line 116 which is: $row_cnt = $result->num_rows;.
当您使用未找到任何结果的选择查询调用 mysqli->query()
时,返回的对象不是对象而是 false
。
其次,不用COUNT(*)
,只用*
。
所以为了保持你的逻辑,你应该做这样的事情:
//Check to see if user already voted
$result = $conn->query("SELECT * FROM User_Votes where UserID = '$ip_long' and QuestionID = '$id'");
if ($result === false) {
//Add IP Address and ID to the User_Votes table
$result = $conn->query("INSERT INTO `User_Votes` (`UserID`, `QuestionID`) VALUES ('$ip_long', '$id')");
}elseif($result && $result->num_rows) {
//The user has already voted
echo "Already voted";
}
已编辑:
//Check to see if user already voted
$result = $conn->query("SELECT * FROM User_Votes where UserID = '$ip_long' and QuestionID = '$id'");
if($result->num_rows){
//The user has already voted
echo "Already voted";
}else{
//Add IP Address and ID to the User_Votes table
$result = $conn->query("INSERT INTO User_Votes (UserID, QuestionID) VALUES ('$ip_long', '$id')");
}
重新编辑:
您必须在 $stmt->execute()
之后调用 $stmt->store_result()
。并且您的 $stmt->get_result()
在这里是不必要的,因为您没有使用选定的数据。
来自 documentation 的部分评论:
If you do not use mysqli_stmt_store_result( ), and immediatley call this function after executing a prepared statement, this function will usually return 0 as it has no way to know how many rows are in the result set as the result set is not saved in memory yet.
所以你的代码应该是这样的:
if(isset($_GET['id']) && !empty($_GET['id'])){
$id = $_GET['id'];
$ip_long = ip2long($ip);
//Check to see if user already voted
$stmt = $conn->prepare("SELECT * FROM User_Votes where UserID = ? and QuestionID = ?");
$stmt->bind_param('ss', $ip_long, $id);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows){
//The user has already voted
echo "Already voted";
}else{
//Add IP Address and ID to the User_Votes table
$stmt = $conn->prepare("INSERT INTO User_Votes (UserID, QuestionID) VALUES (?, ?)");
$stmt->bind_param('ss', $ip_long, $id);
$stmt->execute();
$stmt = $conn->prepare("UPDATE Question SET QuestionVotes = QuestionVotes + 1 where QuestionID = ?");
$stmt->bind_param('s', $id);
$stmt->execute();
}
}
旁注:请不要混合 mysqli
的面向过程和面向对象的风格。
关于php - 根据保存在数据库中的 IP 地址删除特定对象的投票访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34183571/
我在网站上实现了一个简单的向上/向下投票系统,并且我会跟踪个人投票以及投票时间和唯一用户 ID(散列 IP)。 我的问题不是如何计算投票的百分比或总和 - 但更多的是,根据投票确定好分数的好算法是什么
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and t
我有一个 Rails 应用程序,其中我的 Posts 模型有评论并且评论是可投票的。我正在使用 acts_as_votable。 我目前正在对评论进行投票。现在我正在尝试实现一些 javascript
几天前我刚刚开始使用 SQLAlchemy,现在我遇到了一个问题,我希望任何人都可以在我失去所有头发之前弄清楚。 当我运行单元测试时,请参阅下面的代码片段,只有序列中的第一个测试通过。测试 testP
有没有办法以编程方式访问Outlook电子邮件的“投票”功能?我希望能够发送启用了投票的电子邮件,并获得答复(最好是不进行投票)。 谢谢! 最佳答案 听起来您想使用Outlook对象模型中的MailI
我正在使用这个JQuery Ajax Voting system guide作为一个粗略的引用,但我对此的安全性有点担心。现在这个指南基本上存储了一些东西的ID和它的投票统计数据。 我想提出类似的想法
我正在使用 disqus 2012。我已经在我的网站上实现了评级系统,所以希望删除评论右上角的星号,因为它有点困惑。当我将鼠标悬停在上面时,它会显示“投票”。无论如何要从我的评论中删除它? 最佳答案
我有一个 PHP 系统,允许用户以 1 - 5 的范围对照片进行投票,我想要做的是突出显示两个人给彼此相同的投票/分数的地方。我目前无法弄清楚我的 PHP 函数的 SQL。 数据库看起来像这样 id,
tasker 等应用如何捕获上下文。假设我想捕捉当 wifi 打开时做某事的上下文。是否可以为 isWifiEnabled() 附加回调?或者在没有轮询的情况下启用 wifi 时执行处理程序。示例代码
Python(以及 StackOverflow)新手。试图弄清楚如何让它正确执行。虽然程序本身执行得很好,但我希望它没有额外的步骤。我的意思是,如果第一个语句失败,我想终止并打印与 else 语句相关
有什么方法可以制作一个安全的 php 投票系统吗?我会尝试存储 IP 地址,但有动态 IP。聪明的人可以重新连接并投票两次。 Cookie 也很容易破解。 最佳答案 任何跟踪用户的方式:cookies
我正在处理 Django tutorials ,现在我正在创建一个民意调查。 在我想创建选择之前,下面的代码工作正常,但出于某种原因,我总是收到此错误消息: line 22, in __unicode
我正在实现一些需要公共(public)轮询才能从服务器获取新值的对话框。我正在尝试使用 p:poll,但不幸的是我无法阻止它。我在用户单击一个对话框中的按钮时开始投票,并在用户单击子对话框中的按钮时尝
嘿,我需要手动将投票系统实现到模型中。 我从 Mike DeSimone 那里得到了巨大的帮助,首先完成了这项工作,但我需要扩展他的工作。 这是我当前的代码 查看 def show_game(requ
我正在实现一个投票系统,当我想使用 AJAX 更新投票数时,我会刷新所有出版物的计数。但我不能只刷新一份出版物。查看我的 HTML: @foreach($publications as $public
目前我正在投票 SCM H H(0-8) * * 5 我的意思是:周五午夜到早上 8 点之间进行民意调查。 我想要的是每隔一个星期五进行一次投票。 最佳答案 接受的答案在 Jenkins 中不起作用:
function vote() { = 1) { ?> alert("
我有一个大数据文件,该文件会不断地(同步地)被现场的测量设备附加到该文件中。我需要将最新的数据同步传送到这个文件到在线仪表板。我说等时是因为“仪表板”不关心显示数据流(高延迟情况),它只关心发送给它的
我正在学习 djangoproject.com 教程。我使用 pyCharm 设置了一个虚拟项目。在我的终端命令行上,我 cd 进入包含 manage.py 的文件夹,然后运行该行。python ma
我有一个正在尝试修改的 php/mysql 轮询。 如果您已经投票,它会设置一个唯一的 cookie,如果设置了 cookie,它会阻止您在同一个民意调查中投票两次。如果已设置,则您只能看到结果。 我
我是一名优秀的程序员,十分优秀!