У меня есть две страницы на моем сайте, одна называется «new_account.php», а другая - «visitor.php». Пользователь может самостоятельно создать новую учетную запись или просто перейти с учетной записи посетителя.file_get_contents для вставки в базу данных
Когда пользователь выбирает «посетителя», я делаю запрос на «new_account.php» для создания временной учетной записи со случайным именем пользователя и паролем, который будет удален позже, когда пользователь будет выполнен. Я использую file_get_contents
для запроса, так как страница возвращает пользовательский хеш, который я использую для автоматического входа в систему пользователя.
Это «visitor.php»:
$url = getBaseUrl().'new-account.php';
$data = array(
'name' => $tempName,
'character-name' => $tempCharacterName,
'gender' => $tempGender,
'age' => $tempAge,
'parent-email' => $tempParentEmail,
'password' => $tempPassword,
'password-confirmation' => $tempPassword,
'temporary' => TRUE
);
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data),
),
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
var_dump($result);
if($result != "error") {
User::loginUser($result, TRUE, $conn);
User::ifUserLoggedRedirect('game.php',$conn);
}
Моя проблема заключается в том, что, в то время как запрос успешно и новый случайный пользователь вставляется в базу данных, когда пользователь :: loginUser пытается запросить у пользователя данные с использованием хэша, возвращаемого file_get_contents
(например, значок пользователя или имя пользователя). Я получаю пустой набор результатов.
User::loginUser
это:
public static function loginUser($userHash, $temporary, $conn) {
if(User::isAnyLogged($conn))
User::logout($conn);
User::safeSessionStart();
$result = $conn->prepare('SELECT p.screen_name, pi.url, p.id FROM player as p, player_icon as pi WHERE p.user_hash=? AND pi.id = p.player_icon_id');
$result->bind_param('s',$userHash);
$result->execute();
$res = $result->get_result();
if($res->num_rows == 0) {
die("Invalid user with hash ".$userHash);
}
$user_info = $res->fetch_assoc();
$_SESSION['user'] = new User($userHash, $temporary, $user_info['screen_name'], $user_info['url'], $user_info['id']);
setcookie('userHash',$userHash);
setcookie('temporary',$temporary ? '1' : '0');
return $_SESSION['user'];
}
И вызов всегда умирает с неправильным хэш, но если запрос пользователя от PHPMyAdmin, используя хэш-пользователь на самом деле есть. Выполняется обычная регистрация путем доступа к «new_account.php».
Первое, что я пробовал, заключалось в закрытии и повторном открытии соединения после получения результата от file_get_contents
, но это не сработало. Использование mysqli::refresh
также не сработало. Я попытался переместить часть входа в код на «new_account.php», но, видимо, я также не могу установить $_SESSION
с запросом, используя file_get_contents
.
Я также мог бы решить эту проблему, скопировав новый код учетной записи на страницу посетителя, но я предпочел бы сохранить создание учетной записи на одной странице. Есть ли что-нибудь еще, что я могу попробовать?
new_account.php также имеет кучу HTML, так как это страница создания учетной записи. Было бы не так просто сделать это. Я мог бы передать создание учетной записи функции и вызвать ot из обоих мест, хотя ... hmm –
Вы всегда должны разделять проблемы. Разделите свою «бизнес-логику» и уровень презентации. Таким образом, у вас больше контроля над обоими без огромных побочных эффектов. – Structed