2012-02-23 3 views
0

Хорошо, я пытаюсь сделать так, чтобы кто-то может голосовать за «сервер» каждые 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-адрес в базу данных. Я знаю, что я делаю здесь что-то очень плохое, но я все еще участвую.

Я был бы признателен, если бы вы опубликовали исправление, но также объясните, что я делаю неправильно, и любые предложения также будут замечательными.

Спасибо!

+0

Что происходит? –

+0

Отредактируйте свой код правильно, удалите ненужные строки и удалите неиспользуемые переменные. – kba

ответ

4

Есть несколько проблем в вашем коде.

  1. закрывающая скобка } отсутствует, либо для while или для function

  2. Нам не нужно перебрать все таблицы избирателей, чтобы узнать, если IP находится в базе данных или не. Мы можем просто использовать предложение WHERE в команде SQL, например: SELECT votersIp FROM voters WHERE votersIp = $userIp

  3. Существует много ненужных переменных со странными именами.

  4. В качестве меры безопасности все, что мы будем использовать как часть команды SQL, должно быть экранировано, чтобы избежать уязвимости для некоторых типов атак.

  5. Когда индексы массива являются строками, они должны быть между кавычками. Итак, $rude[votersIp] ошибочен, а $rude['votersIp'] верен. (Без кавычек PHP интерпретирует его как константу, а не строку).

  6. Оператор $rude[votersIp] = $pull представляет собой переменное назначение.Вы должны использовать правильный оператор == для сравнения значений: $rude[votersIp] == $pull

  7. Плохой отступ делает код более понятным для нас, читателей. Хороший отступ лучше.

  8. Цикл 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); 
    } 
} 

Предложение: вы должны читать и изучать хорошую книгу о программировании для начинающих. Поскольку я не могу рекомендовать вам конкретную книгу, я предлагаю вам запросить рекомендацию по книге. Хорошая книга, чтобы узнать, как программировать, для новичков.

+0

Спасибо за исправленную версию, и спасибо еще больше за то, что рассказали мне, что было не так! – Hunt3r

1

Вы не упомянули, Что на самом деле происходит не так, но у вас есть проблема здесь:

if($rude[votersIp] = $pull) { 

Здесь вы назначаете $rude[votersIp] Значение $pull вместо сравнения его - он должен прочитать:

if($rude[votersIp] == $pull) { 
+0

Также отсутствуют котировки вокруг 'votersIp', хотя PHP будет вежливо рассматривать его как строку с кавычками, если не определена константа' votersIp'. –

+0

Я не был уверен в этом, поскольку я никогда не писал так, как он есть, но я не хотел говорить на случай, если я ошибся. Haha – BenOfTheNorth

+1

На самом деле, он не должен читать 'if ($ rude [votersIp] == $ pull) 'либо, а просто' else'. – kba

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

Используйте это:

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"; } 
} 
Смежные вопросы