PHP/MySQL的:不插入到数据库
好吧,我试图让这个人可以投票选出“服务器”,每24小时,但目前,我被困在这里:PHP/MySQL的:不插入到数据库
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地址添加到数据库中。我知道我在这里做了一些非常基本的错误,但我仍然在学习。
如果您可以发布修复程序,但也解释我做错了什么,并且任何建议都会很棒,我将不胜感激。
谢谢!
有在你的代码的几个问题。
闭括号
}
缺失,无论是对while
或为function
我们并不需要遍历所有的选民表,以找出是否一个IP是在数据库或不。我们可以简单地用一个
WHERE
子句中的SQL命令,就像这样:SELECT votersIp FROM voters WHERE votersIp = $userIp
有很多奇怪的名字不必要的变量。
作为一项安全措施,我们将用作SQL命令一部分的任何内容都应该转义,以避免受到某些类型的攻击。
当数组索引是字符串时,它们应该在引号之间。所以,
$rude[votersIp]
是错误的,而$rude['votersIp']
是正确的。 (没有引号,PHP将其解释为常量,而不是字符串。)$rude[votersIp] = $pull
语句是一个变量赋值语句。您应该使用正确的运算符==
来比较值:$rude[votersIp] == $pull
不良缩进使得代码难以被我们,人类读者理解。良好的缩进比较好。
的
while
循环赖以搜寻SEARCH_TERM_EXAMPLES特定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);
}
}
建议:你应该阅读和学习有关编程初学者一本好书。由于我无法为您推荐特定的书籍,因此我建议您要求提供图书推荐。一本好书,学习如何编程,适合初学者。
感谢您的固定版本,并感谢更多的告诉我什么是错的! – Hunt3r 2012-02-23 04:21:29
您没有提到什么实际去错了,但你在这里有一个问题:
if($rude[votersIp] = $pull) {
在这里,你要分配$rude[votersIp]
的$pull
的值,而不是比较它的 - 它应该阅读:
if($rude[votersIp] == $pull) {
还缺少quotesIp'引号,但如果没有定义'votIp'常量,PHP会礼貌地将其视为引用字符串。 – 2012-02-23 01:23:43
我不知道这一点,因为我从来没有这样写他,但我不希望的情况下,说我错了,哈哈 – BenOfTheNorth 2012-02-23 01:24:25
其实,它不应该读'如果($粗鲁[votersIp] == $拉)“,但只是”其他“。 – kba 2012-02-23 01:50:58
你的逻辑需要改进 - 你做一个查询来获取带有特定IP的所有记录,然后遍历这些结果,并插入一条记录,如果你刚才告诉数据库为你提取的非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!
}
使用此:
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"; }
}
发生了什么? – 2012-02-23 01:23:56
正确缩进代码,删除不必要的换行符并删除未使用的变量。 – kba 2012-02-23 01:28:47