好吧,我正试图让人们每24小时投票给一台“服务器”,但是现在,我被困在这里:
function vote1() {
$pull = $_SERVER['REMOTE_ADDR'];
$votersIp = "select votersIp from voters";
$usersIp = $_SERVER['REMOTE_ADDR'];
$fetch = mysql_query("SELECT * FROM voters WHERE votersIp = '".$_SERVER['REMOTE_ADDR']."'");
while($rude = mysql_fetch_array($fetch)){
if($rude[votersIp] != $pull) {
$zoot="INSERT INTO voters (votersIp, lastVoted) VALUES ('$usersIp', '0')";
mysql_query($zoot) or die ( mysql_error() );
echo 'Voters IP not in database'; //debugging
}
if($rude[votersIp] = $pull) {
echo 'found ip'; //debugging
}
}
所以,如果你不能说,我试图让每次有人投票时,它都会将他们的IP地址添加到数据库中。我知道我在做一些非常基本的错误,但我还在学习。
如果您可以发布修复程序,我会很感激,但也会解释我做错了什么,而且任何建议都会很棒。
谢谢!
答案 0 :(得分:4)
您的代码中存在多个问题。
}
或while
function
我们不需要遍历所有选民表来查明数据库中是否有IP。我们可以在SQL命令中使用WHERE
子句,如下所示:SELECT votersIp FROM voters WHERE votersIp = $userIp
有很多不必要的变量,名字很奇怪。
作为一项安全措施,我们将作为SQL命令的一部分使用的任何内容都应该被转义,以避免受到某些类型的攻击。</ p>
当数组索引是字符串时,它们应该在引号之间。因此,$rude[votersIp]
是错误的,而$rude['votersIp']
是正确的。 (如果没有引号,PHP会将其解释为常量,而不是字符串。)
$rude[votersIp] = $pull
语句是变量赋值。您应该使用正确的运算符==
来比较值:$rude[votersIp] == $pull
糟糕的缩进使得我们这些人类读者难以理解代码。好的缩进更好。
while
循环是在搜索特定IP的查询结果上完成的。这意味着其中if
的第一个条件永远不会是真的(不同的IP),所以永远不会运行INSERT
。
以下是改进版本:
function vote()
{
$ip = $_SERVER['REMOTE_ADDR'];
$select = 'SELECT votersIp FROM voters WHERE votersIp = "' . mysql_real_escape_string($ip) . '"';
$search = mysql_query($select);
$voter = mysql_fetch_array($search);
if (!empty($voter))
{
echo 'found ip'; //debugging
}
else
{
echo 'Voters IP not in database'; //debugging
$insert = 'INSERT INTO voters (votersIp, lastVoted) VALUES ("' . mysql_real_escape_string($ip) . '", "0")';
mysql_query($insert);
}
}
建议:你应该阅读并学习一本关于初学者编程的好书。由于我不能为您推荐一本特定的书,我建议您要求推荐一本书。对于初学者来说,这是一本学习如何编程的好书。
答案 1 :(得分:3)
您的逻辑需要改进 - 您执行查询以获取其中包含特定IP的所有记录,然后循环遍历这些结果,并插入一条记录,如果您刚刚告诉数据库为您提取的IP不在结果
这就像进餐馆,点牛排,然后向服务员抱怨你送牛排(IP在数据库中)。如果餐馆没有牛排(IP未列出),您的代码什么也不做,只是忽略了投票,因为只有在数据库中已经知道IP才会记录。
你应该有这样的东西:
$fetch = mysql_query("SELECT count(*) AS cnt FROM voters WHERE votersIp='{$_SERVER['REMOTE_ADDR']}'") or die(mysql_error());
$row = mysql_fetch_assoc($fetch);
if ($row['cnt'] == 0) {
// ip is not in the database, allow the vote
} else {
// ip is listed, no vote for you!
}
答案 2 :(得分:2)
使用此:
function vote1() {
$mysqli=new mysqli("hostname", "username", "password", "database");
//Check to see if voter is in DB
$stmt = $mysqli->prepare("SELECT id FROM voters WHERE votersIp = ?");
$stmt->bind_param('s', $_SERVER['REMOTE_ADDR']);
$stmt->execute();
$stmt->bind_result($rude);
$stmt->fetch();
$stmt->close();
//If not, add him to the DB
if($rude[votersIp] != $_SERVER['REMOTE_ADDR']) {
//The DateTime
$mySqlDateTime= date("Y-m-d H:i:s", $_SERVER['REQUEST_TIME']);
//Insert Into DB
$stmt = $mysqli->prepare("INSERT INTO voters (votersIp, lastVoted) VALUES (?, ?,)");
$stmt->bind_param('ss', $_SERVER['REMOTE_ADDR'], $mySqlDateTime);
$stmt->execute();
$stmt->close();
echo "User Added";
}
else{ echo "User Already Exhists"; }
}
答案 3 :(得分:1)
你还没有提到实际出错的是什么,但你有问题:
if($rude[votersIp] = $pull) {
在这里,您要为$rude[votersIp]
分配$pull
的值而不是比较它 - 它应该是:
if($rude[votersIp] == $pull) {