2017-02-23 133 views
0

Я пытался понять это. Это довольно легко, но я просто не могу найти ошибку. Похоже, что ошибка в foreach, потому что все выше этого работает. Когда я заполняю входные данные и нажимаю кнопку «Вход», сценарий не будет работать.Логин не работает

if (isset($_POST['submit']) AND (!empty($_POST['username']) AND (!empty($_POST['password'])))) { 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $pass = hash('sha256',$password); 

    $select = $db->prepare("SELECT * FROM users WHERE username= :username AND password= :password"); 
    $select->bindParam(':username', $username); 
    $select->bindParam(':password', $pass); 
    $select->execute(); 

    foreach ($select as $data) { 
     if ($data['username'] == $username AND $data['password'] == $pass) { 
      $_SESSION['username'] = $username; 
      $_SESSION['id'] = $data['id']; 
      ?> 
      <div class="echos"> 
        <?php 
        echo "Login completed" . "<br>"; 
        echo "<a href='http://jezecek.nostools.cz/'>Homepage</a>"; 
     } 
     else { 
      echo "Wrong username or password!" . "<br>"; 
      echo "<a href='http://jezecek.nostools.cz/include/registration.php'>Try again</a>"; 
     }  
    } 
} 
else { 
    echo "Fill all fields!" . "<br>"; 
    echo "<a href='http://jezecek.nostools.cz/include/login.php'>Try again</a>"; 
} 
?> 
</div> 

Даже если я использую fetchAll(), как это, она по-прежнему не работает

$select = $db->prepare("SELECT * FROM users WHERE username= :username AND password= :password"); 
    $select->bindParam(':username', $username); 
    $select->bindParam(':password', $pass); 
    $select->execute(); 
    $result = $select->fetchAll(); 

    foreach ($result as $data) { 
     if ($data['username'] == $username AND $data['password'] == $pass) { 
      $_SESSION['username'] = $username; 
      $_SESSION['id'] = $data['id']; 
      ?> 
      <div class="echos"> 
        <?php 
        echo "Login completed" . "<br>"; 
        echo "<a href='http://jezecek.nostools.cz/'>Homepage</a>"; 
     } 
+2

Прежде всего: используйте 'pa ssword_hash() 'to * безопасно * хэш ваши пароли. просто вызов sha256 один раз является ** не ** безопасным. –

+0

забудьте получить данные после 'execute()'. Читайте http://php.net/manual/en/pdostatement.fetch.php – Saty

+0

Вам необходимо добавить обработку ошибок в вызовы базы данных, например, с помощью исключения исключения PDO. Обратите внимание, что ваша логика неверна: поскольку вы выбираете как имя пользователя, так и пароль, единственные строки, которые вы найдете, всегда соответствуют этим условиям. Неверное имя пользователя/пароль возникает, если в этом случае не найдено строк. – jeroen

ответ

1

ошибка происходит в Еогеасп, потому что вы не извлечение каких-либо данных из вашего запроса. Вы можете получить данные и проходное

$select->execute(); 
$data = $select->fetchAll(); 

foreach($data as $val) { 
    //..... 
+0

Это неверно, вы можете перебрать инструкцию PDO, поскольку она реализует Traversable. – jeroen

0

Fetch все строки в наборе результатов: -

$result = $select->fetchAll(); 
0

пожалуйста, получить данные перед укладыванием в цикле

$select->execute(); 
$data=$select->fetchAll(); 
0

Вы не нужен либо цикл, либо просто попробуйте это:

$data = $select -> fetch(); 
if($data) 
{ 
    // do login 
}