2016-09-26 9 views
1

Я пытаюсь создать webiste с Yahoo OpenID. Все работает нормально, пока я не выйду из системы, а затем снова войдите в систему. В моей базе данных sql я получаю дублированные результаты. Изменен только хеш. Кажется, что $ sql = $ db-> query ("SELECT * FROM users WHERE steamid = '". $ Steamid. "'"); не может найти пользователей с парочкой к нему, создает новую запись в db. Я тоже пробовал это с Steam, и он работает. С Yahoo я получаю повторяющиеся результаты с моим адресом электронной почты (здесь $ steamid) и именем (здесь $ name). Хеши разные.Результаты дублирования OpenID в базе данных

case 'login': 
    include 'openid.php'; 
    try 
    { 
     $openid = new LightOpenID('http://'.$_SERVER['SERVER_NAME'].'/'); 
     if (!$openid->mode) { 
      $openid->identity = 'https://me.yahoo.com/a/6eqERecwyZfHsDm6VBa7H2uWNu3W5.UvCw--'; //http://steamcommunity.com/openid/ 
      $openid->required = array(
       'contact/email', 
       'namePerson', 
      ); 
      header('Location: '.$openid->authUrl()); 
     } elseif ($openid->mode == 'cancel') { 
      echo ''; 
     } else { 
      if ($openid->validate()) { 

       //$id = $openid->identity; 
       //$ptn = "/^http:\/\/steamcommunity\.com\/openid\/id\/(7[0-9]{15,25}+)$/"; 
       //preg_match($ptn, $id, $matches); 

       //$url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=78DC279A43117B222DDEE0FCCCAD38FD&steamids=$matches[1]"; 
       //$json_object = file_get_contents($url); 
       //$json_decoded = json_decode($json_object); 
       //foreach ($json_decoded->response->players as $player) { 
        $data = $openid->getAttributes(); 
        $steamid = $data['contact/email']; 
        $name = $data['namePerson']; 
        //$avatar = $player->avatar; 
       //} 

       $hash = md5($steamid . time() . rand(1, 50)); 
       $sql = $db->query("SELECT * FROM `users` WHERE `steamid` = '" . $steamid . "'"); 
       $row = $sql->fetchAll(PDO::FETCH_ASSOC); 
       if (count($row) == 0) { 
        $db->exec("INSERT INTO `users` (`hash`, `steamid`, `name`) VALUES ('" . $hash . "', '" . $steamid . "', " . $db->quote($name) . ")"); 
       } else { 
        $db->exec("UPDATE `users` SET `hash` = '" . $hash . "', `name` = " . $db->quote($name) . "' WHERE `steamid` = '" . $steamid . "'"); 
       } 
       setcookie('hash', $hash, time() + 3600 * 24 * 7, '/'); 
       header('Location: http://45.55.69.74/'); 
      } 
     } 
    } catch (ErrorException $e) { 
     exit($e->getMessage()); 
    } 
    break; 
+0

Почему вы делаете fetchAll? Вы могли бы просто сделать '$ sql-> rowCount()' вместо этого. нет смысла заставлять php и db извлекать данные, форматировать их в php-массив, просто чтобы вы могли подсчитать количество записей в массиве, а затем выбросить все это. И теперь, когда вы уязвимы для [SQL-инъекций] (http://bobby-tables.com) –

+0

, пародия должна иметь уникальный индекс – e4c5

+0

@Marc B. Я все еще получаю дубликаты результатов в базе данных. Изменен только хеш. – Grizzlly

ответ

0

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