2014-12-05 135 views
1

我開始學習PDO,同時這樣做決定重寫我的舊mysql_*代碼。所以我有一個登錄表單,根據用戶級別重定向到不同的位置。這已完成(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執行時,根據用戶級

<?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所以請容忍我的查詢,如果你能幫我。謝謝。

更新 - 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();'必須使用會話的所有文件裏面。 – 2014-12-05 19:11:01

+0

是的,我已經把它放在main.php裏面了。實際上,當我登錄某些用戶時,我可以看到他的用戶名'<?php echo $ _SESSION ['username']; ?>所以會議是工作。但查詢不。 – 2014-12-05 19:13:12

+0

'r2u.user_userlevel'你確定你不是指'r2u.userlevel'?很難說,連接不是我擅長的。在連接打開後立即添加'$ pdo-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);'。 – 2014-12-05 19:16:47

回答

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()' – 2014-12-05 19:40:04

+0

我更新了完整的塊..它.. ..應該完美地工作 – sking 2014-12-05 19:49:22

+0

是的,這工作完美。謝謝! – 2014-12-05 19:51:45

1

你能呼應$res內容? 如:

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

,看看結果是什麼,也許你的陣列不知道的$res['userlevel']的價值,你的陣列也可能被$res[0]['userlevel']或類似的東西訪問。

讓我知道它是否工作

+0

print_r($ res)什麼都不返回。只需在頁面上留空即可。 – 2014-12-05 19:23:06

+0

然後你的$ res數組是空的,這就是爲什麼它不起作用。密碼是否以sha1的形式存儲在數據庫中? – 2014-12-05 19:25:51

+0

是的,它是'sha1' – 2014-12-05 19:28:49

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

是的,沒有結果... – 2014-12-05 19:30:29