2014-10-31 2 views
0

После настройки этой системы входа в систему я обнаружил, что я не могу получить к ней доступ с моим Sql user/pass, , страница входа продолжает отклонять мои данные. Я пытался понять, в чем проблема, в течение 2 часов, Буду признателен за вашу помощь в этом!PHP Простая система входа в систему, которая просто не сработает

функция страницы (admin.php):

<?php 

global $pdo; 

function dbconnect() 
{ 
global $pdo; 
try { 
    $pdo = new PDO('mysql:host=localhost;dbname=pong','root',''); 
} catch (PDOException $e) { 
    die('connection failure! ' . $e->getMessage()); 
    } 
} 

function attempt($username, $password) 
{ 
global $pdo; 

$stmt = $pdo->prepare(' 
    SELECT id, username 
    FROM admin 
    WHERE username = :username AND password = :password 
    LIMIT 1'); 

$stmt->execute(array(':username' => $username, 'password' => md5($password))); 

if ($data = $stmt->fetch(PDO::FETCH_OBJ)) { 
    $_SESSION['username'] = $data->username; 
    return true; 
} else { 
    return false; 
} 
} 

function is_user() 
{ 
if (isset($_SESSION['username'])) 
    return true; 
} 

function redirect($url) 
{ 
header('Location: ' .$url); 
exit; 
} 

Вход в страницу (signin.php):

<?php 
require('admin.php'); 
session_start(); 
if (is_user()) { 
    redirect('../tv/game.php'); 
} 
?> 
<!doctype html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
    <title>Sign In</title> 
    <link rel="stylesheet" type="text/css" href="../css/pure-min.css"> 
    <link rel="stylesheet" type="text/css" href="../css/style.css"> 
    </head> 
    <body> 
    <div class="container"> 
     <h1>Sign In</h1> 

     <?php if (!empty($_GET['error'])): ?> 
     <p class="status status-error pure-input-1"><?php echo $_GET['error'] ?></p> 
     <?php endif ?> 

     <form action="signin_post.php" class="pure-form pure-form-stacked" method="post"> 
     <fieldset class="pure-group"> 
      <input type="text" class="pure-input-1" name="username" placeholder="username"> 
      <input type="password" class="pure-input-1" name="password" placeholder="password"> 

      <input class="pure-button pure-button-primary pure-input-1" type="submit" value="Sign In"> 
     </fieldset> 
     </form> 
    </div> 
    </body> 
</html> 

И signin_post.php:

<?php 
require('admin.php'); 
dbconnect(); 
session_start(); 

if ($_SERVER['REQUEST_METHOD'] === 'POST') { 

    if (attempt($_POST['username'], $_POST['password'])) { 
     header('Location:../tv/game.php'); 
    } 
    else { 
     header('Location: signin.php?error=' . urlencode('invalid login details')); 
     } 
} 

Спасибо заранее!

+3

Вы должны начать с удаления перенаправлений 'header', теперь вы не увидите никаких предупреждений. – jeroen

+1

спасибо jereon. Я удалил их, но все равно ничего .. – DotBot

+2

Вам нужно сузить проблему и выполнить 'var_dump()' 's переменных, о которых идет речь. – jeroen

ответ

2

Вашей текущей попытки() имеет пароль, связанный неправильно. Вам не хватает двоеточия перед паролем в инструкции выполнения. Есть гораздо лучшие способы обработки хэширования паролей, чем MD5, и функция PHP crypt() может помочь вам в этом. http://php.net/manual/en/function.crypt.php

+0

Спасибо за отзыв Andrew, я обязательно проверю его. все же я был бы рад решить это как есть до того, как я начну. Я добавил недостающую двоеточие, к сожалению, все еще не улучшилось! – DotBot

+0

Можете ли вы просто запустить простые запросы по имени пользователя и паролю и убедиться, что они возвращают объекты, которые вы ожидаете увидеть? Если они возвращают ожидаемые объекты, то, возможно, попробуйте провести проверку отдельно? Кроме того, ваш исходный оператор if ($ _ SERVER [...] не имеет возможности выйти, если требуемые условия не выполняются, поэтому, если метод GET, тогда должно быть другое, без else это бесполезная логика. Может быть, разделить if ($ _ SERVER [...) в отдельную проверку проверки, как if (! empty ($ _ POST) {..}, а затем проверить ваши объекты – HitMeWithYourBestShot

+0

Спасибо. Я проверил $ ​​_SERVER и получил данные $ _POST, которые являются 'array (size = 2) 'username' => string '12345' (length = 5) 'password' => string '12345' (length = 5) '. Я озадачен – DotBot

0

Я думаю, вы можете начать с редактирования функции attempt().

function attempt($username, $password) { 
    global $pdo; 

    $stmt = $pdo->prepare(' 
     SELECT id, username, password 
     FROM admin 
     WHERE username = :username 
     LIMIT 1'); 

    $stmt->execute(array(':username' => $username)); 

    if ($data = $stmt->fetch(PDO::FETCH_OBJ) AND $data->password == md5($password)) { 
     $_SESSION['username'] = $data->username; 
     $_SESSION['userid'] = $data->id; 
     return true; 
    } else { 
     return false; 
    } 
} 

или вы могли бы попробовать это:

function attempt($username, $password) 
{ 
global $pdo; 

$stmt = $pdo->prepare(' 
    SELECT id, username 
    FROM admin 
    WHERE username = :username AND password = :password 
    LIMIT 1'); 

$stmt->execute(array(':username' => $username, ':password' => md5($password))); 

if ($data = $stmt->fetch(PDO::FETCH_OBJ)) { 
    $_SESSION['username'] = $data->username; 
    $_SESSION['userid'] = $data->id; 
    return true; 
} else { 
    return false; 
} 
} 

Надеется, что это работает и помогает;) функции

+0

Спасибо jankal, но все же доступ запрещен. Что бы это могло быть? – DotBot

+0

Не могли бы вы вывести ошибки из журнала ошибок? Я думаю, что я нашел что-то. Я добавил свой идеал к ответу. – jankal

+0

Ух ... Надеюсь, вы используете разработку php.ini. Вы можете попробовать новый код;) Я надеюсь, что это сработает, но у меня нет вашего интерфейса. – jankal

Смежные вопросы