2014-12-05 6 views
1

Я начинаю учиться PDO и при этом решил переписать мой старый код mysql_*. Таким образом, у меня есть форма входа в систему, которая в соответствии с перенаправлением userlevel перенаправляется в разные местоположения. Это делается (I think since I can login correctly). Затем, когда перенаправляет меня, у меня есть запрос, который в зависимости от userlevel показывает некоторый результат из базы данных. Проблема в том, что она ничего не возвращает и ошибок в файле журнала нет. Это мой логин. Правильно ли я делаю это?PDO-запрос с сессией ничего не возвращает

session_start(); 
if(isSet($_POST['submit'])) { 
include 'misc/database.inc.php'; 
$pdo = Database::connect(); 

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

    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); 

    $stmt->bindParam(':username', $username); 
    $stmt->bindParam(':password', $password); 

    $stmt->execute(); 

    $res = $stmt -> fetch(); 

if ($res['userlevel'] == 1) 
{ 
    // Save type and other information in Session for future use. 
     $_SESSION['username'] = $username; 
     $_SESSION['password'] = $password; 
     $_SESSION['userlevel'] = $userlevel; 

    header("location: admins/main.php"); 
} 
elseif ($res['userlevel'] >= 4) 
{ 
     $_SESSION['user_id'] = $id; 
     $_SESSION['username'] = $username; 
     $_SESSION['password'] = $password; 
     $_SESSION['userlevel'] = $userlevel; 
     $_SESSION['firstname'] = $firstname; 
     $_SESSION['lastname'] = $lastname; 
     $_SESSION['user_image'] = $user_image; 
     $_SESSION['email'] = $email;  
     header('Location: users/main.php'); 
} 
else 
{ 
    header("location: index.php"); 
} 
// Closing MySQL database connection 
$pdo = null; 
} else { 

И это вопрос, который я хочу, чтобы выполнить в main.php при входе согласно userlevel

<?php 
include '../misc/database.inc.php'; 
$pdo = Database::connect(); 
$q = "SELECT * FROM ras AS r 
    LEFT JOIN user_ras AS r2u ON r.userlevel = r2u.ras_userlevel 
    LEFT JOIN users AS u ON r2u.user_userlevel = u.userlevel where menu = '".$_SESSION['userlevel']."'"; 

foreach($pdo->query($q) as $res) 
{ 
    echo '<a href="users/ras.php?rest_id='. $res['ras_id'] .'">'.$res['name'].'</a>'; 

} 
Database::disconnect(); 
?> 

Как я сказал, что я совершенно новым для PDO так, пожалуйста, медведь со мной, и если вы можете Помоги мне. Спасибо.

Update - database.inc.php

<?php 
class Database 
{ 
private static $dbName = 'dbname' ; 
private static $dbHost = 'localhost' ; 
private static $dbUsername = 'user'; 
private static $dbUserPassword = 'pass'; 

private static $cont = null; 

public function __construct() { 
    die('Init function is not allowed'); 
} 

public static function connect() 
{ 
    // One connection through whole application 
    if (null == self::$cont) 
    {  
    try 
    { 
     self::$cont = new PDO("mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword); 
    } 
    catch(PDOException $e) 
    { 
     die($e->getMessage()); 
    } 
    } 
    return self::$cont; 
} 

public static function disconnect() 
{ 
    self::$cont = null; 
} 
} 
?> 
+0

'session_start();' должен быть внутри всех файлов с помощью сессий. –

+0

Да, у меня есть внутри main.php. Фактически, когда я регистрирую пользователя, я вижу его имя пользователя ' ', поэтому сеанс работает. Но запроса нет. –

+0

'r2u.user_userlevel' вы уверены, что не имели в виду' r2u.userlevel'? Трудно сказать, что присоединение - это не то, на что я способен. add '$ pdo-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);' сразу после открытия соединения. –

ответ

3

где указаны переменные, которые вы назначаете на сеанс $id, $userlevel, $firstname, $lastname, $user_image, $email? Они не определены, в данный момент:

$_SESSION['user_id'] = $id; 
    $_SESSION['userlevel'] = $userlevel; 
    $_SESSION['firstname'] = $firstname; 
    $_SESSION['lastname'] = $lastname; 
    $_SESSION['user_image']= $user_image; 
    $_SESSION['email']  = $email; 

Я думаю, что вам нужно это

session_start(); 
if(isSet($_POST['submit'])) { 
include 'misc/database.inc.php'; 
$pdo = Database::connect(); 

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

    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); 

    $stmt->bindParam(':username', $username); 
    $stmt->bindParam(':password', $password); 

    $stmt->execute(); 

    $res = $stmt -> fetch(); 

if ($res['userlevel'] == 1) 
{ 
    // Save type and other information in Session for future use. 
     $_SESSION['username'] = $username; 
     $_SESSION['password'] = $password; 
     $_SESSION['userlevel'] = $res['userlevel']; 

    header("location: admins/main.php"); 
} 
elseif ($res['userlevel'] >= 4) 
{ 
     $_SESSION['user_id'] = $res['id']; 
     $_SESSION['username'] = $username; 
     $_SESSION['password'] = $password; 
     $_SESSION['userlevel'] = $res['userlevel']; 
     $_SESSION['firstname'] = $res['firstname']; 
     $_SESSION['lastname'] = $res['lastname']; 
     $_SESSION['user_image']= $res['user_image']; 
     $_SESSION['email']  = $res['email']; 
     header('Location: users/main.php'); 
} 
else 
{ 
    header("location: index.php"); 
} 
} 
+0

Я получаю такую ​​ошибку -> 'PHP Неустранимая ошибка: вызов функции-члена bindParam() для объекта, не являющегося объектом. –

+0

Я обновил полный блок. должен отлично работать – sking

+0

Да, эта работа отлично. Спасибо! –

1

Вы можете повторить содержание $res? , такие как:

echo "<pre>"; 
print_r($res); 
echo "<pre>"; 

и посмотреть, что результат, может быть, ваш массив не знает значение $res['userlevel'], ваш массив может быть доступен в качестве $res[0]['userlevel'] или что-то в этом роде.

Позвольте мне знать, если он работает

+0

print_r ($ res) ничего не возвращает. Просто пустое место на странице. –

+0

Тогда ваш массив $ res пуст, поэтому он не работает. Сохранен ли пароль в файле sha1 в базе данных? –

+0

Да, это 'sha1' –

1

Вы должны проверить, чтобы увидеть, если у вас есть набор результатов.

if ($res) { 

    foreach($pdo->query($q) as $res) 
    { 
     echo '<a href="users/ras.php?rest_id='. $res['ras_id'] .'">'.$res['name'].'</a>'; 

    } 
    } else { 
    echo '<p>no result</p>'; 
    } 
+0

Да, результата нет ... –

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