2015-10-28 3 views
1

Я совершенно не знаком с PDO, поэтому прошу прощения, если я сделал здесь простую ошибку. Кроме того, если об этом ответили ранее. Я искал, но не мог найти. Моя проблема заключается в том, что когда я печатаю сеансы, он печатает «Array ([user_id] => 1)», но имя пользователя и пароль, которые я ввел для user_id 2. Я пробовал это с использованием имени пользователя и пароля, и он по-прежнему дает id 1. Таким образом, я выделил $ user_id до создания сеанса, и это 1. Но я не могу понять, откуда он получает это 1? Потому что в базе данных нет идентификатора 1. Может кто-нибудь пролить некоторый свет на это?PDO возвращает неправильное значение

Вот код из моего входа в файл:

<?php 
require 'core.inc.php'; 

if(isset($_POST['username']) && isset($_POST['password'])) { 
$username = $_POST['username']; 
$password = $_POST['password']; 

if (!empty($username) && !empty($password)) { 
    $stmt = $db->prepare("SELECT password FROM users WHERE username = ?"); 
    $stmt->bindParam(1, $username); 

    $hash = $stmt->execute(); 
    $password_verified = password_verify($password, $hash); 

    if ($password_verified = true) { 
     $stmt_id = $db->prepare("SELECT id FROM users WHERE username = ?"); 
     $stmt_id->bindParam(1, $username); 

     $user_id = $stmt_id->execute(); 
     echo $user_id; 

     $id_num_rows = $stmt_id->rowCount(); 
     if ($id_num_rows == 0) { 
      echo 'You have entered a wrong password'; 
     }else if($id_num_rows == 1){ 

      $_SESSION['user_id'] = $user_id; 
      print_r($_SESSION); 
     } 
    } else { 
     echo("Please enter a username and password."); 
    } 
} 
} 
?> 
<!DOCTYPE html> 
<header> 

</header> 
<body> 
<form action ="<?php echo $current_file;?>" method="post"> 
<div class='field'> 
    <label for="username">Username: </label><input type='text' 
              name='username'/><br> 
</div> 

<div class='field'> 
    <label for ="password">Password: </label><input type='password' 
               name='password'/> 
</div> 

<div class='field'> 
    <label for='remember'> 
     <input type='checkbox' name="remember" id="remember"/> Remember me 
    </label> 
</div> 
<input type='submit' value='Log in'/> 

</form> 
</body> 
</html> 

<And here is the code from core.inc.php 

<?php 
session_start(); 
require 'connect.inc.php'; 

ob_start(); 
$current_file = $_SERVER['SCRIPT_NAME']; 
@$http_referer = $_SERVER['HTTP_REFERER']; 

function loggedin(){ 
    if(isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])) { 
     return true; 
    }else{ 
     return false; 
    } 
} 

?> 

<Core.inc.php uses connect.inc.php which is added below: 
<?php 
try { 
$db = new PDO('mysql:host=localhost;dbname=goal;charset=utf8','root',''); 
var_dump($db); 
echo 'connected'; 
} 
catch(Exception $e){ 
echo 'Error 1 has occured'; 
} 
?> 
+0

Я не понимаю, что вы принимаете пароль, но не используете его для варификации. – WisdmLabs

+0

Вы не получаете набор результатов PDO ('execute()' этого не делает). Как только вы исправите это (см. Обман), ваш код должен запуститься – Machavity

+0

@Machavity благодарит много. Очень помог. – Niall

ответ

0

Линия

if ($password_verified = true) { 

очень неправильно, потому что вы в основном только назначая true к $password_verified. Вы должны просто делать if($password_verified), хотя я не уверен, решит ли он вашу проблему.

Вы также не разбираете результаты, как и следовало использовать fetchAll(), а затем просматриваете результаты, чтобы узнать, существует ли пользователь.

1
$stmt_id->execute(); 

Возвращает TRUE, на Succes, или в случае возникновения ошибки, вы должны использовать результат запроса (а не статус исполнения):

$stmt_id->fetchAll() 

Также вы здесь ошибку, вам нужно использовать сравнение, а не назначение:

if ($password_verified = true) 
Смежные вопросы