[英]PHP/MySQL: Not inserting into database
好吧,我正在努力做到這一點,以便有人可以每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地址添加到數據庫中。 我知道我在這里犯了一些非常基本的錯誤,但是我仍在學習。
如果您可以發布此修復程序,但也能解釋我做錯了,我將不勝感激,任何建議也都很好。
謝謝!
您的代碼中有幾個問題。
閉括號}
是缺失,無論是對while
或為function
我們不需要遍歷所有的選民表來查找IP是否在數據庫中。 我們可以在SQL命令中簡單地使用WHERE
子句,如下所示: SELECT votersIp FROM voters WHERE votersIp = $userIp
有很多不必要的變量具有奇怪的名稱。
作為安全措施,我們將逃逸用作SQL命令一部分的任何內容,以避免受到某些類型的攻擊的影響。
當數組索引是字符串時,它們應該在引號之間。 因此, $rude[votersIp]
是錯誤的,而$rude['votersIp']
是正確的。 (不帶引號的PHP將其解釋為常量而不是字符串。)
$rude[votersIp] = $pull
語句是變量分配。 您應該使用正確的運算符==
來比較值: $rude[votersIp] == $pull
縮進不好使我們的讀者更難以理解該代碼。 好的縮進效果更好。
while
循環是根據查詢特定IP的查詢結果完成的。 這意味着if
里面的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);
}
}
建議:您應該閱讀和學習有關初學者編程的好書。 由於我無法為您推薦一本書,因此建議您提出推薦書。 對於初學者來說,這是一本學習編程的好書。
您的邏輯需要改進-您進行查詢以獲取其中包含特定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"; }
}
您沒有提到實際出了什么問題,但是這里有一個問題:
if($rude[votersIp] = $pull) {
在這里,您為$rude[votersIp]
分配了$pull
的值,而不是對其進行比較-它應顯示為:
if($rude[votersIp] == $pull) {
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.