2016-04-19 3 views
1

У меня есть сценарий входа, написанный в PDO. Когда пользователь входит в систему, они должны перенаправляться на index.php. Вместо этого они остаются на одной странице.Пользователь вошел в систему, но не перенаправил

<?php 

$db_username = "user"; 
$db_password = "pass"; 
$con = new PDO("mysql:host=localhost;dbname=db", $db_username, $db_password); 

if(isset($_POST['submit'])) { 

$username = $_POST['username']; 
$password = md5($_POST['password']); 

$logincheck = $stmt = $con->prepare("SELECT * FROM users WHERE username=:username and password=:password"); 
$stmt->bindParam(':username', $username); 
$stmt->bindParam(':password', $password); 
$stmt->execute(); 
$rows = $stmt->fetch(PDO::FETCH_NUM); 
if($rows > 0) { 
header('Location: index.php'); 
} 
} 
?> 

<form method="post"> 
<input type="text" name="username"> 
<input type="password" name="password"> 
<input type="submit" name="submit"> 
</form> 
+2

поставил выход после заголовка перенаправления – Mihai

+0

Для обеспечения безопасности паролей воспользуйтесь встроенными функциями PHP (http://jayblanchard.net/proper_password_hashing_with_PHP.html). Если вы используете версию PHP менее 5.5, вы можете использовать 'password_hash()' [пакет совместимости] (https://github.com/ircmaxell/password_compat). Убедитесь, что вы [не избегаете паролей] (http://stackoverflow.com/q/36628418/1011527) или используйте какой-либо другой механизм очистки для них перед хэшированием. Выполнение этого * изменяет * пароль и вызывает ненужное дополнительное кодирование. –

+0

использовать только целочисленное значение с выходом. попробуйте ответ Михая –

ответ

0
  1. Изменение if(isset($_POST['submit'])) в if(isset($_POST['username']) && isset($_POST['password']))

    , потому что представить тип не может отправить по форме

  2. Будьте уверены алгоритм хэширования

  3. изменения exit(header('Location: index.php')); в header('Location: http:// www.example.com/index.php');

    Потому что exit(); не подходит и вот синтаксическая ошибка.

заголовок должен быть отправлен отдельно и после того, что исполнение этой страницы уже вышли.

Я рассматриваю $con переменную предварительно набор и нет какой-либо ошибки в SQL выборки. Также в вашем коде отсутствует запись в базу данных PDO. И так много ошибок может быть.

использование сообщений об ошибках на в файле php.ini, чтобы отслеживать, что происходит на самом деле

+0

Пробовал оба ваши предложения, но не повезло. Я обновляю сообщение с переменной '$ con' и подключается база данных. –

+0

Какая ошибка сообщается в php ?? –

+0

Ошибок не сообщается –

0

У меня была эта проблема в последнее время работает над проектом, и единственное, что приходит мне на ум:

"**Warning:** Cannot modify header information - headers already sent (output started at /htdocs/your_project_name/your_file.php:X, where X is the line number)." 

Дважды проверьте свои ошибки; вставить это где-то на вершине в сценарии, который используется для обработки формы представления:

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 

Я был в состоянии заставить его работать, делая это:

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 

if ((isset($_POST['username']) && !empty($_POST['username'])) && 
    (isset($_POST['password']) && !empty($_POST['password']))) { 
    //echo $_POST['username']; 
    //echo $_POST['password']; 
    // these statements are commented out because they were 
    // displaying information before the header('Location: index.php') 
    // was called, uncomment this and try to see what I am talking about 

    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $db_username = 'root'; 
    $db_password = 'root'; 
    // always use try-catch when working with databases, api's, etc. 
    try 
    { 
    $dbconn = new PDO('mysql:host=localhost;dbname=db', $db_username, $db_password); 

    $stmt = $dbconn->prepare('SELECT * FROM users WHERE username=:username AND 
    password=:password LIMIT 1'); 
    $stmt->bindParam(':username', $username); 
    $stmt->bindParam(':password', $password); 

    $stmt->execute(); 

    if ($stmt->rowCount() > 0) 
    { 
     header('Location: index.php'); 
    } 
    } 
    catch (PDOException $e) 
    { 
    echo 'Database error: ' . $e->getMessage(); 
    } 
} 

Очевидно, что форма не изменение, за исключением того, что я добавил действие атрибут:

<form method="post" action="submit.php"> 
<!--form fields--> 
</form> 

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

  • phpsec.org/projects/guide/1.html#1.4

и здесь

  • php.net/manual/en/function.password-hash ,PHP

И это, в частности, как вы могли бы затем использовать эту функцию, чтобы проверить, является ли пароль совпадает:

http://php.net/manual/en/function.password-verify.php

Если вы все еще возникают проблемы и заголовки уже отправлены вопрос проблема, проверить это сообщение:

How to fix "Headers already sent" error in PHP

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